編輯需要的函數調用:只要有這樣的嘗試:初始化一個DLL
__declspec(dllexport) int foo(int param)
{return param*param;}
和編譯。事實證明,CRT和kernel32的函數仍然被導入。我發現這些來自運行時。問題是爲什麼這個運行時被假定爲需要?我讀過關於搬遷的一些事情。這是一個線索嗎?
我創建了一個提供Win32 GUI小部件的dll。如果我看導入表由MinGW的海灣合作委員會,它看起來像下面生成的DLL(標有(*功能)是那些我叫我自己):
導入表(解釋.idata段內容)
vma: Hint Time Forward DLL First
Table Stamp Chain Name Thunk
00006000 00006050 00000000 00000000 00006354 000060d4
DLL Name: KERNEL32.dll
vma: Hint/Ord Member-Name Bound-To
6158 207 DeleteCriticalSection
6170 236 EnterCriticalSection
6188 352 FreeLibrary
6196 510 GetLastError
61a6 529 GetModuleHandleA (x)
61ba 577 GetProcAddress
61cc 734 InitializeCriticalSection
61e8 814 LeaveCriticalSection
6200 817 LoadLibraryA
6210 1173 TlsGetValue
621e 1213 VirtualProtect
6230 1215 VirtualQuery
00006014 00006084 00000000 00000000 00006394 00006108
DLL Name: msvcrt.dll
vma: Hint/Ord Member-Name Bound-To
6240 52 __dllonexit
624e 182 _errno
6258 266 _iob
6260 538 _winmajor
626c 583 abort
6274 595 calloc
627e 610 fflush
6288 625 free (x)
6290 633 fwrite
629a 676 malloc (x)
62a4 682 memcpy (x)
62ae 748 vfprintf
00006028 000060b8 00000000 00000000 000063b8 0000613c
DLL Name: USER32.dll
vma: Hint/Ord Member-Name Bound-To
62ba 134 DefWindowProcA (x)
62cc 342 GetWindowLongA (x)
62de 405 LoadCursorA (x)
62ec 480 RegisterClassExA (x)
6300 508 SendMessageA (x)
6310 569 SetWindowLongA (x)
在我實際上可以使用DLL之前,似乎有很多事情要做。例如,我從未在我的代碼中使用過fwrite
,但它在導入表中顯示。這表示它在編譯器在鏈接時添加的某些初始化例程中使用。 爲什麼? (x)標記的函數不應該足夠嗎?
看起來您的DLL的代碼很小且很簡單。也許你可以發佈完整的代碼或其他測試代碼,它有相同的問題? – Oleg 2012-06-05 16:48:39