PowerBuilder (PB) 預期呼叫慣例為 _stdcall (Pascal 慣例),且函數名不應經過 C++ 名稱修飾。VC++ 預設為 _cdecl 並修飾名稱,需顯式指定。
extern "C" __declspec(dllexport) int _stdcall GetInt(char* name)
{
// 實作邏輯
return 0;
}
extern "C":禁用 C++ Name Mangling,保持函數名原樣。_stdcall:參數由右至左入堆,被呼叫者清理堆疊,符合 PB/WinAPI 標準。__declspec(dllexport):匯出符號。即使加 extern "C",VC++ 仍會為 _stdcall 函數附加 @n (參數位元組數),如 GetStr@0。PB 宣告時需寫全名,極不便。解決:建立 專案名.def。
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");。Test.def (Win32 Dynamic-Link Library 專案預設不建立)。Test.def。// 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 檔無修飾名稱,完美互通。
char* 或 LPSTR,注意編碼 (ANSI/Unicode) 一致。new/delete、malloc/free 必須同一 CRT 版本,建議由呼叫端配置緩衝區,DLL 填充。#pragma pack(push, 1) 確保雙邊對齊一致。