![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Падает клиент - COM [Delphi, Windows]
Fran © (2006-07-04 21:14:00)У 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;
Fran (2006-07-07 15:38:00) [1]Спасибо, все заработало.
Ломброзо (2006-07-05 14:27:00) [2]1. Почитать хотя бы Трельсена "Технология COM и ATL 3.0"
2. Почитать MSDN
3. Почитать справку по работе с COM в Delphi
4. Посмотреть примеры
Fran (2006-07-05 14:18:00) [3][Ломброзо]
1. Дельфи 7, там стоял в выборе PChar, язык выбрал Passcal в опциях проекта.
2,3 статью сдесь же (www.delphimaster.ru) прочитал:
"Midas и COM. Советы и Приемы" Автор статьи: Михаил Голованов
А как надо сделать правильно?
Ломброзо (2006-07-05 13:57:00) [4]Как бы навскидку:
1) Чем вы пользуетесь для генерации библиотеки типов? Меня это интересует в том смысле, что каким-то макаром для передачи строки у вас нарисовался PChar. В приниципе, с напильником можно использовать и PChar, но грамотные люди в idl используют BSTR, который Delphi мапирует на WideString
2) Кто вас научил возвращать из функции переменную, объявленную в секции?
3) Move(asTMP, PData^, SizeOf(asTMP));
Вы хакер? И кто вас научил производить преобразование в общем-то несовместимых типов данных путем низкоуровневого копирования?
Fran (2006-07-05 13:26:00) [5][isasa Ну передал ты массив указателей с сервера на клиент. А на клиенте эти указатели куда?]
А можно тут поподробнее?
Я массив с сервера перемещаю/копирую в клиентский массив asTmp.
Если указатель надо освободить, то какой и как это сделать?
isasa (2006-07-05 11:22:00) [6]Fran (05.07.06 10:59) [3]
А по существу если ответить?
Ну передал ты массив указателей с сервера на клиент. А на клиенте эти указатели куда?
Fran (2006-07-05 10:59:00) [7]А по существу если ответить?
Ketmar (2006-07-05 09:44:00) [8]не, для орешника букавак многа.
Ломброзо (2006-07-04 21:49:00) [9]Коллеги-модераторы, перенесите-ка немедля сие сообщение в орэшник, пожалуйста :)