2011-12-21 40 views
12

Tôi có một dự án cần truy cập một DLL với PHP. Máy chủ là một máy Windows và máy chủ Apache được cung cấp bởi XAMPP.Sử dụng DLL với PHP dành cho người giả

Tôi đọc nhiều câu trả lời trên web như

Sau đây là cách tôi gọi là DLL trong HTA/Javascript:

<object style="display:none" id="SOME_ID" classid="clsid:SOME_CLASS_ID" codebase="./somePath.dll"></object>

Liệu ai đó có một ví dụ làm việc?

Đây là những gì tôi đã cố gắng cho đến nay trong PHP:

$obj = new COM('pathTo.dll'); 

Thông tin về DLL:

  1. Biên soạn bằng Delphi
  2. Nó được (tất nhiên) nhà làm
  3. Tôi nhận được lỗi sau the DllRegister Server entry point was not found khi tôi cố gắng đăng ký DLL với regsvr32

Nó có thể được sử dụng mà không cần đăng ký nó với regsvr32?

+0

CLSID của lớp COM của bạn? Tôi nghi ngờ bạn không tạo ra một DLL đã sẵn sàng cho COM interop ... –

+0

Mọi thứ tôi đã từng đọc về chủ đề này nói với tôi rằng cách để làm điều này là viết một trình bao bọc C++ cho DLL có thể được xây dựng thành một PHP mở rộng và sử dụng nó theo cách đó. Tôi chưa bao giờ cố gắng làm điều đó và không thể nói với bạn như thế nào, nhưng tôi đã đi qua câu hỏi trước đây (bạn liên kết với một vài người hỏi cùng một câu hỏi) và tôi chưa bao giờ thấy ai nói "Tôi đã làm việc đó" trừ khi họ xây dựng một phần mở rộng. – DaveRandom

+0

@ThorstenDittmar 'CLSID' là chuỗi chuỗi AlphaNumeric có định dạng XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX sau. Điều gì làm bạn có nghĩa là bởi một DLL đã sẵn sàng cho COM interop –

Trả lời

9

Khi bạn tạo tệp DLL, bạn cần sử dụng module definition file. Nó sẽ chứa một cái gì đó tương tự như thế này:

; 
;contains the list of functions that are being exported from this DLL 
; 

DESCRIPTION  "Simple COM object" 

EXPORTS 
       DllGetClassObject  PRIVATE 
       DllCanUnloadNow   PRIVATE 
       DllRegisterServer  PRIVATE 
       DllUnregisterServer  PRIVATE 

Định nghĩa đó cho phép regsvr32 tìm điểm nhập DllRegisterServer.

Một tùy chọn khác bạn có thể thử là chuyển cờ/n để gửi.

regsvr32 [/ u] [/ n] [/ i [: cmdline]] dllname

/u - Unregister máy chủ

/i - Gọi DllInstall đi qua nó một tùy chọn [cmdline]; khi được sử dụng với/u gọi dll gỡ cài đặt

/n - không gọi DllRegisterServer; tùy chọn này phải được sử dụng với/i

/s - Im lặng; không hiển thị các hộp tin nhắn (được thêm vào với Windows XP và Windows Vista)

Cuối cùng, trước khi bạn cố gắng tạo một DLL làm việc với PHP, bạn cần chắc chắn rằng DLL của bạn hoạt động nói chung.

2

Không thể truy cập DLL từ máy chủ Linux/Apache. Do đó dự án đã giảm.

0

tôi đã cùng một vấn đề và tôi cố định một số bước sau:

  1. mở dòng lệnh trong quản trị phải (windows + r + gõ 'cmd') viết PATH nơi bạn đang tập tin dll của bạn:
    C:\Windows\system32>regsvr32 xwizards.dll (đó là ví dụ)
    một cửa sổ hiện lên với "DllRegisterServer thành công"
  2. kiểm tra phpinfo() của bạn nếu bạn com_dotnet mở rộng
  3. bây giờ viết vào mã PHP của bạn:

    try { 
        $dll = new COM('<theNameOfDllFile>.<NameOfTheClass>'); //without extension '.dll' for theNameOfDllFile 
        $dll->Function(); 
        } catch(Exception $e){ 
        echo 'error: ' . $e->getMessage(), "\n";} 
    

    Bây giờ nếu bạn biết cách quản lý các lớp học và chức năng của bạn dll nó sẽ ok, tuy nhiên không có massage lỗi nên hiển thị trên màn hình của bạn


Nếu tôi chưa rõ cho tôi biết và tôi sẽ cố gắng hết sức trong thời gian tới của tôi :)

Các vấn đề liên quan