DLL 導出函數參數包含 std::vector<MODULEENTRY32>&,跨模塊調用時因 CRT 版本、內存堆不一致導致崩潰。
DLL 接口應僅使用 C 風格類型(基本類型、指針、結構體),避免 C++ 標準庫容器、類對象跨邊界傳遞。
void* 句柄;調用者持有句柄,調用釋放函數銷毀。
// DLL 導出
typedef void* VectorHandle;
VectorHandle CreateVector() { return new std::vector(); }
void PushBack(VectorHandle h, const MODULEENTRY32& item) { static_cast*>(h)->push_back(item); }
void DestroyVector(VectorHandle h) { delete static_cast*>(h); }
// DLL 導出
int GetModules(DWORD pid, MODULEENTRY32* buffer, int maxCount);
方案二最簡單高效,無需跨模塊內存管理,適合已知最大數量場景;方案一適合動態不定長度。務必保證 DLL 與 EXE 使用相同編譯器、相同 CRT 運行庫(/MD 或 /MT)。