xsharp.eu • com_module_sample
Page 1 of 5

com_module_sample

Posted: Thu Apr 07, 2022 9:19 am
by lagraf
Hallo Leute,
ich bin zwar bereits in Rente, möchte meine bestehenden VO Programme draussen aber weiterhin betreuen. Diese setzen eine C# Dll ein, welche nicht mehr betreut wird, da es die Firma nicht mehr gibt. Deshalb möchte ich als ersten Schritt diese C# Dll durch eine eigene X# Dll ersetzen, dazu sind folgende Maßnahmen und Programmteile für diese Dll erforderlich:
  • QRCode erstellen und als File speichern: erledigt
  • Zugriff auf USB Smartcard und Verschlüsselung der Daten über diese: offen
  • Erstellung eines X# Com Modules für die Einbindung in VO: in Arbeit
Sollte irgendwann VO nicht mehr auf einer neuen Win Version laufen, müßte ich die Programme auf X# umstellen, was aber aufgrund einer erfolgten Testumstellung des umfangreichsten Programms kein Problem sein sollte. Die X# Dll kann dann weiters verwendet werden, ev. sogar abgespeckt, da ja dann direkt drauf zugegriffen werden kann.

Ich habe mich deshalb mit dem com_module_sample in der X# Doku beschäftigt, habe eine COMTest Dll in der XIDE erstellt mit dem Interface und dem Programmcode. Ausserdem habe ich eine GUID erstellt.

Nun bin ich beim Schritt mit SN.EXE angelangt:
  • Wie bekomme ich sn.exe wenn ich Visual Studio nicht habe, im .NET 4.8 scheint es das Prog nicht zu geben?
  • Läuft sn.exe überhaupt noch auf meinem Win7 32bit Rechner?

com_module_sample

Posted: Thu Apr 07, 2022 9:28 am
by wriedmann
Hallo Franz,
sn.exe sollte Teil von Visual Studio oder der Entwicklerversion des .NET Frameworks sein.
Wenn Du mir sagst, wie dieses Modul heißen soll, kann ich Dir das erstellen und schicken - halt erst am Abend.
Wolfgang

com_module_sample

Posted: Thu Apr 07, 2022 10:39 am
by lagraf
Danke für dein Angebot, ich würde das aber eigentlich gerne selber ausprobieren, weiß ja nicht was sonst noch an Com enabled Dlls daherkommen wird.

Muss man das gesamte VisualStudio installieren oder gibts auch einen kleineren Teil der das sn.exe enthält?

Auf der Seite https://docs.microsoft.com/en-us/dotnet ... ork/tools/
ist beschrieben, dass sn.exe in den .NET Framework Tools enthalten ist. Ich finde aber nirgends einen Downloadlink dafür (außer dem Link zum VisualStudio).

com_module_sample

Posted: Thu Apr 07, 2022 1:58 pm
by ic2
Hallo Franz,
lagraf wrote: [*]Wie bekomme ich sn.exe wenn ich Visual Studio nicht habe, im .NET 4.8 scheint es das Prog nicht zu geben?
[*]Läuft sn.exe überhaupt noch auf meinem Win7 32bit Rechner?
[/list]
Ich würde sagen, dass es auch im Microsoft SDK enthalten sein sollte, hier die Links für Windows 7 & 10

https://www.microsoft.com/en-us/downloa ... px?id=8279
https://developer.microsoft.com/en-us/w ... ndows-sdk/

Dick

com_module_sample

Posted: Mon Apr 11, 2022 3:50 pm
by lagraf
Hallo Dick und Wolfgang,
das Windows SDK habe ich installiert, allerdings nicht die vollen 2,8GB sondern nur den Teil ".NET Framework 4.8 Software Development Kit", der das sn.exe enthält (Übrigens: die aktuelle Version von Visual Studio Community läuft nicht mehr auf 32bit, sonst hätte ich diese stattdessen genommen).

Dann habe ich das Beispiel mit der COMTest Dll ausprobiert und alle Schritte durchgeführt.
Die erzeugte Dll in den VO App Ordner kopiert.
In VO den Automation Server anhand der TLB generieren lassen
Die beiden Guids in die Init Methode eingetragen
Einen Menüpunkt DoComTest() angelegt der die Klasse mit Methode Output() aufruft
Fehlerfrei compiliert

Code: Select all

CLASS ICOMTester INHERIT OLEAutoObjectEx
METHOD Init(ObjID, fROTCHECK) CLASS ICOMTester

	SELF:cProgID := "COMTest.COMTester"
	SELF:cClsID := "{2F152684-E19F-44fe-8773-7EB706D08215}"
	SELF:cIID := "{13D9D15C-F8C8-4936-AF2C-0FAC08A31859}"
	SUPER:Init(ObjID, 0, .T., fRotCheck)
	SELF:_dwFuncs	:= 1
	SELF:_dwVars 	:= 0
	RETURN SELF
	
METHOD Output(		) CLASS ICOMTester

	LOCAL oMethod  	AS cOleMethod
	LOCAL uRetValue	AS USUAL

	oMethod		      	:= cOleMethod{}
	oMethod:symName	  	:= String2Symbol("Output")
	oMethod:iMemberid  	:= 1 
	oMethod:wInvokeKind	:= INVOKE_METHOD  
	oMethod:bRetType   	:= VT_BSTR 

	uRetValue := SELF:__Invoke(oMethod, DWORD(_BP+16),PCount())

	RETURN (uRetValue)

METHOD DoComTest() CLASS StandardShellWindow
	LOCAL oCom AS ICOMTester
	
	oCom := ICOMTester{}
	oCom:Output()
	
	RETURN SELF
Wenn ich den Menüpunkt aufrufe, erhalte ich die im Anhang befindliche Fehlermeldung.
Was kann das Problem sein?
Bei Bedarf kann ich die beiden Apps (X# und VO) hochladen.
Bild1.jpg
Bild1.jpg (23.21 KiB) Viewed 610 times

com_module_sample

Posted: Mon Apr 11, 2022 4:01 pm
by wriedmann
Hallo Franz,
ich nehme an, das ist ein Problem des Manifests.
Zur Fehlerbehebung brauche ich ggf. die kompilierte DLL und den Quellcode des VO-Programmes.
Wolfgang

com_module_sample

Posted: Mon Apr 11, 2022 4:22 pm
by lagraf
Hab alles soeben hergerichtet für den Upload
COMTestVO.zip
(16.08 KiB) Downloaded 84 times
COMTestXSharp.zip
(12.96 KiB) Downloaded 95 times

com_module_sample

Posted: Mon Apr 11, 2022 6:48 pm
by wriedmann
Hallo Franz,
nur mal ganz schnell: die COMtest.dll hat kein Manifest eingebunden.
Ich muss noch schauen, an was das liegt - so auf den ersten Blick sehe ich keinen Fehler.
Wolfgang

com_module_sample

Posted: Tue Apr 12, 2022 6:17 am
by wriedmann
Hallo Franz,
wenn ich die Manifest.CREATEPROCESS_MANIFEST_RESOURCE_ID.rc so abändere:

Code: Select all

#define RC_RT_MANIFEST 24
#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
CREATEPROCESS_MANIFEST_RESOURCE_ID RC_RT_MANIFEST "COMTest.dll.manifest"
wird das Manifest korrekt in die DLL eingebunden.
Das VO-Programm startet dann aber immer noch nicht:

Code: Select all

Fehler beim Generieren des Aktivierungskontextes für "c:tempComTestTestApp.DBG". Fehler in Manifest- oder Richtliniendatei "c:tempComTestCOMTest.DLL" in Zeile  8. Die im Manifest gefundene Komponenten-ID stimmt nicht mit der ID der angeforderten Komponente überein. Verweis: COMTest,publicKeyToken="2c2c7758cea301ed",type="win32",version="0.0.0.0". Definition: COMTest,processorArchitecture="x86",publicKeyToken="2c2c7758cea301ed",type="win32",version="0.0.0.0". Verwenden Sie das Programm "sxstrace.exe" für eine detaillierte Diagnose.
Du musst die Zeile

Code: Select all

processorArchitecture="x86" 
aus dem Manifest entfernen.
Dann startet das Programm, der Aufruf der ComTest bringt aber noch einen Fehler.
Ich habe jetzt keine Zeit mehr, der Sache weiter nachzugehen, erst heute abend oder morgen früh wieder.
Wolfgang

com_module_sample

Posted: Tue Apr 12, 2022 9:19 am
by lagraf
Hallo Wolfgang,
das Manifest sollte schon eingebunden sein wie in der XIDE ersichtlich:
COMTestManifest2.jpg
COMTestManifest2.jpg (60.17 KiB) Viewed 609 times
Wenn ich die Dll prüfe erhalte ich die Anzeige:
COMTestManifest1.jpg
COMTestManifest1.jpg (11.37 KiB) Viewed 609 times
Was bewirken die beiden #defines, sind die immer gleich einzutragen oder variieren die?