2013-05-10 30 views
0

這是我第一次需要加載的DLL NAD可惜的是這不是COM DLL serwer所以我不能使用PHP的COM功能。在winbinder(PHP GUI)重新加載的dll崩潰程序

我發現它可以使用winbinder要做到這一點,但到目前爲止,我沒有那麼多的成功。這裏是我的代碼:

define("PATH_SCRIPT", dirname(__FILE__) . "/"); 
define("PATH_DATA",  PATH_SCRIPT); 
define("PATH_INC",  PATH_SCRIPT . "include/"); 
define("PATH_RES",  PATH_SCRIPT . "resources/"); 

//----------------------------------------------------------------- DEPENDENCIES 

include PATH_INC . "winbinder.php"; 

//-------------------------------------------------------------------- CONSTANTS 

define("APPNAME",   "Xml Reader!"); // Application name 

// Control identifiers 

define("ID_ABOUT",   101); 


//-------------------------------------------------------------- EXECUTABLE CODE 

// Create main window, then assign a procedure and an icon to it 

$mainwin = wb_create_window(NULL, AppWindow, APPNAME . " - PHP " . PHP_VERSION, 320, 240); 
wb_set_handler($mainwin, "process_main"); 
wb_set_image($mainwin, PATH_RES . "hyper.ico"); 

// Create toolbar 


wb_create_control($mainwin, ToolBar, array(
    array(ID_ABOUT, NULL, "About this application", 13), 
), 0, 0, 16, 15, 0, 0, PATH_RES . "toolbar.bmp"); 


// Create status bar 

$statusbar = wb_create_control($mainwin, StatusBar, APPNAME); 

// Create label control inside the window 

wb_create_control($mainwin, Label, "This is xml reader\n" . 
    "application that will read xml.\n" . 
    "from dll and write it to file.", 
    10, 70, 290, 80, 0, WBC_CENTER); 

// Enter application loop 

wb_main_loop(); 

/* Process main window commands */ 



function process_main($window, $id) 
{ 
    global $statusbar; 

    switch($id) { 

     case ID_ABOUT: 
      $dll = wb_load_library("dll/OSOZMOK.dll"); 

      //$funcAddr = wb_get_function_address('OSOZ_Release', $dll); 
      $funcAddr = wb_get_function_address('GetDllVersion', $dll); 
      $dll_info = wb_call_function($funcAddr); 

      $funcAddr = wb_get_function_address('OSOZ_IsConnected', $dll); 
      $dll_info2 = wb_call_function($funcAddr); 

      wb_release_library($dll); 

      wb_message_box($window, "DLL Returned: 1) ".$dll_info. " 2) ".$dll_info2); 
      break; 

     case IDCLOSE:  // IDCLOSE is predefined 
      wb_destroy_window($window); 
      break; 
    } 


} 

它只做兩兩件事:創建winbinder窗口,如果你點擊「關於」它加載的dll和執行兩個功能。

的問題是,磨片我點擊關於再次程序崩潰...

而且不是像TRUE或FALSE我得到intigers rut​​urned變量。 OSOZ_IsConnected將返回常量intiger,並且OSOZ_Release將隨機給出。

例如:

enter image description here

我真懷疑DLL無論如何是錯誤的。它必須與我稱之爲函數的方式相同。

備選:是否有任何其他方式來加載在PHP一個DLL(DELPHI)?我想避免學習C++/c#來處理這個DLL,將xml輸出保存到文件中,然後在php:P中讀取它。

對任何人都能提供幫助的大對比。

+0

提示:我用依賴walker檢查了dll,看來我在64位系統上運行32位dll。現在我總是得到相同的返回的數字,但仍然不是我應該的結果。程序在第一次加載dll後仍然崩潰。 – 2013-05-11 17:30:57

+0

還檢查庫是否已經加載一次沒有幫助。例如:'$ dll_info2 = wb_call_function($ funcAddr2);'。 – 2013-05-11 17:46:47

+0

另一個提示:從wb_call_function返回的數字取決於在PHP腳本中的位置(你移動函數,你會得到不同的整數)。即使腳本崩潰,Php也不會返回任何錯誤。 – 2013-05-11 19:25:34

回答

0

似乎Winbinder根本不夠先進,無法處理這個問題。我用C++。例如

HINSTANCE hGetProcIDDLL =的LoadLibrary( 「path_to_dll.dll」); - 從WINDOWS.H

OR

wxDynamicLibrary和.load從wxWidgets的

WLL都這樣做。

相關問題