這是我第一次需要加載的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 ruturned變量。 OSOZ_IsConnected將返回常量intiger,並且OSOZ_Release將隨機給出。
例如:
我真懷疑DLL無論如何是錯誤的。它必須與我稱之爲函數的方式相同。
備選:是否有任何其他方式來加載在PHP一個DLL(DELPHI)?我想避免學習C++/c#來處理這個DLL,將xml輸出保存到文件中,然後在php:P中讀取它。
對任何人都能提供幫助的大對比。
提示:我用依賴walker檢查了dll,看來我在64位系統上運行32位dll。現在我總是得到相同的返回的數字,但仍然不是我應該的結果。程序在第一次加載dll後仍然崩潰。 – 2013-05-11 17:30:57
還檢查庫是否已經加載一次沒有幫助。例如:'$ dll_info2 = wb_call_function($ funcAddr2);'。 – 2013-05-11 17:46:47
另一個提示:從wb_call_function返回的數字取決於在PHP腳本中的位置(你移動函數,你會得到不同的整數)。即使腳本崩潰,Php也不會返回任何錯誤。 – 2013-05-11 19:25:34