在winbinder(PHP GUI)重新加载的dll崩溃程序

问题描述:

这是我第一次需要加载的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

似乎Winbinder根本不够先进,无法处理这个问题。我用C++。例如

HINSTANCE hGetProcIDDLL =的LoadLibrary( “path_to_dll.dll”); - 从WINDOWS.H

OR

wxDynamicLibrary和.load从wxWidgets的

WLL都这样做。