Seite 1 von 1

activeX / DotNet DLL für Xbase++

Verfasst: Mi, 06. Jul 2016 18:48
von AUGE_OHR
hi,

wer ist daran interessiert ?

Nachtrag : Titel erweitert

Re: activeX / DotNet

Verfasst: Mi, 06. Jul 2016 19:27
von Jan
Woran? ActiveX und .Net gehen ja jetzt schon.

Jan

Re: activeX / DotNet

Verfasst: Mi, 06. Jul 2016 22:07
von AUGE_OHR
ich meine "ActiveX DotNet DLL" also kein OCX sondern die Möglich kein z.b. mit VS2015 "free" DLL zu erstellen die man mit Xbase++ (oder anderen Sprachen) als ActiveX nutzen kann.

Re: activeX / DotNet DLL für Xbase++

Verfasst: Mi, 20. Jul 2016 12:28
von Benz
Ist das noch aktuell? würde mich nämlich brennend interessieren!
Ich habe einige Anwendungen bei denen ich mit Xbase++ an meine Grenzen stoße, für die es aber in C# bereits Lösungen gibt, die ganz einfach zu verwenden sind.
Gibt es da eine Möglichkeit ? Ich habe nämlcih schon einiges probiert und habs einfach nicht hinbekommen eine Klassenbibliothek (DLL) aus Visual Studio 2015 in Xbase++ einzubinden.
Jetzt versuche ich gerade den umgekehrten Weg, aber das funktioniert auch nicht so richtig oder mache ich schlichtweg etwas falsch?
Hat das schonmal jemand versucht und hinbekommen?

Ich habe auch schon gelesen, dass es gehen soll, wenn man die DLL als COM-Objekt registriert, die von C# kommt, damit man sie in Xbase++ nutzen kann, aber das habe ich auch nicht hinbekommen, warum auch immer.
Wenn ich mir aber zum Beispiel irgendwelche COM-Objekte anschaue z.B. von Excel dann kann ich das ja auch problemlos mit Xbase++ benutzen. Oder ist das eine andere Technik als DLL?

Re: activeX / DotNet DLL für Xbase++

Verfasst: Do, 21. Jul 2016 4:46
von AUGE_OHR
Benz hat geschrieben:chon gelesen, dass es gehen soll, wenn man die DLL als COM-Objekt registriert, die von C# kommt, damit man sie in Xbase++ nutzen kann, aber das habe ich auch nicht hinbekommen, warum auch immer.
Wenn ich mir aber zum Beispiel irgendwelche COM-Objekte anschaue z.B. von Excel dann kann ich das ja auch problemlos mit Xbase++ benutzen. Oder ist das eine andere Technik als DLL?
wenn du XbpToolbar() benutzen willst muss MSCOMCTL.OCX registriert sein damit du darauf zugreifen kannst.

auf DotNet DLL kann man aus Xbase++ "so" nicht zugreifen. auf Xbase++ DLL kann IMHO keine andere Sprache zugreifen.

man kann aber eine DotNet DLL als COM registrieren. hierzu muss man im Project unter Eigenschaften die Checkbox setzten.
DLL_as_COM.JPG
DLL_as_COM.JPG (88.19 KiB) 16481 mal betrachtet
wenn man nun das Project erstellt bekommt man wahrscheinlich eine Fehlermeldung bei der Registrierung : VS2016 als Administrator starten

wenn man die DotNet DLL beim Kunden registrieren will nimmt man REGASM.EXE

Code: Alles auswählen

C:\Windows\Microsoft.NET\Framework\VERSION***\RegAsm.exe 
***höchste 32bit Version

Code: Alles auswählen

RegAsm "X:\Sample\Examples.dll" /codebase
damit erfolgt solch ein Eintrag in der Registry
DLL_RegASM.jpg
DLL_RegASM.jpg (108.91 KiB) 16481 mal betrachtet
die Verknüpfung zur CLSID/ProgID findet man dann hier im Beispiel
DLL_CLSID.jpg
DLL_CLSID.jpg (65.44 KiB) 16481 mal betrachtet

Code: Alles auswählen

#pragma library( "ascom10.lib" )

PROCEDURE MAIN
LOCAL o

o = CREATEOBJECT("InteropExamples.Examples")
? o:HelloWorld("from Dotnet to Xbase++")
? o:Add(10,20)
WAIT
RETURN

Re: activeX / DotNet DLL für Xbase++

Verfasst: Di, 11. Okt 2016 16:05
von Benz
Ich hab das jetzt mal versucht nachzustellen und bis zur Registrierung der DLL klappt alles wunderbar. Ich finde sie auch in der Registry (siehe test.png im Anhang).
Aber aus irgendeinem Grund kann ich sie mit Xbase++ nicht aufrufen:

Code: Alles auswählen

#pragma library( "ascom10.lib" )

PROCEDURE MAIN
LOCAL o
LOCAL xSumme

o = CREATEOBJECT("xInteropExample.ExampleClass")

IF !empty(o)
   ? o
ELSE
   ? "o ist empty"
ENDIF

? o:ExampleMethode()

WAIT
RETURN
Fehlermeldung im Anhang unter Fehlermeldung.png

So wie es aussieht wird das COM Objekt gar nicht erst in o gespeichert, da der else Teil ausgegeben wird.
Irgendeine Idee woran das liegen könnte?

Re: activeX / DotNet DLL für Xbase++

Verfasst: Di, 11. Okt 2016 18:07
von AUGE_OHR
hi,

das die DotNet DLL registriert wurde zeigt dein Bild aber was ist mit der CLSID und deinem CREATEOBJECT("xInteropExample.ExampleClass"), stimmen die überein ?

Re: activeX / DotNet DLL für Xbase++

Verfasst: Mi, 12. Okt 2016 7:38
von Benz
Du meinst wenn ich nach {16A9F43B-39FA-39FF-A8B0-8E8DAFE29125} suche,
clsid1.PNG
clsid1.PNG (53.14 KiB) 16052 mal betrachtet
und dann auf das stoße:
clsid2.PNG
clsid2.PNG (69.44 KiB) 16052 mal betrachtet
?
Das ist doch dasselbe oder meinst du etwas anderes?

Re: activeX / DotNet DLL für Xbase++

Verfasst: Mi, 12. Okt 2016 7:41
von Koverhage
Mach eine Abfrage mit ValType auf o
Dann würde ich

o = CREATEOBJECT("xInteropExample.ExampleClass")
in

o := CREATEOBJECT("xInteropExample.ExampleClass")

Re: activeX / DotNet DLL für Xbase++

Verfasst: Mi, 12. Okt 2016 8:11
von Benz
VALTYPE ist U also NIL und := hat auch nicht geholfen leider :?

Re: activeX / DotNet DLL für Xbase++

Verfasst: Mi, 12. Okt 2016 8:13
von brandelh
= und := sind hier gleichwertig, es dient nur der besseren Lesbarkeit.

Dass das O = NIL ist, zeigt, dass die Verbindung nicht zustande kommt (es wird kein Objekt erzeugt).

War da nicht was mit der Methode des Zugriffs dispatch und das andere und wir können nur mit den einen umgehen ? (sorry ich nutze normal nur alte API DLL)

Re: activeX / DotNet DLL für Xbase++

Verfasst: Mi, 12. Okt 2016 8:26
von AUGE_OHR
Benz hat geschrieben:Du meinst wenn ich nach {16A9F43B-39FA-39FF-A8B0-8E8DAFE29125} suche,
...
Das ist doch dasselbe oder meinst du etwas anderes?
:-k ... Ja ... es scheint die selbe ...
:-k ... vielleicht mal dem Ausgabe Path ändern ... als Administrator VS2015 starten.

p.s. woher hast du dein Sample ?

Re: activeX / DotNet DLL für Xbase++

Verfasst: Mi, 12. Okt 2016 8:46
von Koverhage
Hubert,
= und := sind hier gleichwertig, es dient nur der besseren Lesbarkeit.
Habe das schon anders erlebt, deshalb mache ich es sicherheitshalber und zur besseren Lesbarkeit ;-)

Re: activeX / DotNet DLL für Xbase++

Verfasst: Mi, 12. Okt 2016 9:05
von brandelh
Eine ganz andere Idee, schaut mal oben bei JIMMY (Do, 21. Jul 2016 4:46) auf die Seite mit den Einstellungen:

"Unsicheren Code zulassen"

muss man das nicht erlauben wenn man mit Xbase++ ActiveX auf eine .NET DLL zugreifen will ?
Ich meine "sicherer Code" wäre nur managed .NET code.

Re: activeX / DotNet DLL für Xbase++

Verfasst: Mi, 12. Okt 2016 9:47
von Benz
AUGE_OHR hat geschrieben:
Benz hat geschrieben:Du meinst wenn ich nach {16A9F43B-39FA-39FF-A8B0-8E8DAFE29125} suche,
...
Das ist doch dasselbe oder meinst du etwas anderes?
:-k ... Ja ... es scheint die selbe ...
:-k ... vielleicht mal dem Ausgabe Path ändern ... als Administrator VS2015 starten.

p.s. woher hast du dein Sample ?
Das Sample hab ich selbst erstellt, es ist eigentlich nicht mehr als eine Klasse mit einer Methode, die einen Text zurückgibt.

Code: Alles auswählen

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace xInteropExample
{
    public class ExampleClass
    {
        public string ExampleMethode()
        {
            return "pihjpih";
        }
    }
}
Ich habe in der assemblyInfo.cs noch das folgende geändert (habe das von false auf true gesetzt).
1.PNG
1.PNG (8.33 KiB) 16041 mal betrachtet
Dann habe ich noch den Haken wie von dir beschrieben gesetzt:
2.PNG
2.PNG (6.41 KiB) 16041 mal betrachtet
Dann habe ich die DLL erstellt, das hat erst einmal eine Fehlermeldung produziert. Die kann ich aber jetzt nicht mehr reproduzieren, weil ich jetzt, wenn ich auf "Starten" in Visual Studio drücke diese Fehlermeldung bekomme:
3.PNG
3.PNG (8.87 KiB) 16041 mal betrachtet
heißt ich kann jetzt die DLL gar nicht mehr erstellen?!

naja gestern hat mir das jedenfalls diese beiden Dateien erzeugt:
- xInteropExample.dll
- xInteropExample.pdb

Diese habe ich dann in C:\Windows\System32 kopiert und dann mit regasm registriert:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm xInteropExample.dll /codebase

Re: activeX / DotNet DLL für Xbase++

Verfasst: Mi, 12. Okt 2016 10:32
von brandelh
nach dem Fehler - denke ich - hast du nicht erstellen sondern debuggen oder ausführen geklickt

Re: activeX / DotNet DLL für Xbase++

Verfasst: Mi, 12. Okt 2016 14:26
von AUGE_OHR
Benz hat geschrieben:Das Sample hab ich selbst erstellt, es ist eigentlich nicht mehr als eine Klasse mit einer Methode, die einen Text zurückgibt.

Code: Alles auswählen

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace xInteropExample
{
    public class ExampleClass
    {
        public string ExampleMethode()
        {
            return "pihjpih";
        }
    }
}
hast du die Syntax Prüfung an ?
alles was "grau" ist wird nicht benötigt.

was du aber für ActiveX benötigst ist "InteropServices" denn sonst wird ActiveX gar nicht eingebunden.

Code: Alles auswählen

using System.Runtime.InteropServices;
hast du wirklich COM DLL ActiveX gewählt ? das sollte dann schon automatisch eingefügt sein.

das nächste wäre die Definition der Schnittstelle für Xbase++, ich sehe weder eine GUID ( rechte Maustaste -> GUID generieren ) oder InterfaceType für Xbase++ ( IDispatch ). auch musst du jeder Method eine Nummer für das IDispatch Interface "DispID(xxx)" geben wobei xxx -> Reihenfolge der Methoden im Source ist.

auch wenn es nur ein Demo sein soll ist die Frage wann man eine DotNet COM DLL verwendet.
es macht IMHO z.b. keinen Sinn "jeden einzelne" GDI+ Methode über IDispatch anzusprechen ... das dauert (unter Xbase++) einfach zu lange. anders wäre es z.b. wenn man ein Array mit Daten von Xbase++ übergibt und das gesamte Array von GDI+ Rendern lässt was in einen eigenen Fenster (Form) laufen.

wenn es nun "bidirektional" werden soll kommen die Events ins Spiel ... die brauchen einen Parent (Form) an welche die Events gesendet werden ( Xbase++ "sieht" die nicht ) ... aber das ist noch ein anderes Thema.

Re: activeX / DotNet DLL für Xbase++

Verfasst: Mi, 12. Okt 2016 16:14
von Benz
oh mann, jetzt wirds kompliziert :D kannst du mir vielleicht ein kleines Beispiel geben wie das aussehen könnte?
hast du wirklich COM DLL ActiveX gewählt ? das sollte dann schon automatisch eingefügt sein.
du meinst als Projekt? Da habe ich Klassenbibliothek gewählt. Wo wähle ich denn COM DLL Active X aus?

Re: activeX / DotNet DLL für Xbase++

Verfasst: Do, 13. Okt 2016 21:13
von AUGE_OHR
hi

ich habe diesen Thread angelegt weil ich sehen wollte "ob" Interesse besteht.

nun ist der Thread zwar schon öfter angeklickt worden aber nur wenige haben abgestimmt.
wenn es genügen Interessenten (Abstimmung) gibt "könnte" man eine Session für das nächste Usertreffen planen.

---

gegenüber meinen "native" Controls ( DXE Lib ) wo ich (inzwischen) "weiss" was ich mache ist es mir bei DotNet oft nicht klar.
den Weg, den ich gefunden habe, muss nicht der richtige sein ... aber ich komme ans Ziel.

Pablo, der nicht VS ( *.CS) sondern "nur" C# (*.CPP) verwendet, geht z.b. einen völlig anderen Weg.

Code: Alles auswählen

extern "C" void __declspec( dllexport ) __cdecl OpenMyForm( void )
also als C-DLL über die Alaska Schnittstelle und nicht als ActiveX

---

@Hubert : "Unsicheren Code zulassen"

das hat IMHO was mit "Strong Name" zu tun ... grob gesagt : kein doppelter DLL Name

---

@Benz : das sind die ersten Zeile die man IMHO haben "muss" für eine DotNet COM DLL

Code: Alles auswählen

using System;
using System.Runtime.InteropServices;             // MUSS
namespace InteropExamples                         // Name beliebig
{
   [ComVisible(true)]                             // MUSS
   [ClassInterface(ClassInterfaceType.AutoDual)]  // MUSS. AutoDual enthält auch iDispatch
   [ProgId("InteropExamples.Examples")]           // MUSS, Name beliebig   

   public class Examples                          // hier geht es los, Name beliebig 
mit "ProgId" wird die GUID, welche für jedes Project angelegt wird, wohl automatisch verknüpft. (vermutlich im Project File)
ich habe nun immer eine eigene generiert ( rechte Maustaste ) um die zu "kennen" damit ich in der Registry suchen kann.

---

das Beispiel von Roger, welche auf Events reagiert
Publishing COM Events
public.xbase++.activex
20. Januar 2008
nutzt die iDispatch Schnittstelle. die [DispId(xxx)] Einträge legen nun die "Zuordnung" zu den Methoden fest.
grob gesagt : wenn der User den "Namen" angibt weiss die Class welche "Nummer" gemeint ist.

Anmerkung : bei Events "muss" es einen Parent geben an den die Events gehen -> System.Windows.Forms

---

das ganze dient nun dazu beim (grünen) ProgressBar, wenn er läuft, auch die Bewegung im Icon in der TaskBarList anzuzeigen.
mein Problem war das benötigte iTaskList3, wo es die Methoden gibt, über die iUNKNOWN Schnittstelle von iTaskList geht.

die Beispiele die ich im Internet gefunden habe ging fast alle auf DotNet, deshalb habe ich mich damit beschäftigt.

nun hat mir Pablo gezeigt, mit IFpQCall(), wie man mit Xbase++ auch die iUNKNOWN Schnittstelle nutzen kann ... ähnlich iDispatch.
grob gesagt geht es auch dort um die Reihenfolge der Methoden "im Source". Es gibt keine "Namen" sondern nur Pointer.
iTaskBarList_Progress.jpg
iTaskBarList_Progress.jpg (2.64 KiB) 15959 mal betrachtet
mehr bei Pablo in der Newsgroup
Progress state in Taskbar Icon
ot4xb.public
3. März 2016
sowie
@ole32:CoCreateInstance()
ot4xb.public
5. September 2016
---

aufgrund meiner geringen C# / DotNet Kenntnisse kann ich euch bei solchen Problem wenig helfen.
wer Informationen über DotNet benötigt sollte sich an ein entsprechendes DotNet Forum wenden, sorry