activeX / DotNet DLL für Xbase++

Nutzung, Komponenten, .NET

Moderator: Moderatoren

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%
 
Abstimmungen insgesamt : 9

activeX / DotNet DLL für Xbase++

Beitragvon AUGE_OHR » Mi, 06. Jul 2016 18:48

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
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10315
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

Re: activeX / DotNet

Beitragvon Jan » Mi, 06. Jul 2016 19:27

Woran? ActiveX und .Net gehen ja jetzt schon.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
 
Beiträge: 11892
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle

Re: activeX / DotNet

Beitragvon AUGE_OHR » Mi, 06. Jul 2016 22:07

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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10315
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

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

Beitragvon Benz » Mi, 20. Jul 2016 12:28

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?
Benz
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 413
Registriert: Mo, 30. Mai 2011 15:06

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

Beitragvon AUGE_OHR » Do, 21. Jul 2016 4:46

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) 2788-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) 2788-mal betrachtet
die Verknüpfung zur CLSID/ProgID findet man dann hier im Beispiel
DLL_CLSID.jpg
DLL_CLSID.jpg (65.44 KiB) 2788-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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10315
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

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

Beitragvon Benz » Di, 11. Okt 2016 16:05

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) 2393-mal betrachtet
test.PNG
test.PNG (9.7 KiB) 2393-mal betrachtet
Benz
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 413
Registriert: Mo, 30. Mai 2011 15:06

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

Beitragvon AUGE_OHR » Di, 11. Okt 2016 18:07

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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10315
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

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

Beitragvon Benz » Mi, 12. Okt 2016 7:38

Du meinst wenn ich nach {16A9F43B-39FA-39FF-A8B0-8E8DAFE29125} suche,
clsid1.PNG
clsid1.PNG (53.14 KiB) 2359-mal betrachtet
und dann auf das stoße:
clsid2.PNG
clsid2.PNG (69.44 KiB) 2359-mal betrachtet
?
Das ist doch dasselbe oder meinst du etwas anderes?
Benz
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 413
Registriert: Mo, 30. Mai 2011 15:06

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

Beitragvon Koverhage » Mi, 12. Okt 2016 7:41

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

o = CREATEOBJECT("xInteropExample.ExampleClass")
in

o := CREATEOBJECT("xInteropExample.ExampleClass")
Gruß
Klaus
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1908
Registriert: Fr, 23. Dez 2005 9:00
Wohnort: Aalen

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

Beitragvon Benz » Mi, 12. Okt 2016 8:11

VALTYPE ist U also NIL und := hat auch nicht geholfen leider :?
Benz
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 413
Registriert: Mo, 30. Mai 2011 15:06

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

Beitragvon brandelh » Mi, 12. Okt 2016 8:13

= 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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13497
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

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

Beitragvon AUGE_OHR » Mi, 12. Okt 2016 8:26

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
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10315
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

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

Beitragvon Koverhage » Mi, 12. Okt 2016 8:46

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
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1908
Registriert: Fr, 23. Dez 2005 9:00
Wohnort: Aalen

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

Beitragvon brandelh » Mi, 12. Okt 2016 9:05

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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13497
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

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

Beitragvon Benz » Mi, 12. Okt 2016 9:47

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) 2337-mal betrachtet


Dann habe ich noch den Haken wie von dir beschrieben gesetzt:
2.PNG
2.PNG (6.41 KiB) 2337-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) 2337-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
Benz
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 413
Registriert: Mo, 30. Mai 2011 15:06

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

Beitragvon brandelh » Mi, 12. Okt 2016 10:32

nach dem Fehler - denke ich - hast du nicht erstellen sondern debuggen oder ausführen geklickt
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13497
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

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

Beitragvon AUGE_OHR » Mi, 12. Okt 2016 14:26

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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10315
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

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

Beitragvon Benz » Mi, 12. Okt 2016 16:14

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?
Benz
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 413
Registriert: Mo, 30. Mai 2011 15:06

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

Beitragvon AUGE_OHR » Do, 13. Okt 2016 21:13

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) 2255-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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10315
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg


Zurück zu ActiveX

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast