Форум: "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