activeX / DotNet DLL für Xbase++

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Antworten

activeX / DotNet

interessiert mich
6
67%
interessiert mich NICHT
1
11%
habe eine 3-PP LIB
0
Keine Stimmen
habe eine eigene Lösung
0
Keine Stimmen
ich weiss nicht was das ist
2
22%
 
Insgesamt abgegebene Stimmen: 9

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

activeX / DotNet DLL für Xbase++

Beitrag von AUGE_OHR »

hi,

wer ist daran interessiert ?

Nachtrag : Titel erweitert
Zuletzt geändert von AUGE_OHR am Mi, 06. Jul 2016 22:08, insgesamt 1-mal geändert.
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: activeX / DotNet

Beitrag von Jan »

Woran? ActiveX und .Net gehen ja jetzt schon.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: activeX / DotNet

Beitrag 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.
gruss by OHR
Jimmy
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

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

Beitrag 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?
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

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

Beitrag 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) 16482 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) 16482 mal betrachtet
die Verknüpfung zur CLSID/ProgID findet man dann hier im Beispiel
DLL_CLSID.jpg
DLL_CLSID.jpg (65.44 KiB) 16482 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
gruss by OHR
Jimmy
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

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

Beitrag 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?
Dateianhänge
fehlermeldung.png
fehlermeldung.png (11.56 KiB) 16087 mal betrachtet
test.PNG
test.PNG (9.7 KiB) 16087 mal betrachtet
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

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

Beitrag 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 ?
gruss by OHR
Jimmy
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

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

Beitrag von Benz »

Du meinst wenn ich nach {16A9F43B-39FA-39FF-A8B0-8E8DAFE29125} suche,
clsid1.PNG
clsid1.PNG (53.14 KiB) 16053 mal betrachtet
und dann auf das stoße:
clsid2.PNG
clsid2.PNG (69.44 KiB) 16053 mal betrachtet
?
Das ist doch dasselbe oder meinst du etwas anderes?
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

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

Beitrag von Koverhage »

Mach eine Abfrage mit ValType auf o
Dann würde ich

o = CREATEOBJECT("xInteropExample.ExampleClass")
in

o := CREATEOBJECT("xInteropExample.ExampleClass")
Gruß
Klaus
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

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

Beitrag von Benz »

VALTYPE ist U also NIL und := hat auch nicht geholfen leider :?
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag 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)
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

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

Beitrag 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 ?
gruss by OHR
Jimmy
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

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

Beitrag 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 ;-)
Gruß
Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag 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.
Gruß
Hubert
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

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

Beitrag 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) 16042 mal betrachtet
Dann habe ich noch den Haken wie von dir beschrieben gesetzt:
2.PNG
2.PNG (6.41 KiB) 16042 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) 16042 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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag von brandelh »

nach dem Fehler - denke ich - hast du nicht erstellen sondern debuggen oder ausführen geklickt
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

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

Beitrag 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.
gruss by OHR
Jimmy
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

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

Beitrag 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?
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

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

Beitrag 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) 15960 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
gruss by OHR
Jimmy
Antworten