首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

建立通用 DLL:stdcall + .def 檔消除 C++ 名稱修飾,支援 VB/VBA 呼叫

     編輯:關於VC++

核心原則

  1. 使用 C 風格介面(extern "C")避免 C++ Name Mangling
  2. 統一 __stdcall 呼叫慣例(VB/VBA 預設)
  3. 撰寫 .def 匯出定義,鎖定匯出名稱純淨無修飾

DLL 入口點

BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID) {
    switch (reason) {
        case DLL_PROCESS_ATTACH: /* 初始化 */ break;
        case DLL_PROCESS_DETACH: /* 清理 */ break;
    }
    return TRUE;
}

編譯選項:/entry:"DllMain"

匯出函數範例

// MyDLL.h
extern "C" WORD WINAPI vbShiftRight(WORD nValue, WORD nBits);

// MyDLL.cpp
WORD WINAPI vbShiftRight(WORD nValue, WORD nBits) {
    return nValue >> nBits;
}

.def 檔案(關鍵!)

LIBRARY "MyDLL"
EXPORTS
    vbShiftRight

無 .def 時,VC++ 會匯出 _vbShiftRight@8 等修飾名稱,VB 無法正確連結。

VB 宣告與呼叫

Declare Function vbShiftRight Lib "MyDLL.dll" _
    (ByVal nValue As Integer, ByVal nBits As Integer) As Integer

Sub Test()
    Debug.Assert vbShiftRight(4, 2) = 1
End Sub

進階:建立型別庫供 VB 物件瀏覽器使用

// MyDLL.odl
library MyLib {
    [helpstring("Shifts bits right"), version(1.0)]
    module MyModule {
        [entry("vbShiftRight")]
        short _stdcall vbShiftRight([in] short nValue, [in] short nBits);
    };
}

編譯 midl MyDLL.odl 產生 .tlb,VB 專案參考該型別庫即可享有 IntelliSense 與型別檢查。

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