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

Вниз

функция в COM возвращает HRESULT, а дельфи создаёт procedure   Найти похожие ветки 

 
Gear   (2006-01-08 01:08) [0]

Здравствуйте!

В COM-объекте функция возвращает HRESULT (проверено программой на C++, раотает). Устанавливая в Delphi этот COM-объект (Import Type Library), delphi создаёт врапер автоматически, но эту функцию преподносит как процедуру (!) ,естественно без возврата hresult. Кто не прав? Delphi или, что-то криво, в COM-объекте? Пробовал переписать руками врапер c процедуры на функцию, но отдало Access Violation.


 
Гаврила ©   (2006-01-08 08:48) [1]

фишка в ключевом слове safecall


 
Набережных С. ©   (2006-01-08 09:34) [2]


>  Кто не прав?

Gear.

Дельфийский редактор библиотек типов далек от идеала, но тут он ни при чем, как и COM-объект. Delphi создает обертку, используя директиву SafeCall, которая включает автоматическую поддержку компилятором интерфейса ISupportErrorInfo. Разумеется, если объект не реализует этот интерфейс, то смысла использовать SafeCall нет. Отключить такое поведение можно на вкладке Type library в меню Tools/Environment options. Советую поискать в справке по упомянутым ключевым словам и внимательно почитать ее.

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

> Пробовал переписать руками врапер c процедуры на функцию,
>  но отдало Access Violation.

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


 
Gear   (2006-01-08 15:48) [3]

Спасибо большое за ответ, ситуация следующая:

1) в Delphi 7 Personal почему-то нет вкладки Type library в меню Tools/Environment options.
2) меняю в оъекте оболочке все записи procedure на function, относящиеся к этой функции. Добавляю возвращаемый тип HRESULT, убираю safecall. В самой процедуре, а теперь уже функции делаю:
function Tmycom.MyFunc(lalala...):hresult;
var
hr:hresult;
begin
 hr:=DefaultInterface.MyFunc(lalala...);
 result:=hr;
end;
в итоге получаю access violation :(


 
Gear   (2006-01-08 15:49) [4]

да забыл написать, под объектом оболочки я прально понимаю файл генерируемый дельфи? то есть ..._TLB.pas


 
Набережных С. ©   (2006-01-08 17:35) [5]


> Gear   (08.01.06 15:48) [3]


> Добавляю возвращаемый тип HRESULT, убираю safecall.

Вместо SafeCall в объявлениях интерфейса нужно написать StdCall. В методах оболочки - не обязательно.

> Gear   (08.01.06 15:49) [4]

Да.


 
Gear   (2006-01-09 01:41) [6]

спасибо большое! всё заработало



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

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

Наверх




Память: 0.46 MB
Время: 0.093 c
4-1173115326
Dmitry_177
2007-03-05 20:22
2007.09.02
Курсор над кнопкой


15-1186323056
@!!ex
2007-08-05 18:10
2007.09.02
Resize java приложений


15-1185530247
Dib@zol
2007-07-27 13:57
2007.09.02
Точка входа


4-1173891446
VirEx
2007-03-14 19:57
2007.09.02
передача данных/строк из Dll приложению


2-1186484647
kotbazilio
2007-08-07 15:04
2007.09.02
StringToWideChar





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский