C 語言直接操作數據庫繁瑣,可通過 PBNI (PowerBuilder Native Interface) 加載 PB 虛擬機,調用 PB 對象完成數據庫邏輯。
LoadLibrary("pbvm90.dll") 加載 PB VM。GetProcAddress("PB_GetVM") 獲取 IPB_VM*。vm->CreateSession 創建會話,指定庫列表(如 genapp.dll)。session->FindGroup/FindClass 定位 PB 用戶對象(如 nvo_mult)。session->NewObject 實例化對象。session->GetMethodID 獲取方法 ID(簽名 "III" 表示兩 int 參數、返回 int)。session->InitCallInfo 初始化調用信息,ci.pArgs->SetInt 設置參數。session->InvokeObjectFunction 調用,檢查 HasExceptionThrown。ci.returnValue->GetInt 取返回值。FreeCallInfo、Release、FreeLibrary。[cpp]
#include "stdafx.h"
#include "stdio.h"
typedef PBXEXPORT PBXRESULT (*P_PB_GetVM)(IPB_VM** vm);
int main(int argc, char* argv[]) {
IPB_Session* session;
IPB_VM* pbvm = NULL;
HINSTANCE hinst = LoadLibrary("pbvm90.dll");
if (!hinst) return 0;
fprintf(stderr, "Loaded PBVM successfully\n");
P_PB_GetVM getvm = (P_PB_GetVM)GetProcAddress(hinst, "PB_GetVM");
if (!getvm) return 0;
getvm(&pbvm);
if (!pbvm) return 0;
LPCTSTR LibList[] = { "genapp.dll" };
if (pbvm->CreateSession("genapp", LibList, 1, &session) != PBX_OK) {
fprintf(stderr, "Error in CreateSession\n"); return 1;
}
fprintf(stderr, "Created session successfully\n");
pbgroup group = session->FindGroup("nvo_mult", pbgroup_userobject);
if (!group) return 0;
pbclass cls = session->FindClass(group, "nvo_mult");
if (!cls) return 0;
pbobject pbobj = session->NewObject(cls);
PBCallInfo ci;
pbmethodID mid = session->GetMethodID(cls, "f_mult", PBRT_FUNCTION, "III");
session->InitCallInfo(cls, mid, &ci);
ci.pArgs->GetAt(0)->SetInt(10);
ci.pArgs->GetAt(1)->SetInt(20);
try {
session->InvokeObjectFunction(pbobj, mid, &ci);
if (session->HasExceptionThrown()) session->ClearException();
} catch (...) { /* C++ 異常 */ }
pbint ret = ci.returnValue->GetInt();
fprintf(stderr, "The product of 123 and 45 is %i\n", ret); // 示例輸出
session->FreeCallInfo(&ci);
session->Release();
FreeLibrary(hinst);
return 0;
}