首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

DLL 接口傳遞複雜參數(如 std::vector)的解決方案

     編輯:程式設計疑難解答

問題

DLL 導出函數參數包含 std::vector<MODULEENTRY32>&,跨模塊調用時因 CRT 版本、內存堆不一致導致崩潰。

核心原則

DLL 接口應僅使用 C 風格類型(基本類型、指針、結構體),避免 C++ 標準庫容器、類對象跨邊界傳遞。

解決方案

  1. 不透明指針:DLL 內部分配容器,返回 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); }
  2. 固定大小緩衝區:調用者預分配數組,DLL 填充數據並返回實際數量。
    // DLL 導出
    int GetModules(DWORD pid, MODULEENTRY32* buffer, int maxCount);
  3. COM/ATL 接口:定義純虛接口,DLL 實現並導出工廠函數,調用者通過接口指針操作(需統一智能指針管理)。

推薦做法

方案二最簡單高效,無需跨模塊內存管理,適合已知最大數量場景;方案一適合動態不定長度。務必保證 DLL 與 EXE 使用相同編譯器、相同 CRT 運行庫(/MD 或 /MT)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved