Перезагрузка dll в winbinder (php gui) вылетает программа

Это первый раз, когда мне нужно загрузить dll nad, к сожалению, это не COM serwer dll, поэтому я не могу использовать функции php com.

Я обнаружил, что для этого можно использовать 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;
    }


}

Он делает только 2 вещи: создает окно winbinder и, если вы нажмете "о", загрузит DLL и выполнит 2 функции.

Проблема в том, что при повторном нажатии программа вылетает...

Кроме того, вместо поворотных переменных, таких как ИСТИНА или ЛОЖЬ, я получаю зачинщиков. OSOZ_IsConnected вернет постоянную intiger, а OSOZ_Release выдаст случайную.

Например:

введите описание изображения здесь

Я действительно сомневаюсь, что DLL все равно не так. Это должно быть так, как я называю функции.

Альтернатива: есть ли другой способ загрузить dll (delphi) в php? Я хотел бы избежать изучения C++/ C# только для обработки этой dll, сохранения вывода xml в файл и чтения его в php:P.

Большое спасибо всем, кто может помочь.

1 ответ

Решение

Кажется, что Winbinder просто не достаточно продвинут, чтобы справиться с этим. Я использовал с ++. Например

HINSTANCE hGetProcIDDLL = LoadLibrary("path_to_dll.dll"); - из windows.h

ИЛИ ЖЕ

wxDynamicLibrary и.load от WxWidgets

Хорошо, оба делают.

Другие вопросы по тегам