Метод COM-объекта не определен

У меня проблемы с вызовом любого метода внутри класса COM в php. Чтобы найти все методы внутри этого класса, я использовал:

$com = new COM('Some.Class.Name');
com_print_typeinfo($com);

Выходит, этот класс содержит около 100 различных методов. Но при вызове любого из них:

$com->SomeMethod();

,эта ошибка выскакивает:

Неустранимая ошибка: вызов неопределенного метода com :: SomeMethod () в
C: \ xampp \ htdocs \ www \ test.php в строке 22

Этого не происходит, когда я использую другие COM-объекты, такие какInternetExplorer.Application‘ учебный класс.
Кроме того, я знаю, что этот COM-объект работает, как и ожидалось, с другими языками программирования, такими как Delphi.

Я использую PHP 5.5.19 на 64-битной Windows Vista и XAMPP с 32-битной архитектурой PHP.

Я был бы признателен за любую информацию о том, что может происходить, или за возможный обходной путь в этой ситуации.

РЕДАКТИРОВАТЬ:
Приложение сервера COM сделано с Delphi.

Это может быть другой подсказкой: когда я использую код

$com = new COM('Some.Class.Name');
foreach ($com as $obj) {
echo $obj->Name . "<br />";
}

Я получил:

Неустранимая ошибка: необработанное исключение «Исключение» с сообщением «Объект
тип com не создал Iterator ‘

Я предполагаю, что это может указывать на проблему с самим интерфейсом приложения, но я не знаю, что это за проблема. Я работаю в PHP, так что внутренности COM-объектов для меня полностью размыты. Но я был бы очень признателен за любую подсказку о конкретных шагах, чтобы исправить эту ситуацию.

EDIT2:
Это короче код из Srv_TLB.pas файл.

unit Srv_TLB;

{$TYPEDADDRESS OFF}
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
interface

uses Windows, ActiveX, Classes, Graphics, StdVCL, Variants;

const
// TypeLibrary Major and minor versions
SrvMajorVersion = 1;
SrvMinorVersion = 0;

LIBID_Srv: TGUID = '{xxxxx-xxx-xxx-xx...}';

IID_ISrvObject: TGUID = '{yyyyy-yyy-yyy-yy..}';
CLASS_SrvObject: TGUID = '{zzzzz-zzz-zzz-z...}';
type

// *********************************************************************//
// Forward declaration of types defined in TypeLibrary
// *********************************************************************//
ISrvObject = interface;
ISrvObjectDisp = dispinterface;

// *********************************************************************//
// Declaration of CoClasses defined in Type Library
// (NOTE: Here we map each CoClass to its Default Interface)
// *********************************************************************//
SrvObject = ISrvObject;

ISrvObject = interface(IDispatch)
['{yyyyy-yyy-yyy-yy..}']
function FuncName1(const param1: WideString; const param2: WideString): Integer; safecall;
function FuncName2: OleVariant; safecall;
function FuncName3(const param: WideString): Integer; safecall;
end;

// *********************************************************************//
// DispIntf:  ISrvObjectDisp
// Flags:     (4416) Dual OleAutomation Dispatchable
// GUID:      {yyyyy-yyy-yyy-yy..}
// *********************************************************************//
ISrvObjectDisp = dispinterface
['{yyyyy-yyy-yyy-yy..}']
function FuncName1(const param1: WideString; const param2: WideString): Integer; dispid 3;
function FuncName2: OleVariant; dispid 4;
function FuncName3(const param: WideString): Integer; dispid 5;
end;

CoSrvObject = class
class function Create: ISrvObject;
class function CreateRemote(const MachineName: string): ISrvObject;
end;

implementation

uses ComObj;

class function CoSrvObject.Create: ISrvObject;
begin
Result := CreateComObject(CLASS_SrvObject) as ISrvObject;
end;

class function CoSrvObject.CreateRemote(const MachineName: string): ISrvObject;
begin
Result := CreateRemoteComObject(MachineName, CLASS_SrvObject) as ISrvObject;
end;

end.

И проблема в (с PHP стороны):
Я могу инициализировать COM-объект с $com = new COM('The.Class.Name'); или с $com = new COM('{GUID}');и я получаю информацию о типе с com_print_typeinfo($com);, поэтому я могу видеть, что объект должен иметь методы FuncName1(), FuncName2() а также FuncName3(), но когда я пытаюсь позвонить любому из них с $com->FuncName1(param1, param2);то, что это возвращает, является этой ошибкой:

Неустранимая ошибка: вызов неопределенного метода com :: SomeMethod () в
C: \ xampp \ htdocs \ www \ test.php в строке 22

18

Решение

Многие вещи могут пойти не так с COM, но я постараюсь помочь как можно лучше.
Я знаю, что вы используете термины для описания проблемы, например, вызываете $ com-> SomeMethod (), но вам нужно быть более конкретным в этом случае.

COM предоставляет свои классы и функциональность через два основных интерфейса IUnknown и IDispatch.
У этого также есть структура DLL типа C, чтобы представить функции (не методы или классы) внешнему миру.
Языки, которые могут ссылаться непосредственно на DLL, читая таблицу экспорта (например, Delphi), делают свои вызовы непосредственно на интерфейсе, предоставляемом COM (используя интерфейс IUnknown).

Языки сценариев (например, javascript, PHP python и т. Д.) Не могут вызываться напрямую через интерфейс. Вместо этого они используют интерфейс IDispatch.
Этот интерфейс служит прокси, который предоставляет все функции COM через простой текст.
Интерфейс IDispatch определяет стандартные методы для:

1. запрос COM на интерфейсах, которые он предоставляет

2. Методы имен объекта.

3. Параметры для каждого метода.

В своем посте вы показываете, что IDispatch выставляет три метода:

1. FuncName1

2. FuncName2

3. FuncName3

Поэтому вы не можете вызвать SomeMethod для ISrvObject, потому что он не предоставляется через интерфейс IDispatch.
НОТА: COM использует текст WideString (UTF-16) при представлении своего интерфейса. Примите это во внимание, как только вы сделаете вызов методов интерфейса.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]