DLL erstellen

Offizieller deutscher Support für das MASM32 SDK. Download FAQ

Moderatoren: crack, Krüsty, Marwin

Antworten
Rainer
Alter Hase
Beiträge: 81
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg
Kontaktdaten:

DLL erstellen

Beitrag von Rainer » Donnerstag 16. Juli 2009, 11:06

Hallo,

ich wollte eine DLL mit Resources und Funktionen, die als INCLUDE in einen Quelltext eingebunden funktionieren, erstellen.
Als reine Resource-DLL funkt das auch, ich kann die DLL mit LoadLibrary aufrufen und bekomme ein gültiges Handle zurück.
Mit Funktionen kann ich die DLL zwar erstellen, sowie in der EXE, die die DLL nutzen soll, jedoch auch nur eine DLL-Funktion aufgerufen wird, auch wenn das erste nach Menü-Auswahl erfolgen würde, fährt sich beim Assemblieren bereits der Editor fest und kann nur noch 'gewaltsam' beendet werden. Hier das Grundgerüst, das ich verwende:

Code: Alles auswählen

.486
.model flat,stdcall
option casemap:none

INCLUDE C:\masm32\instant\GlobInit.asm (da sind alle *.inc und *.lib-Aufrufe, die normalerweise benötigt werden, drin)

.const
       (die Konstanten-Definitionen)
.data
       
.data?

.code


DllMain proc hInst:dword, dwNotification:DWORD, lpReserved:DWORD
	.if dwNotification == DLL_PROCESS_ATTACH
		m2m hInstance, hInst
		mov eax, TRUE
	.elseif dwNotification == DLL_PROCESS_DETACH
		
	.elseif dwNotification == DLL_THREAD_ATTACH
	
	.elseif dwNotification == DLL_THREAD_DETACH
		
	.endif
	ret
DllMain Endp



End DllMain
In der *.DEF sind die Funktionen eingetragen worden:

Code: Alles auswählen

LIBRARY "sysex_panel"
EXPORTS
	CreateButtonPan			
	CreateStaticPan			
	GetTextSize			
	InitPanelCtrl			
	OpenPanelCtrl			
	Panel_LVInsertColumn	
	Panel_LVInsertItem		
	Panel_LVProc			
	Panel_LVSetText			
	PanelCtrlProc
Wie schon gesagt, die Funktionen laufen korrekt, wenn ich die Quelltext-Datei (asm) als INCLUDE einbinde.

Beim Assemblieren kommen die Meldungen:
TestWin.obj : error LNK2001 : unresolved external symbol _CreateButtonPan
TestWin.exe : fatal error LNK1120 : 1 unresolved externals

Kann mir jemand sagen, was da nicht stimmt?
Vielen Dank

Gruß Rainer

Benutzeravatar
crack
Administrator
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf
Kontaktdaten:

Re: DLL erstellen

Beitrag von crack » Freitag 17. Juli 2009, 10:42

Moment, die .lib die ja technisch gesehen eine .obj ist, musst Du separat compilieren und per 'LIBINCLUDE' einbinden, da diese ja vom Linker hinzugefügt wird und nicht vom Assembler/Compiler.
mit freundlichen grüssen,
with best regards,

crack

Rainer
Alter Hase
Beiträge: 81
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg
Kontaktdaten:

Re: DLL erstellen

Beitrag von Rainer » Freitag 17. Juli 2009, 11:06

Hallo crack,

ist klar, die DLL wird auch separat assembliert und gelinkt, sie ist eine eigene Einheit. Auch wenn wir in Assembler *.lib-Dateien nutzen können, muss es als DLL auch gehen. Mit GetProcAddress bekomme ich die Funktionen ausgeführt:

Code: Alles auswählen

invoke LoadLibrary, addr szDllName
mov hDll, eax
invoke GetProcAddress, hDll, addr szProcName

.if eax
			
	mov rslt, eax
	mov eax, 20
	push eax
			
	mov eax, 200
	push eax
			
	mov eax, 10
	push eax
			
	push eax
			
	lea eax, szWinName
	push eax
			
	mov eax, 100
	push eax
			
	push hWnd
;	invoke CreateButtonPan, hWnd, 100, addr szWinName, 10, 10, 200, 20
	call rslt
.endif
Das funktioniert, das Problem bringt offensichtlich das INVOKE mit sich, das schiebt doch eigentlich auch nur die Parameter auf den Stack und macht dann einen Call-Aufruf...
Verstehe ich nicht...

INCLUDE sysex_panel.inc (mit den PROTOs) und
INCLUDELIB sysex_panel.lib

bringt den gleichen Absturz des Editors beim Aufrufen der Funktion.

Danke für die Antwort, zur Not würde es wohl mit GetProcAddress und Call gehen, aber es ist eben eine 'Krücke', und die sind nie gut.

Gruß Rainer

Benutzeravatar
crack
Administrator
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf
Kontaktdaten:

Re: DLL erstellen

Beitrag von crack » Freitag 17. Juli 2009, 11:50

Im Moment ists bei mir zeitlich etwas knapp, aber vll bekomme ich nächste Woche mal etwas Zeit mich darein zu vertiefen.
mit freundlichen grüssen,
with best regards,

crack

Rainer
Alter Hase
Beiträge: 81
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg
Kontaktdaten:

Re: DLL erstellen

Beitrag von Rainer » Freitag 17. Juli 2009, 11:54

Hall crack,

das wäre schön, denn es ist ja ein generelles Problem, irgendwann muss man ja doch DLLs erstellen und das sollte schon gehen.
Ich habe den Verdacht, dass etwas mit dem Entry Point nicht stimmt, habe aber keine Ahnung, was es sein sollte. Nach Assembler-Buch von Rhode sollte es eigentlich gehen...

Gruß Rainer

Rainer
Alter Hase
Beiträge: 81
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg
Kontaktdaten:

Re: DLL erstellen

Beitrag von Rainer » Dienstag 21. Juli 2009, 01:55

Hallo crack,

da habe ich aber wirklich einen blöden Denkfehler drin gehabt. Ich war der Meinung, dass die Windows-Dlls ja auch geladen werden. Stimmt aber nicht, die liegen ja als *.lib vor. Ein *.lib erstellen hatte ich auch versucht, da hatte ich aber in der *.def-Datei bei LIBRARY den Namen in Anführungszeichen, deshalb hat's nicht funktioniert. Ich habe die DLL mal in Powerbasic probiert, da geht sie.

Tut mir leid, dass ich Dich umsonst bemüht habe.
Gruß Rainer

Rainer
Alter Hase
Beiträge: 81
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg
Kontaktdaten:

Re: DLL erstellen

Beitrag von Rainer » Dienstag 21. Juli 2009, 17:13

Das Problem mit der Dll habe ich herausgefunden: Bei PBWin70 hat sie zwar funktioniert, aber nicht unter MASM32. Der Fehler lag beim Linken, in den Projekt-Optionen/Verbindung muss eingestellt sein:

7,0,$B /LINK.EXE /SUBSYSTEM:WINDOWS /RELEASE:DLL /entry:DllMain /DEF:$6 /LIBPATH:"$L" /OUT:"$7",3,4

Gefehlt hatte vorher: /entry:DllMain
Ich benutze RadAsm.

Jetzt funktioniert die DLL auch unter MASM32.

Gruß Rainer

Antworten