Witam,
utworzyłem sobie projekt zgodnie ze schematem:
Tworzymy plik mojadll.asm (na podstawie http://www.i-lo.tarnow.pl/edu/inf/prg/win32asm/pages/17.htm):
;-------------------------------------------------------------------------
.386.MODEL FLAT, STDCALL
OPTION CASEMAP:NONE
INCLUDE \masm32\include\windows.inc
.CODE
DllEntry PROC hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
mov eax, TRUE
retDllEntry ENDP
;-------------------------------------------------------------------------
; To jest pusta funkcja. Nic nie robi. Wstawiłem ją tutaj, aby ci pokazać,
; gdzie należy umieszczać własne funkcje w bibliotece DLL
;-------------------------------------------------------------------------TestFunction PROC
ret
TestFunction ENDP
END DllEntry
;-------------------------------------------------------------------------Tworzymy plik mojadll.def:
;-------------------------------------------------------------------------
LIBRARY DLLSkeleton
EXPORTS TestFunction
;-------------------------------------------------------------------------Tworzymy nowy projekt w VS .NET 2005 (a przy tym solution) sample1, przy czym najlepiej zaznaczyć opcję utworzenia osobnego katalogu dla solution:
New -> Project -> Win32 Console Application
Dalej dodajemy do solution nowy projekt mojadll:
prawy klik na solution Add -> New Project -> Win32 Project, Application type: DLL, Empty Project (!!!)
Jeśli nie zaznaczyliśmy empty project to z projektu biblioteki Usuwamy wszystkie pliki cpp i h. Przenosimy wcześniej stworzone pliki asm i def do katalogu projektu. Dodajemy do Source Files projektu plik mojadll.asm, jeśli przy dodawaniu nie pojawi się automatycznie okno "Custom Build Rules" to po dodaniu pliku:
prawy klik na projekcie mojadll -> Custom Build Rules
i w oknie wybieramy MASMa.
Następnie dodajemy do Source Files projektu plik mojadll.def i we właściwościach projektu mojadll wybieramy:Configuration Properties -> Linker -> Input
i wpisujemy w pole Module Definition File nazwę mojadll.def.
Projekt powinien się kompilować i powinny powstawać w wyniku jego działania: plik exe i biblioteka dll z eksportowaną funkcją TestFunction.
Dodatkowe informacje:
- plik def jest potrzebny do utworzenia dll,
- plik lib nie jest potrzebny jeśli odwołujemy się do biblioteki dynamicznie czyli przez getprocaddress.
Na początku wszystko było ładnie, pięknie. Pisałem sobie projekt, wszystko działało.
W pewnym momencie VS zaczęło rzucać błędami z kosmosu:
------ Build started: Project: DLLint, Configuration: Debug Win32 ------
Assembling...
Assembling: .\DLLint.asm
.\DLLint.asm(1) : error A2044: invalid character in file
.\DLLint.asm(3) : error A2008: syntax error : .
.\DLLint.asm(5) : error A2008: syntax error : P
.\DLLint.asm(7) : error A2109: only white space or comment can follow backslash
.\DLLint.asm(10) : error A2008: syntax error : .
.\DLLint.asm(12) : error A2008: syntax error : l
.\DLLint.asm(13) : error A2008: syntax error : m
.\DLLint.asm(14) : error A2008: syntax error : r
.\DLLint.asm(15) : error A2008: syntax error : D
.\DLLint.asm(20) : error A2008: syntax error : u
.\DLLint.asm(21) : error A2008: syntax error : p
.\DLLint.asm(22) : error A2008: syntax error : m
.\DLLint.asm(23) : error A2008: syntax error : a
.\DLLint.asm(24) : error A2008: syntax error : p
.\DLLint.asm(25) : error A2008: syntax error : m
.\DLLint.asm(26) : error A2008: syntax error : r
.\DLLint.asm(27) : error A2008: syntax error : s
.\DLLint.asm(32) : error A2008: syntax error : d
.\DLLint.asm(33) : error A2008: syntax error : p
.\DLLint.asm(34) : error A2008: syntax error : m
.\DLLint.asm(35) : error A2008: syntax error : s
.\DLLint.asm(36) : error A2008: syntax error : p
.\DLLint.asm(37) : error A2008: syntax error : m
.\DLLint.asm(38) : error A2008: syntax error : r
.\DLLint.asm(39) : error A2008: syntax error : o
.\DLLint.asm(44) : error A2008: syntax error : i
.\DLLint.asm(45) : error A2008: syntax error : p
.\DLLint.asm(46) : error A2008: syntax error : f
.\DLLint.asm(47) : error A2008: syntax error : f
.\DLLint.asm(48) : error A2008: syntax error : f
.\DLLint.asm(49) : error A2008: syntax error : f
.\DLLint.asm(50) : error A2008: syntax error : p
.\DLLint.asm(51) : error A2008: syntax error : m
.\DLLint.asm(52) : error A2008: syntax error : r
.\DLLint.asm(53) : error A2008: syntax error : s
.\DLLint.asm(55) : error A2008: syntax error : E
.\DLLint.asm(55) : error A2088: END directive required at end of file
Project : error PRJ0019: A tool returned an error code from "Assembling..."
Build log was saved at "file://c:\Documents and Settings\Ala\Desktop\interJA\DLLint\Debug\BuildLog.htm"
DLLint - 38 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ==========
Kod jest bardzo nieskomplikowany i na pewno wczoraj działał...
.386
.MODEL FLAT, STDCALL
OPTION CASEMAP:NONE
INCLUDE d:\masm32\include\windows.inc
.CODE
DllEntry PROC hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD
mov eax, TRUE
ret
DllEntry ENDP
;***************************************************************
;****** Procedura testowa ***** dodawanie
sumuj PROC a: DWORD , b: DWORD
pushad
mov eax, a
add b, eax
popad
mov eax, b
ret ;koniec funkcji
sumuj ENDP
;***************************************************************
;****** Procedura testowa ***** odejmowanie
odejmuj PROC a: DWORD , b: DWORD
pushad
mov eax, a
sub b, eax
popad
mov eax, b
ret ;koniec funkcji
odejmuj ENDP
;***************************************************************
;****** Procedura testowa ***** HARDCORE - sinus()
sinus PROC kat:DQ;, wynik:PTR
pushad
finit
fld kat ; wczytanie zmiennej do rejestru st0
fsin
fst kat
popad
mov eax, kat
ret ;koniec funkcji
sinus ENDP
END DllEntry
Co do wywoływania funkcji z C++ kompilator nie ma zastrzeżeń.
Spotkał się kiedyś ktoś z czymś podobnym?