Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Corba";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];

Вниз

ActiveX библиотека   Найти похожие ветки 

 
Jackers   (2005-04-07 15:47) [0]

Помогите пожалуйста!!! Имеется следующая функция в библиотеке ActiveX
HRESULT COpen (int comport_index),
а Делфи интерприетирует ее как
procedure PosOpen(nComPort: SYSINT); safecall;
В описании написано, что на выходе функция возвращает код завершения, т.е. HRESULT, а при работе, как с процедурой результат отследить невозможно. При HRESULT, отличным от нуля программа выдает ошибку типа Unknown OLE Error


 
Набережных С. ©   (2005-04-07 16:58) [1]

SafeCall - внутреннее дельфийское соглашение о вызовах. И его как раз можно применять к функциям, возвращающим тип HResult. Это соглашение применяется для включения внутренней дельфийской поддержки интерфейсов ISupportErrorInfo and IErrorInfo. Если объектом не реализуется ISupportErrorInfo, то и нет смысла использовать SafeCall для его методов.

 Хотя ты в коде имеешь дело с процедурой, реально код компилятором генерится как для функции. И если внутри этой процедуры не будет возбуждено исключение, то в качестве результата будет возвращено S_OK, т.е. 0.

Судя по тексту сообщения этот ActiveX не поддерживает ISupportErrorInfo, следовательно SafeCall здесь бессмысленна. У тебя есть два пути:
1)  Можно в опциях IDE(Tools->Environment options->Type library), в разделе SafeCall function mapping отметить пункт Do not map, после чего заново импортировать этот ActiveX.
2)  Можно вручную внести исправления, убрав SafeCall. Приведенную выше процедуру нужно переправить так:
function PosOpen(nComPort: SYSINT): HResult; stdcall;


 
Jackers   (2005-04-08 13:31) [2]

Попробовал, но ничего не выходит, компилятор выдает ошибку функция function PosOpen(nComPort: SYSINT): HResult; stdcall; не найдена. Вот еще интересноая вещь: у меня есть некий файлик с расширением idl, в котором описаны методы этой библиотечки, так вот там все эти методы идут с типом HRESULT. Насколько я понял, это С++, но как его переделать в Delphi я не знаю. При импорте этой же библиотечки в Билдер он формирует точно такой же файлик, как и Делфи, т.е.
void __fastcall TAxECRClass98::PosOpen(int nComPort)
а проследить ошибки, возвращаемые функцией я не могу. Помогите, если можно пожалуйста.


 
Набережных С. ©   (2005-04-08 14:09) [3]


> Jackers   (08.04.05 13:31) [2]

Исправлять нужно и в объявлении интерфейсов, и диспинтерфесов, и в коде классов, где идет обращение к DefaultInterface, но тут нужны хотя-бы минимальный опыт работы с интерфейсами. Просто воспользуйся первым способом.


 
Jackers   (2005-04-08 16:45) [4]

Вот конкретно опыта работы с интерфейсами и нет, а первый способ не помог. Структура файла TLB никак не изменилась, т.е. я опять не могу отследить результат выполнения функции. А при изменении интерфейсов и диспинтерфейсов компилятор выдает ошибку уже в теле функции на
Result:=DefaultInterface.PosOpen(nComPort);
таким сообщением: неизвестній идентификатор DefaultInterface. Это вообще меня завело в тупик. Если можно, подскажите, где можно прочитать про эти интерфейсы.


 
Набережных С. ©   (2005-04-08 18:49) [5]


> Jackers   (08.04.05 16:45) [4]

Дело в том, что после измениний указанных в [1] настроек нужно обязательно сменить открытый в IDE проект, либо закрыть открытый, если он есть, либо открыть нрвый.
Сделай так:

-Закрой открытый проект.
-Отметь пункт "Do not map", как написано в [1].
-Открой любой проект.
-После этого закрой текущий проект( File->Close all).
-И только теперь заново импортируй свой ActiveX.

Или можешь просто после изменения настройки перезапустить среду.


 
Jackers   (2005-04-11 10:16) [6]

> Набережных С. ©   (08.04.05 18:49) [5]

Попроповал как вы говорили, но эффект тот же:
IAxECRClass98 = interface(IDispatch)
["{EFA160AC-6EBB-11D8-8ED8-B87A66FC103A}"]
procedure PosClose; safecall;
...
end
....
IAxECRClass98Disp = dispinterface
["{EFA160AC-6EBB-11D8-8ED8-B87A66FC103A}"]
..
procedure PosClose; dispid 2;
..
end;
...
TAxECRClass98 = class(TOleControl)
...
public
  procedure PosClose;
end;
...
procedure TAxECRClass98.PosClose;
begin
 DefaultInterface.PosClose;
end;
...


Если пойти вторым путем, то должно так получиться?
IAxECRClass98 = interface(IDispatch)
["{EFA160AC-6EBB-11D8-8ED8-B87A66FC103A}"]
function PosOpen(nComPort: SYSINT): HResult; stdcall;
...
end

...
IAxECRClass98Disp = dispinterface
["{EFA160AC-6EBB-11D8-8ED8-B87A66FC103A}"]
...
function PosOpen(nComPort: SYSINT): HResult; dispid 2;
...
end;

...
TAxECRClass98 = class(TOleControl)
...
public
function PosOpen(nComPort: SYSINT): HResult;
end;
...
function PosOpen(nComPort: SYSINT): HResult;
begin
 Result:=DefaultInterface.PosClose;
end;
...


 
Набережных С. ©   (2005-04-11 12:54) [7]


> Jackers   (11.04.05 10:16) [6]
> > Набережных С. ©   (08.04.05 18:49) [5]
>
> Попроповал как вы говорили, но эффект тот же:

Так не бывает.

> Если пойти вторым путем, то должно так получиться?

Почти.
IAxECRClass98 = interface(IDispatch)
["{EFA160AC-6EBB-11D8-8ED8-B87A66FC103A}"]
function PosOpen(nComPort: SYSINT): HResult; stdcall;
...
end

...
IAxECRClass98Disp = dispinterface
["{EFA160AC-6EBB-11D8-8ED8-B87A66FC103A}"]
...
procedure PosOpen(nComPort: SYSINT); dispid 2;
...
end;

...
TAxECRClass98 = class(TOleControl)
...
public
function PosOpen(nComPort: SYSINT): HResult;
end;
...
function PosOpen(nComPort: SYSINT): HResult;
begin
// Result:=DefaultInterface.PosClose; ????
Result:=DefaultInterface.PosOpen(nComPort);
end;


 
Jackers   (2005-04-12 09:43) [8]

>>Jackers   (11.04.05 10:16) [6]
>>> Набережных С. ©   (08.04.05 18:49) [5]
>>
>> Попроповал как вы говорили, но эффект тот же:

> Так не бывает.

Я имел в виду, что при изменении опций IDE, в результате TLB-файлик ничем не отличался от того, что был, т.е.
procedure PosOpen(nComPort: SYSINT); safecall;
А насколько я понял, должно было получиться:
function PosOpen(nComPort: SYSINT): HResult;


 
Jackers   (2005-04-12 09:45) [9]

Не могли бы вы подсказать, смогу ли я переделать имеющийся файл idl в TLB при помощи утилиты idl2pas? Заранее спасибо


 
Jackers   (2005-04-12 12:12) [10]

Вот еще одна интересная вещь: при просмотре библиотеки при помощи OLE/COM Object Viewer в описании диспинтерфейсов следующее:
[uuid(EFA160AC-6EBB-11D8-8ED8-B87A66FC103A),
 helpstring("IAxECRClass98 Interface"),
 dual]
dispinterface IAxECRClass98 {
   properties:
   methods:
       ...
       [id(0x00000004), helpstring("method PosOpen")]
       void PosOpen([in] int nComPort);
       ...};

А в описании интерфейсов:
[  odl,
 uuid(EFA160AC-6EBB-11D8-8ED8-B87A66FC103A),
 helpstring("IAxECRClass98 Interface"),
 dual,
 oleautomation]
interface IAxECRClass98 : IDispatch {
...
[id(0x00000004), helpstring("method PosOpen")]
   HRESULT PosOpen([in] int nComPort);
...};


Кроме того в описании каких-то Inherited interfaces тоже присутствуют возвращаемые результаты



Страницы: 1 вся ветка

Форум: "Corba";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.019 c
15-1133881550
VirEx
2005-12-06 18:05
2006.02.05
потестите http://winconsul.kladovka.net.ru


4-1132719172
ThermiT
2005-11-23 07:12
2006.02.05
Скролирование StringGrid


9-1124534029
FUNKy
2005-08-20 14:33
2006.02.05
GLScene для .NET


2-1137268104
Bopros
2006-01-14 22:48
2006.02.05
Обработка исключительных ситуаций без SysUtils


3-1133983779
SerGe007
2005-12-07 22:29
2006.02.05
Интербейс и Дельфи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский