Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.19;
Скачать: CL | DM;

Вниз

Не работает связка Делфи<->СОМ-объект написанный на 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.025 c
1-62105
Checist [root]
2003-12-09 15:06
2003.12.19
!!! ОШИБКА СЧИТЫВАНИЯ ИЗ ФАЙЛА !!!


1-62121
Nata Kirhar
2003-12-08 11:23
2003.12.19
Просмоторщик для файлов word


1-62139
Djek
2003-12-07 19:32
2003.12.19
Формат вывода


7-62294
Никола
2003-10-09 16:02
2003.12.19
Logon в XP


1-62016
Zero Ice
2003-12-06 19:40
2003.12.19
autoexec.bat?