activeX / DotNet DLL für Xbase++
Moderator: Moderatoren
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
activeX / DotNet DLL für Xbase++
hi,
wer ist daran interessiert ?
Nachtrag : Titel erweitert
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
Jimmy
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: activeX / DotNet
Woran? ActiveX und .Net gehen ja jetzt schon.
Jan
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: activeX / DotNet
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
Jimmy
-
- Rekursionen-Architekt
- Beiträge: 440
- Registriert: Mo, 30. Mai 2011 15:06
- Danksagung erhalten: 1 Mal
Re: activeX / DotNet DLL für Xbase++
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?
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?
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: activeX / DotNet DLL für Xbase++
wenn du XbpToolbar() benutzen willst muss MSCOMCTL.OCX registriert sein damit du darauf zugreifen kannst.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?
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. 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
Code: Alles auswählen
RegAsm "X:\Sample\Examples.dll" /codebase
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
Jimmy
-
- Rekursionen-Architekt
- Beiträge: 440
- Registriert: Mo, 30. Mai 2011 15:06
- Danksagung erhalten: 1 Mal
Re: activeX / DotNet DLL für Xbase++
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:
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?
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
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 (11.56 KiB) 17024 mal betrachtet
-
- test.PNG (9.7 KiB) 17024 mal betrachtet
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: activeX / DotNet DLL für Xbase++
hi,
das die DotNet DLL registriert wurde zeigt dein Bild aber was ist mit der CLSID und deinem CREATEOBJECT("xInteropExample.ExampleClass"), stimmen die überein ?
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
Jimmy
-
- Rekursionen-Architekt
- Beiträge: 440
- Registriert: Mo, 30. Mai 2011 15:06
- Danksagung erhalten: 1 Mal
Re: activeX / DotNet DLL für Xbase++
Du meinst wenn ich nach {16A9F43B-39FA-39FF-A8B0-8E8DAFE29125} suche,
Das ist doch dasselbe oder meinst du etwas anderes?
und dann auf das stoße: ? Das ist doch dasselbe oder meinst du etwas anderes?
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2471
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: activeX / DotNet DLL für Xbase++
Mach eine Abfrage mit ValType auf o
Dann würde ich
o = CREATEOBJECT("xInteropExample.ExampleClass")
in
o := CREATEOBJECT("xInteropExample.ExampleClass")
Dann würde ich
o = CREATEOBJECT("xInteropExample.ExampleClass")
in
o := CREATEOBJECT("xInteropExample.ExampleClass")
Gruß
Klaus
Klaus
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: activeX / DotNet DLL für Xbase++
= 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)
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
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: activeX / DotNet DLL für Xbase++
... Ja ... es scheint die selbe ...Benz hat geschrieben:Du meinst wenn ich nach {16A9F43B-39FA-39FF-A8B0-8E8DAFE29125} suche,
...
Das ist doch dasselbe oder meinst du etwas anderes?
... vielleicht mal dem Ausgabe Path ändern ... als Administrator VS2015 starten.
p.s. woher hast du dein Sample ?
gruss by OHR
Jimmy
Jimmy
- Koverhage
- Der Entwickler von "Deep Thought"
- Beiträge: 2471
- Registriert: Fr, 23. Dez 2005 8:00
- Wohnort: Aalen
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: activeX / DotNet DLL für Xbase++
Hubert,
Habe das schon anders erlebt, deshalb mache ich es sicherheitshalber und zur besseren Lesbarkeit= und := sind hier gleichwertig, es dient nur der besseren Lesbarkeit.
Gruß
Klaus
Klaus
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: activeX / DotNet DLL für Xbase++
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.
"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
Hubert
-
- Rekursionen-Architekt
- Beiträge: 440
- Registriert: Mo, 30. Mai 2011 15:06
- Danksagung erhalten: 1 Mal
Re: activeX / DotNet DLL für Xbase++
Das Sample hab ich selbst erstellt, es ist eigentlich nicht mehr als eine Klasse mit einer Methode, die einen Text zurückgibt.AUGE_OHR hat geschrieben:... Ja ... es scheint die selbe ...Benz hat geschrieben:Du meinst wenn ich nach {16A9F43B-39FA-39FF-A8B0-8E8DAFE29125} suche,
...
Das ist doch dasselbe oder meinst du etwas anderes?
... vielleicht mal dem Ausgabe Path ändern ... als Administrator VS2015 starten.
p.s. woher hast du dein Sample ?
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";
}
}
}
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
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: activeX / DotNet DLL für Xbase++
nach dem Fehler - denke ich - hast du nicht erstellen sondern debuggen oder ausführen geklickt
Gruß
Hubert
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: activeX / DotNet DLL für Xbase++
hast du die Syntax Prüfung an ?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"; } } }
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;
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
Jimmy
-
- Rekursionen-Architekt
- Beiträge: 440
- Registriert: Mo, 30. Mai 2011 15:06
- Danksagung erhalten: 1 Mal
Re: activeX / DotNet DLL für Xbase++
oh mann, jetzt wirds kompliziert kannst du mir vielleicht ein kleines Beispiel geben wie das aussehen könnte?
du meinst als Projekt? Da habe ich Klassenbibliothek gewählt. Wo wähle ich denn COM DLL Active X aus?hast du wirklich COM DLL ActiveX gewählt ? das sollte dann schon automatisch eingefügt sein.
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: activeX / DotNet DLL für Xbase++
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.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 DLLmit "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
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. mehr bei Pablo in der Newsgroup
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
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 )
---
@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
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
nutzt die iDispatch Schnittstelle. die [DispId(xxx)] Einträge legen nun die "Zuordnung" zu den Methoden fest.Publishing COM Events
public.xbase++.activex
20. Januar 2008
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. mehr bei Pablo in der Newsgroup
sowieProgress state in Taskbar Icon
ot4xb.public
3. März 2016
---@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
Jimmy