Форум: "Основная";
Текущий архив: 2003.12.19;
Скачать: [xml.tar.bz2];
ВнизНе работает связка Делфи<->СОМ-объект написанный на Visual Basic Найти похожие ветки
← →
Vetal (2003-12-05 17:22) [0]Всем привет!
Поможите пож. Проблема такова. Есть СОМ-класс, написанный на Visual Basic. Объявляю в Делфи интерфейс для этого класса. Создаю объект, присваивая интерфейсу ссылку на этот класс.
При попытке присвоить значение какому-нить полю этого интерфейса возникает ошибка "Object variable or With block variable not set". Это ошибка Визуал Бейсика, говорящая о том, что объектной переменной не присвоена ссылка ни на какой объект. Самое интерестное, если сделать то же самое не в Делфи, а из Visual C++ или C#, то все работает на отлично. Но надо сделать именно на Делфи.
В чем может быть проблема и как ее решить? Помогите, а то я чото ничо не могу сделать. Ниже бросаю кусок кода:
Из файла ClientLib_TLB.pas:
// *********************************************************************//
// Interface: _To_Client
// Flags: (4560) Hidden Dual NonExtensible OleAutomation Dispatchable
// GUID: {04279F38-8516-4E8B-9FE8-246A698BF8FD}
// *********************************************************************//
_To_Client = interface(IDispatch)
["{04279F38-8516-4E8B-9FE8-246A698BF8FD}"]
function Get_ClientType: OleVariant; safecall;
procedure Set_ClientType(Param1: OleVariant); safecall;
property ClientType: OleVariant read Get_ClientType write Set_ClientType;
end;
CoTo_Client = class
class function Create: _To_Client;
class function CreateRemote(const MachineName: string): _To_Client;
end;
Из файла MainUnit.pas:
procedure TMainForm.Test();
var
iClient : _TO_CLIENT;
begin
iClient := CoTo_Client.Create(); // в Watch: iClient: Pointer($145918) as _To_Client
iClient.ClientType := 0; // в Watch: Access violation at 00000000 accessing 00000000
// после выполнения этой строки возникает диалоговое окошко ошибки: "Object variable or With block variable not set"
end;
Всем заранее спасибо.
Vetal
← →
icWasya (2003-12-05 17:42) [1]а как сделал эту TLB ??
← →
Vetal (2003-12-05 18:03) [2]Ну я взял импортировал библиотеку типов:
Project-->Import Type Library...
Там указал путь к СОМ-библиотеке (длл-ке).
← →
me (2003-12-05 18:24) [3]А что будет, если вызвать функцию, напимер, Set_ClientType?
← →
Бином Ньютоныч (2003-12-05 18:33) [4]Попробуй переобъявить так:
procedure Set_ClientType( const Param1: OleVariant); safecall;
← →
Vetal (2003-12-05 18:58) [5]2 Бином Ньютоныч: Да, так ошибки нет (когда переобьявил const Param1: OleVariant). Функция вроде как отрабатывает. Но тут есть еще одна проблема. Показываю кусок кода:
procedure Test();
var
varTmp : OleVariant;
begin
iClient := CoTo_Client.Create();
iClient.Set_ClientType(0);
varTmp := iClient.Get_ClientType(); // Вот здесь возникает
// "Access violation at 00000000 accessing 00000000"
end;
То-есть, при попытке получить значение свойства возникает Ацес Виоайшн. Подскажите кто-нить, чо здесь можно сделать?
← →
Romkin (2003-12-05 19:00) [6]Может помочь преобразование типа интерфейса к dispinterface
← →
Бином Ньютоныч (2003-12-05 19:08) [7]Попробуй так:
function Get_ClientType(out Value: OleVariant): HResult; stdcall;
function Set_ClientType(const: Param1: OleVariant): HResult; stdcall;
И >Romkin © (05.12.03 19:00) [6] тож попробуй
← →
Vetal (2003-12-05 19:19) [8]2 Бином Ньютоныч:
Внес следующие изменения:
ClientLib_TLB:
_To_Client = interface(IDispatch)
["{04279F38-8516-4E8B-9FE8-246A698BF8FD}"]
function Get_ClientType(out Value: OleVariant): HResult; stdcall;
function Set_ClientType(const Param1: OleVariant): HResult; stdcall;
MainUnit:
procedure Test()
var
varTmp : OleVariant;
begin
iClient := CoTo_Client.Create();
iClient.Set_ClientType(0);
iClient.Get_ClientType(varTmp); // Access violation
end;
В итоге возникает Аццесс Виолайшн при получении значения свойства:(
2 Ромкин:
Щас я и это попробую.
← →
Vetal (2003-12-05 19:44) [9]2 Romkin:
Заработало!!!!!
Спасибо большое.
Если несложно, можешь обьяснить, почему именно когда преобразовать к dispinterface то работает, а если не преобразовывать, то не хочет.
Заранее спасибо.
← →
nikkie (2003-12-05 19:47) [10]имхо - ошибка в бейсиковском коде.
← →
Ломброзо (2003-12-05 21:48) [11]Дадад, попробуйте таки в бейсике в Property Let перед Вашим передаваемым туда-сюда параметром поставить ByVal.
← →
Vetal (2003-12-08 14:58) [12]2 Romkin:
Если несложно, можешь обьяснить, почему именно когда преобразовать к dispinterface то работает, а если не преобразовывать, то не хочет.
Заранее пасибо.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.12.19;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c