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

Вниз

Падает клиент - 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 вся ветка

Текущий архив: 2009.01.25;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.009 c
15-1227078519
Андрей Алекс.
2008-11-19 10:08
2009.01.25
Внешний IP


15-1227981351
Genty
2008-11-29 20:55
2009.01.25
Использование библиотек


15-1228111662
WondeRu
2008-12-01 09:07
2009.01.25
Баги на форуме


2-1228889359
mfender
2008-12-10 09:09
2009.01.25
Ключи реестра в перечислимом свойстве


2-1228993138
cvg
2008-12-11 13:58
2009.01.25
Как сделать строчку или символ в memo жирным?





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