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

VC++ 編寫供 PowerBuilder 調用的 DLL 關鍵要點

     編輯:VC 教學

核心差異:呼叫慣例與函數名修飾

PowerBuilder (PB) 預期呼叫慣例為 _stdcall (Pascal 慣例),且函數名不應經過 C++ 名稱修飾。VC++ 預設為 _cdecl 並修飾名稱,需顯式指定。

一、指定 _stdcall 呼叫慣例

extern "C" __declspec(dllexport) int _stdcall GetInt(char* name)
{
    // 實作邏輯
    return 0;
}
  • extern "C":禁用 C++ Name Mangling,保持函數名原樣。
  • _stdcall:參數由右至左入堆,被呼叫者清理堆疊,符合 PB/WinAPI 標準。
  • __declspec(dllexport):匯出符號。

二、使用 .def 檔案消除 @ 修飾

即使加 extern "C",VC++ 仍會為 _stdcall 函數附加 @n (參數位元組數),如 GetStr@0。PB 宣告時需寫全名,極不便。解決:建立 專案名.def。

DEF 檔範例 (專案名 TEST)

LIBRARY     "TEST"
DESCRIPTION 'TEST Windows Dynamic Link Library'

EXPORTS
    GetInt @1
    GetStr @2
  • @1, @2 為序數,可加速載入。
  • 無 @n 後綴,PB 宣告簡潔:function string GetStr(int a) library("TEST.dll");。

建立步驟

  1. 專案目錄新建 Test.def (Win32 Dynamic-Link Library 專案預設不建立)。
  2. 專案右鍵 -> 加入現有項目 -> 選取 .def 檔。
  3. 確認連結器 -> 輸入 -> 模組定義檔 填寫 Test.def。

三、PB 端宣告範例

// PB 外部函數宣告視窗
FUNCTION long GetInt (string name) LIBRARY "TEST.DLL" ALIAS FOR "GetInt"
FUNCTION string GetStr (long id) LIBRARY "TEST.DLL" ALIAS FOR "GetStr"

ALIAS FOR 指定 DLL 實際匯出名,配合 .def 檔無修飾名稱,完美互通。

注意事項

  • 字串參數:PB 傳字串指標,VC++ 接 char* 或 LPSTR,注意編碼 (ANSI/Unicode) 一致。
  • 記憶體管理:跨模組 new/delete、malloc/free 必須同一 CRT 版本,建議由呼叫端配置緩衝區,DLL 填充。
  • 結構體對齊:#pragma pack(push, 1) 確保雙邊對齊一致。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved