Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
7-62303
Alexis
2003-10-14 16:05
2003.12.19
Определение пути выполняемых приложений.


1-62024
Tihomirov
2003-12-06 01:33
2003.12.19
Сохранение данных в DLL


1-62143
atheist
2003-12-07 17:58
2003.12.19
как получить текст выделения какого - либо текста?


14-62272
наблюдатель
2003-11-24 19:15
2003.12.19
TimeStoper


1-62157
Павел ....
2003-12-07 02:50
2003.12.19
Сортировка строк по шаблону





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