PowerBuilder 9 PowerBuilder Native Interface(PBNI) PowerBuilder 9 PowerBuilder C++ Java PowerBuilder 9 PBNI PowerBuilder Java C++ PowerBuilder NVO / PowerBuilder C/C++ PowerBuilder 9.0 PowerBuilder Native Interface PBNI PowerBuilder C/C++ PowerBuilder JNI PBNI Java PowerBuilder PBNI PBNI 1. PowerBuilder C C++? 2. PowerBuilder Java EJB Web Service Java Class? 3. C C++ PowerBuilder? PowerBuilder PowerBuilder C C++ DLL FUNCTION ulong GetSysColor (int index) LIBRARY "USER32.DLL FUNCTION boolean sndplaysounda (string SoundName, uint Flags) LIBRARY "WINMM.DLL" 1
BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2
PBNI 3
PBNI PBNI PBNI PBNI PBNI PBNI PB extensions PB marshaler extensions PB visual extensions PBVM C++ PB extensions 4
PBNI C C++ DLL PBNI PowerBuilder PBD PB Extensions PB Extensions PBD C++ C++ PBNI PBD PBD Funtion Function C++ Function C++ 1. C++ 2. C++ PBNI SDK C++ (h ) 3. C++ Globle Function 4. Globle Function C++ Function 5. C++ DLL 6. PBNI pbx2pbd90.exe DLL PBD 7. PowerBuilder PBD Library Search Path 8. PowerBuilder PBD Globle Function 5
PBXEXPORT PBXRESULT PBXCALL PBX_InvokeGlobalFunction ( 6
) IPB_Session* pbsession, LPCTSTR functionname, PBCallInfo* ci if ( strcmp( functionname, "getusername" ) == 0 ) CWinAPI *WinAPI = new CWinAPI( pbsession ) ; WinAPI->PBNIGetUserName ( ci ) ; if ( WinAPI!= NULL ) delete WinAPI ; return PBX_OK ; ; return PBX_E_NO_SUCH_CLASS ; PB Extension PB PBVM IPB_Session C++PowerBuilder 7
pbniwinapi.cpp CWinAPI Class PBNIGetUserName() Windows API main.cpp PB Globle Function GetUserName() pbniwinapi.cpp #include <WINDOWS.H> #include <stdio.h> #include "PBNIWINAPI.h" CWinAPI::CWinAPI( IPB_Session * psession ) : m_psession( psession ) CWinAPI::~CWinAPI(void) void CWinAPI::PBNIGetUserName ( PBCallInfo *ci ) LPTSTR lpszsysteminfo; DWORD cchbuff = 256; TCHAR tchbuffer[1024]; lpszsysteminfo = tchbuffer; GetUserName ( lpszsysteminfo, &cchbuff) ; ci->returnvalue->setstring ( lpszsysteminfo ) ; void CWinAPI::Destroy() 8
delete this ; main.cpp #include <windows.h> #include <pbext.h> #include "pbniwinapi.h" BOOL APIENTRY DllMain( HANDLE hmodule, DWORD reasonforcall, LPVOID lpreserved ) switch( reasonforcall ) case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; return TRUE; PBXEXPORT LPCTSTR PBXCALL PBX_GetDescription() static const TCHAR desc[] = "globalfunctions \n" "function string GetUserName()\n" "end globalfunctions \n" ; return desc ; PBXEXPORT PBXRESULT PBXCALL PBX_InvokeGlobalFunction ( 9
) IPB_Session* pbsession, LPCTSTR functionname, PBCallInfo* ci if ( strcmp( functionname, "getusername" ) == 0 ) ; CWinAPI *WinAPI = new CWinAPI( pbsession ) ; WinAPI->PBNIGetUserName ( ci ) ; if ( WinAPI!= NULL ) delete WinAPI ; return PBX_OK ; return PBX_E_NO_SUCH_CLASS ; PowerBuilder C++ DLL DLL PowerBuilder PB Extension DLL PBD DLL PowerBuilder PowerBuilder PBD DLL PowerBuilder9 %Sybase9%\PowerBuilder 9.0\SDK\PBNI pbx2pbd90.exe DLL PBD pbx2pbd90.exe pbx2pbd90 your.pbd your.dll DLL pbniwinapi.dll PBD 10
pbx2pbd90 pbniwinapi.pbd pbniwinapi.dll pbniwinapi.pbd C++ PBX_GetDescription() PBD PowerBuilder PowerBuilder PowerScript PBD PowerBuilder PB Extension PB Extension PBD DLL? PBD DLL PBD PowerBuilder DLL PB Extension? PB Extension PowerBuilder 1..PBD PowerScript Target PBD Library Search Path 2. PB extension DLL 11
3. PowreScript PB Extension Library Search Path PBD NVO SimpleExt hello() PowerBuilder SimpleExt ext ext = create SimpleExt String str Str = ext.hello( Hello, what s your name? ) Messagebox( hello, str); PB Extension PBVM PBNI C C++ PB Extensions PBD C++ PBVM PBVM 12
Java DataWindow PowerBuilder C++ PBVM PBNI C++ PowerBuilder 1. C++ PBVM 2. C++ IPB_VM C++PB 3. PBL PBD Library Session( IPB_Session ) 4. C++ NVO 5. NVO Function trypbni.pbl PBL NVO n_ben foo() C++ PBVM C++ C++ n_ben.foo() trypbni.cpp 1. int main(int argc, char* argv[]) 2. 3. HINSTANCE hinst = LoadLibrary("pbvm90.dll"); 4. P_PB_GetVM getvm = (P_PB_GetVM)GetProcAddress(hinst, "PB_GetVM"); 5. IPB_VM* vm = NULL; 6. getvm(&vm); 7. static const char *liblist[] = "trypbni.pbl" ; 8. IPB_Session* session = NULL; 9. vm->createsession("trypbni", liblist, 1, &session); 10. pbgroup group = session->findgroup("n_ben", pbgroup_userobject); 11. pbclass clz = session->findclass(group, "n_ben"); 12. pbmethodid mid = session->getmethodid(clz, "foo", PBRT_FUNCTION, "IS"); 13. pbobject obj = session->newobject(clz); 14. PBCallInfo ci; 15. session->initcallinfo(clz, mid, &ci); 16. ci.pargs->getat(0)->setstring("calling PowerScript from C++"); 17. session->invokeobjectfunction(obj, mid, &ci); 18. session->freecallinfo(&ci); 13
19. session->release(); 20. FreeLibrary(hinst); 21. return 0; 22. C++ PBVM LoadLibrary() pbvm90.dll C++ trypbni.pbl n_ben n_ben.foo() C++ PowerBuilder Java PowerBuilder? PBVM Java PowerBuilder Java PowerBuilder Java C++ Java JNI C++ PowerBuilder DLL PBNI PBVM JNI Java C++DLL PowerBuilder Native Interface PowerBuilder9 PowerBuilder PBNI PowerBuilder C++ Java PowerBuilder 14