純C語言開發數據庫應用繁瑣,利用PowerBuilder Native Interface (PBNI) 可復用PB的DataWindow、事務管理等成熟能力,C層僅負責邏輯協調。
pbvm90.dll)PB_GetVM入口創建虛擬機實例genapp.dll)nvo_mult)→ 類 → 實例化對象f_mult,簽名"III"表示三int參數)HINSTANCE hinst = LoadLibrary("pbvm90.dll");
P_PB_GetVM getvm = (P_PB_GetVM)GetProcAddress(hinst, "PB_GetVM");
getvm(&pbvm);
LPCTSTR LibList[] = {"genapp.dll"};
pbvm->CreateSession("genapp", LibList, 1, &session);
pbgroup group = session->FindGroup("nvo_mult", pbgroup_userobject);
pbclass cls = session->FindClass(group, "nvo_mult");
pbobject pbobj = session->NewObject(cls);
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);
session->InvokeObjectFunction(pbobj, mid, &ci);
pbint ret = ci.returnValue->GetInt(); // 獲取返回值
try {
session->InvokeObjectFunction(pbobj, mid, &ci);
if (session->HasExceptionThrown()) {
session->ClearException(); // 處理PB異常
}
} catch (...) {
// 處理C++異常
}