2014-09-18 2 views
-1

Несколько лет назад я написал несколько COM-DLL i Delphi 4 (Client/Server). У меня не было проблем с этим. Позже я повышен до Delphi 7 (Enterprise), и теперь у меня есть проблемы:Проблемы с TYPE LIBRARY EDITOR

File-> New -> Other -> ActiveX -> Automation Object --> No problems. 

    Enter text "TESTPROJ" (CoClass neme) --> No problems. 

// Multiple Instances - Multiple Instances 
// Threading Model: _ tmAppartment 
// Clickbox: Generate support Code -- Unclicked 

Когда я нажимаю ОК Type Library редактор появляется с двумя линиями я вид-части (ITESTPROJ и TESTPROJ). Это кажется правильным.

I then click/ mark ITESTPROC. ITESTPROC gets marked. Then I click NEW METHOD. 

A new Item (below ITESTPROC - named Method1) appears. 

Namebox says METHOD1. ID-box says 201. 

НО:

Invoke Kind- и ТИП-боксы неактивны ("Disabled") ..

Я могу читать "Функция" в своем роде редактирования коробки Invoke.

Проблема в том, что я не могу выполнять какие-либо функции - только процедуры с этим редактором.

(мне сказали (преподается/чтение), что я делаю функцию, установив вид Invoke и RETURN-типа (в параметрах //), но я не могу использовать Invoke рода вообще.

Может кто-нибудь скажет мне, почему? И как мне делать функции с этим редактором (нужно отталкивать TLB-файл) ...

(Я пробовал установить тип возврата в HRESULT, string, integer и т. д. Это абсолютно ничего не дает - все еще процедуры и процедуры ТОЛЬКО ... (с параметрами/без параметров).

ответ

2

Доступ к методам и свойствам объекта автоматизации осуществляется через IDispatch, в частности посредством метода Invoke(). Любой метод, который вы определяете, принудительно вызывается «Invoke Kind» из «Function», так как он вызывается с флагом при вызове Invoke(). Это не может быть изменено, поэтому поле выделено серым цветом. «Тип возврата» на странице «Параметры» установлен на HRESULT по умолчанию, оставьте его таким образом, см. Ниже, почему.

Чтобы определить «функцию», которая возвращает значение, вы просто создать метод, который имеет параметр , который использует тип данных указателя и помечен модифицирующие флаги Out и RetVal. Например, чтобы создать функцию, возвращающую String, создайте метод с параметром BSTR*. Редактор будет генерировать реализацию заглушки, которая выглядит следующим образом:

type 
    TTestProj = class(TAutoObject, IConnectionPointContainer, ITestProj) 
    ... 
    protected 
    function Method1: WideString; safecall; 
    ... 
    end; 

function TTestProj.Method1: WideString; 
begin 

end; 

Все, что вам нужно сделать, это вернуть нужное значение строки, например:

function TTestProj.Method1: WideString; 
begin 
    Result := 'my value'; 
end; 

safecall соглашение о вызовах будет обрабатывать все остальное за вас , Чтобы сообщить об ошибке, просто создайте исключение. RTL будет вызывать SetErrorInfo() и возвращает соответствующий HRESULT к абоненту:

function TTestProj.Method1: WideString; 
begin 
    if some condition then 
    raise Exception.Create('error message'); 
    Result := 'my value'; 
end; 

Если вы не возбудит исключение, вызывающий абонент получает HRESULT из S_OK.

вы увидите метод как нормальная функция в коде реализации, но фактическая подпись, что CALLER видит function Method1(out Result: WideString): HRESULT; stdcall;. Вот почему вам нужно оставить возвращаемый тип метода установленным на HRESULT. Вызывающая конвенция Delphi safecall переупорядочивает вещи на стороне реализации, чтобы упростить работу.

Если вы не определяете какие-либо параметры, имеющие флаг RetVal, редактор создаст «процедуру» вместо «функции». Например, если вы создаете [out] BSTR * параметр, реализация заглушки будет выглядеть следующим образом, вместо:

type 
    TTestProj = class(TAutoObject, IConnectionPointContainer, ITestProj) 
    ... 
    protected 
    procedure Method1(out Param1: WideString); safecall; 
    ... 
    end; 

procedure TTestProj.Method1(out Param1: WideString); 
begin 
end; 

И подпись абонент видит function Method1(out Param1: WideString): HRESULT; stdcall;.

Или, если вы просто полностью опустить параметры, заглушки заканчивается так:

type 
    TTestProj = class(TAutoObject, IConnectionPointContainer, ITestProj) 
    ... 
    protected 
    procedure Method1; safecall; 
    ... 
    end; 

procedure TTestProj.Method1; 
begin 
end; 

И подпись абонент видит function Method1: HRESULT; stdcall;.

+0

AHA, Теперь я понимаю, почему. ТАЛ (Большое спасибо). –

Смежные вопросы