DLL erstellen

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

Moderatoren: crack, Krüsty, Marwin

DLL erstellen

Beitragvon 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
Rainer
Alter Hase
 
Beiträge: 78
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg

Re: DLL erstellen

Beitragvon 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
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf

Re: DLL erstellen

Beitragvon 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
Rainer
Alter Hase
 
Beiträge: 78
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg

Re: DLL erstellen

Beitragvon 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
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf

Re: DLL erstellen

Beitragvon 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: 78
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg

Re: DLL erstellen

Beitragvon 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: 78
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg

Re: DLL erstellen

Beitragvon 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
Rainer
Alter Hase
 
Beiträge: 78
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg


Zurück zu MASM32-Package

 


  • { RELATED_TOPICS }
    Antworten
    Zugriffe
    Letzter Beitrag

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron