Zacznę od kodu, a potem wyjaśnię:
unit1.cpp
#include <vcl.h>
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#pragma argsused
#pragma hdrstop
extern "C" __declspec(dllexport) void __stdcall szukaj();
extern "C" int szukajtekstu(LPVOID adres, char *tekst,DWORD rozmiar);
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
void __stdcall szukaj()
{
int k;
char sPlik[20];
char sTekst[256];
HANDLE uchwyt;
HANDLE plik;
LPVOID wojd;
DWORD rozmiar;
... // wykorzystuje mapowanie pliku: otrzymuje adres wojd i rozmiar pliku
k=0;
k=szukajtekstu(wojd,sTekst,rozmiar); // wywolanie funkcji z asm
...
}
=======================================
unit1.h
typedef void __stdcall (*PROCszukaj)();
extern "C" void __stdcall szukaj();
=======================================
plik.asm
.386
PUBLIC _szukajtekstu
_TEXT SEGMENT para public 'CODE' use32
ASSUME cs:_TEXT
_szukajtekstu PROC
...
_szukajtekstu ENDP
_TEXT ENDS
END
=======================================
Jest to kod biblioteki DLL korzystającej z kodu napisanego w assemblerze. Jednak nie potrafię go dołączyć, a raczej zrozumieć się z kompilatorem nie mogę :/
No i przy kompilacji dostaję:
[Linker Error] Unresolved external '_szukajtekstu' referenced from I:\BORLAND\CBUILDER5\WORK\OS2A\UNIT1.OBJ
Biblioteka kompiluje się bezbłędnie i tak samo działa, gdy wyrzucę z kodu odwołania do szukajtekst(...)
Plik asm jest poprawnie dołączony do projektu i kompiluje się.
Znalazłem gdzieś na forum informację, że to brak "C" po extern odpowiada za tego typu problemy, ale jednak nie działa :(
HELP [!!!]