Use DLL in PHP?

2019-03-28 05:21发布

I'm not going to lie. I'm not all the familiar with Windows and COM objects. That's why i'm here. First of all is it possible to access a DLL from within a PHP script running out of Apache? In my journey around the internets i believe that i have 2 options:

  1. compile the dll as an extension for PHP. (i didn't make this dll)
  2. access the DLL as a COM object which is sort of what it's designed for anyways.

So i'm taking the COM approach.

try{
  $com = new COM('WHAT_GOES_HERE');
} catch(Exception $e){
    echo 'error: ' . $e->getMessage(), "\n";
}

How do i go about finding out what would go into the initialization string? is there a com viewer type program i could/should be using to find this out? the documentation associated with this DLL doesn't seem to specify what strings i should be using to initialize but gets very in-depth into what streams are available, and all sorts of fun stuff. just gotta past this initial hump. Please help!

标签: php com dll
3条回答
淡お忘
2楼-- · 2019-03-28 06:10

WHAT_GOES_HERE is the ProgID, Class ID or Moniker registered on the Operating System.

Each of these can change for the same DLL registered on different machines. There are several ways to find what's the ProgID/CLSID/Moniker of a registered dll. You can search the web for "dll debugger", "dll export", "dll inspect" and you'll see several solutions, and also ways to show what functions the dll export so you can use them.

The easiest way, you can just register the dll with Regsvr32.exe and search Window's register with regedit.exe for the dll's name, you might need to search several times until you find the key under \HKEY_CLASSES_ROOT\, which is the ProgID.

The command dcomcnfg.exe shows a lot of information about COM objects.

If you have Visual Studio, the OLE/COM Object Viewer (oleview.exe) might be useful.

查看更多
我只想做你的唯一
3楼-- · 2019-03-28 06:13

You can simply develop a wrapper around your main dll and use this wrapper as an extension in your PHP. Some free tools like SWIG can generate this wrapper for you automatically by getting the header of your dll functions. I myself use this approach and it was easy and reliable.

查看更多
成全新的幸福
4楼-- · 2019-03-28 06:16

You can run dll functions (from dlls which are not php extensions) with winbinder. http://winbinder.org/ Using it is simple. You have to download php_winbinder.dll and include it in php.ini as an extension. In the php script you have to use something similar:

function callDll($func, $param = "")
{
    static $dll = null;
    static $funcAddr = null;
    if ($dll === null)
    {
        $dll = wb_load_library(<DLL PATH AND FILENAME>);
    }
    $funcAddr = wb_get_function_address($func, $dll);
    if ($param != "")
    {
        return wb_call_function($funcAddr,array(mb_convert_encoding($param,"UTF-16LE")));
    }
    else
    {
        return wb_call_function($funcAddr);
    }
}
查看更多
登录 后发表回答