Page 3 of 5
com_module_sample
Posted: Sun Apr 24, 2022 7:27 am
by wriedmann
Hallo Franz,
1) Du musst die ComTestFR.dll ins Verzeichnis kopieren, wo die Exe erstellt wird.
2) die Klasse IComTester habe ich einfach vergessen zu entfernen, dasselbe gilt fürs Manifest.
Wolfgang
com_module_sample
Posted: Sun Apr 24, 2022 7:39 am
by lagraf
Das habe ich auch gemacht, alles 1:1 hinein entpackt, sogar den gleichen Ordner c:tempcomtest verwendet, damit ich nichts verändern muß! Trotzdem startet die App nicht.
- Bild1.jpg (101.1 KiB) Viewed 554 times
com_module_sample
Posted: Sun Apr 24, 2022 8:05 am
by wriedmann
Hallo Franz,
sorry, da gehört aus dem Manifest der Exe der Verweis auf die ComTestF.DLL raus:
Code: Select all
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="VO.Application"
type="win32"
/>
<description>Visual Objects Application.</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="COMTestFR"
version="1.0.0.0"
publicKeyToken="0359fa75d6c66754"
>
</assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>
Mit Nachschauen im EventViewer hättest Du das auch alleine rausfinden können, oder mit der angeführten sxslog.cmd:
Code: Select all
sxstrace Trace -logfile:systrace.out
sxstrace Parse -logfile:systrace.out -outfile:sxstrace.txt
notepad sxstrace.txt
Die ist bei Problemen mit SideBySide immer der erste Schritt.
Nach dem Ändern des Manifests (ComTestFApp.man) und folgendem kompletten Recompilieren der Applikation ( Application - Rebuild all ) funktioniert es auch in einem separaten Verzeichnis:
- ComTestFR.png (15.64 KiB) Viewed 554 times
in dem nur Exe und Dll sind.
Das ist ja das eigentliche Coole an SideBySide, dass es keine Pfadabhängigkeiten gibt, sondern alles aus dem Applikations-Verzeichins geladen wird.
Wolfgang
com_module_sample
Posted: Sun Apr 24, 2022 9:34 am
by lagraf
Hallo Wolfgang,
- den Block für ComTestF habe ich aus dem Manifest entfernt
- den Block für IComTester habe ich aus der VO App entfernt
- hab auch die X# DLL neu generiert
Neu generieren der VO App hat nichts geholfen, erst beim Rebuild All ist die App dann gestartet!
Finden die Änderungen auch Einzug in das Beispiel bei der XSharp Doku?
Jedenfalls Danke für deine Hilfe!
Frage: Wenn ich nun weitere Methoden der COM Dll hinzufüge, genügt dann ein compilieren der Dll oder muß woanders auch noch was geändert werden?
PS: sxstrace kannte ich bisher noch gar nicht, hab ich ausprobiert, bringt aber einen "Unbekannten Fehler" beim Befehl "sxstrace Trace -logfile:systrace.out". Welche sxslog.cmd, hab ich da was überlesen?
com_module_sample
Posted: Sun Apr 24, 2022 9:47 am
by wriedmann
Hallo Franz.,
wenn Du nur die Applikation neu generierst, kompiliert VO die Ressourcen nicht neu, daher steht in der Applikation auch noch das alte Manifest drin.
Das ist mir nicht aufgefallen, weil ich die ComTestF.dll auch noch in meinem Verzeichnis drin hatte.
Die Doku werde ich auf jeden Fall anpassen.
Leider ist Windows bei SxS sehr heikel, aber wenn das mal läuft, dann läuft das sehr stabil. Mittlerweile hat fast jede meiner VO-Applikationen mindestens eine X# COM-DLL dabei, weil es gar nicht mehr anders geht.
Wolfgang
com_module_sample
Posted: Mon May 16, 2022 10:02 am
by lagraf
Hallo Wolfgang,
ich habe meine X# DLL inzwischen fertig und auch mit einer von VO auf X# umgestellten Kassenapp ausgetestet. Wenn ich jetzt eine com enabled DLL daraus mache, um auch mit VO drauf zugreifen zu können, kann ich dann mit X# auch noch direkt (ohne Umweg über COM) auf die Methoden zugreifen oder brauche ich für X# und VO jeweils eine eigene DLL?
com_module_sample
Posted: Mon May 16, 2022 10:06 am
by wriedmann
Hallo Franz,
klar kannst Du dafür eine einzige DLL verwenden - mache ich selber auch mehrfach, und gerade in einer Umstellungsfase auf X# wird das sogar sehr wichtig.
Wolfgang
com_module_sample
Posted: Mon May 16, 2022 1:16 pm
by lagraf
Hallo Wolfgang,
meine DLL ist etwas komplexer als das com_module_sample. Ich habe eine Hauptklasse mit 11 public Methoden, die von VO angesprochen werden sollen. Ausserdem mehrere andere Klassen mit 69 Methoden, die von der Hauptklasse verwendet werden, aber nicht von VO direkt. Der Programmteil ist wie folgt aufgebaut:
Code: Select all
USING System.Runtime.InteropServices
...
BEGIN NAMESPACE RKSVComComplete
[ComVisible(TRUE)];
[Guid("***Guid1***")];
[ClassInterface(ClassInterfaceType.None)];
[ProgId("RKSVComComplete.RKSVCom")];
PUBLIC CLASS RKSVCom IMPLEMENTS IRKSVCom
PUBLIC METHOD GetReadersCount() AS LONG
PUBLIC METHOD GetCardReaders() AS STRING[]
...
END CLASS
PUBLIC CLASS xyz
PUBLIC METHOD abc
PUBLIC METHOD def
...
END CLASS
...
END NAMESPACE
Der Interfaceteil:
Code: Select all
USING System.Runtime.InteropServices
BEGIN NAMESPACE RKSVComComplete
[ComVisible(TRUE)];
[Guid(""***Guid2***)];
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)];
INTERFACE IRKSVCom
[DispId(1)];
PUBLIC METHOD GetReadersCount() AS LONG
[DispId(2)];
PUBLIC METHOD GetCardReaders() AS STRING[]
...
END INTERFACE
END NAMESPACE
Für die internen Klassen und Methoden habe ich keine Einträge im Interface angelegt.
Bis vor den Punkt Manifest erstellen funktioniert alles.
Beim Erstellen des Manifestes bekomme ich jede Menge Warnings für alle internen Klassen, die nicht von VO direkt genutzt werden:
G81010014: Explicit guid not defined
Im Manifest scheinen auch alle internen Klassen auf mit unbekannten Guids. Müssen diese Einträge entfernt werden? Habe ich etwas falsch definiert?
com_module_sample
Posted: Mon May 16, 2022 1:57 pm
by robert
Franz,
If you add
[ComVisible(FALSE)];
to the classes that you do not want to be included in the COM DLL then it should work.
Also make sure that you do not have public properties or methods in the classes that you are making visible through that use these types as parameter or return value.
Robert
com_module_sample
Posted: Mon May 16, 2022 3:45 pm
by lagraf
Hi Robert,
as you said
- I prefixed all non visible classes with [ComVisible(FALSE)];
- I deleted PUBLIC at all visible methods
For testing purposes I have a small X# app which calls these methods directly without COM to see if my DLL works. Using my DLL without COM stuff it does well, but since I added COM stuff I get exceptions with following message for 3 extern libs (Gma.QrCodeNet.Encoiding.dll, jose-jwt.dll and pcsc.sharp.dll) which I use in my DLL:
Code: Select all
System.IO.FileLoadException: Could not load file or assembly 'pcsc-sharp, Version=3.2.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. A strongly-named assembly is required. (Exception from HRESULT: 0x80131044) File name: 'pcsc-sharp, Version=3.2.0.0, Culture=neutral, PublicKeyToken=null' at RKSV.Light.APDU.APDUMaster.GetReaders(String[]& readers)
at RKSVComCompleteX.RKSVCom.GetReadersReturned() in
C:XIDEProjectsTESTApplicationsRKSVComCompleteXPrgRKSVComComplete.prg:line 332
What I have to do enabling COM when I use foreign DLLs in my DLL?