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

Вниз

Падает клиент - COM   Найти похожие ветки 

 
Fran   (2006-07-04 21:14) [0]

У COM-сервера есть функция, которая возвращает массив по ссылке:
 private
 asTmp : array[1..3] of string;

function TSpunZAGS.GetFunction(var pcMessagePrepare: PChar; var taTmp: OleVariant): Integer;
var
Pdata : PVariant;
begin
Result := 0;
pcMessagePrepare := "Все хорошо";
asTMP[1] := "это файл";
asTMP[2] := "это путь к файлу";
asTMP[3] := "10";
taTmp := VarArrayCreate([0,SizeOf(asTMP)-1], varVariant);
PData := VarArrayLock(taTmp);
  try
   Move(asTMP, PData^, SizeOf(asTMP));
 finally
   VarArrayUnlock(taTmp);
 end; //try
end;

Клиент обращается к этой функции и все возвращается правильно, но при выходе из формы пишет "Invalit pointer operation" - в чем дело???
В клиенте:
 private
   pcMessagePrepare : PChar;
   asTmp : array[1..3] of string;
   taTmp : OleVariant;

procedure TfmTest_COM.btnTestClick(Sender: TObject);
var
Pdata : PVariant;
i : Integer;
begin
 pcMessagePrepare := PChar("");
   if TestInterFace.GetFunction(pcMessagePrepare,taTmp) = 0
   then begin
   edMessagePrepare.Text := pcMessagePrepare;
   memo1.Clear;
   PData := VarArrayLock(taTmp);
    try
    Move(PData^, asTmp, SizeOf(asTmp));
    finally
    VarArrayUnlock(taTmp);
    end; //try
     for i := 1 to 3 do begin
     memo1.Lines.Add(asTmp[i]);
     end;
   end;

end;


 
Ломброзо ©   (2006-07-04 21:49) [1]

Коллеги-модераторы, перенесите-ка немедля сие сообщение в орэшник, пожалуйста :)


 
Ketmar ©   (2006-07-05 09:44) [2]

не, для орешника букавак многа.


 
Fran   (2006-07-05 10:59) [3]

А по существу если ответить?


 
isasa ©   (2006-07-05 11:22) [4]

Fran   (05.07.06 10:59) [3]
А по существу если ответить?

Ну передал ты массив указателей с сервера на клиент. А на клиенте эти указатели куда?


 
Fran   (2006-07-05 13:26) [5]

[isasa Ну передал ты массив указателей с сервера на клиент. А на клиенте эти указатели куда?]
А можно тут поподробнее?
Я массив с сервера перемещаю/копирую в клиентский массив asTmp.
Если указатель надо освободить, то какой и как это сделать?


 
Ломброзо ©   (2006-07-05 13:57) [6]

Как бы навскидку:

1) Чем вы пользуетесь для генерации библиотеки типов? Меня это интересует в том смысле, что каким-то макаром для передачи строки у вас нарисовался PChar. В приниципе, с напильником можно использовать и PChar, но грамотные люди в idl используют BSTR, который Delphi мапирует на WideString
2) Кто вас научил возвращать из функции переменную, объявленную в секции?
3)  Move(asTMP, PData^, SizeOf(asTMP));
Вы хакер? И кто вас научил производить преобразование в общем-то несовместимых типов данных путем низкоуровневого копирования?


 
Fran   (2006-07-05 14:18) [7]

[Ломброзо]
1. Дельфи 7, там стоял в выборе PChar, язык выбрал Passcal в опциях проекта.
2,3 статью сдесь же (www.delphimaster.ru) прочитал:
"Midas и COM. Советы и Приемы" Автор статьи:  Михаил Голованов

А как надо сделать правильно?


 
Ломброзо ©   (2006-07-05 14:27) [8]

1. Почитать хотя бы Трельсена "Технология COM и ATL 3.0"
2. Почитать MSDN
3. Почитать справку по работе с COM в Delphi
4. Посмотреть примеры


 
Fran   (2006-07-07 15:38) [9]

Спасибо, все заработало.



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

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

Наверх




Память: 0.46 MB
Время: 0.006 c
2-1228996665
vegarulez
2008-12-11 14:57
2009.01.25
char & string как?


15-1228147798
Керк
2008-12-01 19:09
2009.01.25
ipconfig /flushdns


8-1189679198
master_asasin
2007-09-13 14:26
2009.01.25
Форма окна по картинке


2-1229090962
NieL
2008-12-12 17:09
2009.01.25
BorderIcons


2-1229273738
Morpheus
2008-12-14 19:55
2009.01.25
простой вопрос по RTTI





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