com_module_sample

Deutschsprachiges X#-Forum – German language forum

Moderator: wriedmann

lagraf
Posts: 420
Joined: Thu Jan 18, 2018 9:03 am

com_module_sample

Post 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?
User avatar
wriedmann
Posts: 3668
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

com_module_sample

Post 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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
lagraf
Posts: 420
Joined: Thu Jan 18, 2018 9:03 am

com_module_sample

Post 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).
ic2
Posts: 1813
Joined: Sun Feb 28, 2016 11:30 pm
Location: Holland

com_module_sample

Post 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
lagraf
Posts: 420
Joined: Thu Jan 18, 2018 9:03 am

com_module_sample

Post 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 374 times
User avatar
wriedmann
Posts: 3668
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

com_module_sample

Post 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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
lagraf
Posts: 420
Joined: Thu Jan 18, 2018 9:03 am

com_module_sample

Post by lagraf »

Hab alles soeben hergerichtet für den Upload
COMTestVO.zip
(16.08 KiB) Downloaded 36 times
COMTestXSharp.zip
(12.96 KiB) Downloaded 39 times
User avatar
wriedmann
Posts: 3668
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

com_module_sample

Post 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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
wriedmann
Posts: 3668
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

com_module_sample

Post 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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
lagraf
Posts: 420
Joined: Thu Jan 18, 2018 9:03 am

com_module_sample

Post by lagraf »

Hallo Wolfgang,
das Manifest sollte schon eingebunden sein wie in der XIDE ersichtlich:
COMTestManifest2.jpg
COMTestManifest2.jpg (60.17 KiB) Viewed 375 times
Wenn ich die Dll prüfe erhalte ich die Anzeige:
COMTestManifest1.jpg
COMTestManifest1.jpg (11.37 KiB) Viewed 375 times
Was bewirken die beiden #defines, sind die immer gleich einzutragen oder variieren die?
Post Reply