頭文件 local.h:
__declspec(dllimport) WORD WINAPI PrintScreen(HWND, WORD, WORD, WORD, LPSTR, BOOL);
.c 文件中呼叫此函式,編譯器提示與 winuser.h 中 3 參數同名函式衝突(實則為誤讀,詳見下文)。
// MyDLL.h
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
MYDLL_API WORD WINAPI PrintScreen(HWND, WORD, WORD, WORD, LPSTR, BOOL);
MYDLL_EXPORTS (VS 專案屬性 → C/C++ → Preprocessor),見 dllexport。dllimport。dumpbin /exports YourDll.lib 列出匯出符號,確認 PrintScreen 存在。dumpbin /dependents YourApp.exe 確認連結了哪個 DLL。PrintScreen 定義 (非宣告),通常在 DLL 專案的 .cpp 文件中。MyNamespace::PrintScreen。winuser.h 中確有 PrintScreen 但參數不同(舊版/特定 SDK)。**編譯器報「重定義」實為參數不匹配的多載衝突**。解決:重命名自訂函式 (如 MyPrintScreen) 或置入命名空間,絕不與系統全域命名空間同名。
掌握 dllexport/dllimport 雙模式巨集與命名空間隔離,是 C++ DLL 開發的基本功。