Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
ВнизКак получить данные в определенный мной буфер из COM объекта? Найти похожие ветки
← →
Slym (2004-01-26 08:53) [0]Как получить данные в определенный мной буфер из COM объекта?
COM объект мой, программа моя.
надо:
COM объект:
CoOleObject=interface
function Read(buffer:pointer;count:integer):integer;
Но в COM нет указателей!!!! Как быть?
....
Программа:
v:variant;
p:pointer;
Begin
v:=CoOleObject.Create;
GetMem(p,256);
v.Read(p,256);//Сие не прокатывает! Т.к. КОМ не работает с указателями!
FreeMem(p,256);
← →
Digitman (2004-01-26 09:02) [1]
> Сие не прокатывает
так и говорит, мол, "не прокатываю" ? Или таки что-то конкретное говорит ?
> Т.к. КОМ не работает с указателями
это почему же ? оч даже работает !
← →
Slym (2004-01-27 12:28) [2]2 Digitman
не работает COM с указателями на память, не работает!
var v:variant;
p:pointer;
begin
v.read(p);
end;
...
[Error] Type not allowed in Variant Dispatch call!!!!
← →
Slym (2004-01-27 12:35) [3]Я так понял что нужно писать что-то типа прокси объекта... но все равно натыкаюсь на проблему чтения из КОМ объекта в поинтер.
конечно можно читать в string(WideString)! но это только для текстовых данных, а если 0# и не один (хотя это решимо)
но затраты времени обработки строк чуток поболее чем памяти.
а задача такая... читать/писать из/в файл через COM объект
← →
Тимохов (2004-01-27 12:36) [4]Сервер внутренний?
← →
Slym (2004-01-27 12:39) [5]Как сдалаю так и будет либо exe либо dll(предпочтительней)
Вызывающий этот обект exe тоже будет в свою очередь COMом
← →
Digitman (2004-01-27 12:40) [6]здесь, в примере своем, ты требуешь наличия IDispath, а твой интерфейс его не реализует (прямиком наследует IUnknown, как я виду из декларации интерфейса)
до пойнтеров-то еще даже дело не доходит ... разберись сначала с этим
к тому же непонятно, почему ты речь ведешь о COM-объекте, в то время как объявляешь его интерфейс Co OleObject=interface ?
неразбериха полная
← →
Slym (2004-01-27 12:44) [7]2 Digitman...
Пишу используя VCL с использованием среды Delphi методом "клик"
Файл Новый AutomationObject... КоКлассы Таблицу типов Delphi берет на себя...
Кликаю новый метод (у созданного объекта) и Какой входной параметр pointer - ругается (COM не поддерживает...)
← →
Digitman (2004-01-27 12:47) [8]IMyObject=interface
function Read(buffer:pointer;count:integer):integer;
MyObject: IMyObject;
p:pointer;
Begin
MyObject := CoMyObject.Create as IMyObject;
..
MyObject.Read(p,256);
сиречь - раннее связывание с COM-сервером ... и всех делов
← →
Slym (2004-01-27 12:47) [9]2 Digitman: Ole-ActiveX-COM - если не вдаваться в определения не одно и тоже?!
← →
Slym (2004-01-27 12:54) [10]Если так делать... то объявленый тип в таблицу типов не попадет... а сие для меня и для моих последователей плохо!
+ для этого везде где используешь IMyObject придется вставлять "заголовочный" .pas с объявлением IMyObject...
← →
Digitman (2004-01-27 13:14) [11]
> [9]
не одно и то же
2-е как вариант реализации может подразумевать 1-е, но не наоборот
> [10]
т.е тебе нужно позднее связывание.
тогда забудь об указателях (дались они тебе !) и просто реализуй функц.метод своего диспинтерфейса
IMyObjectDisp = interface(IDispatch)
function Read: OleVariant; safecall;
...
end;
← →
Slym (2004-01-27 13:26) [12]IMyObjectDisp = interface(IDispatch)
function Read: OleVariant; safecall;
а что она мне вернет? stroku данных
а если можно поподробней...
← →
alex_*** (2004-01-27 13:39) [13]а в чем проблема? если нужно буфер перетащить от сервера к клиенту - создаешь VarArray и туда запихиваешь буфер. А сам по себе поинтер в out-proc сервере смысла никакого не имеет.
← →
Digitman (2004-01-27 13:42) [14]
> а что она мне вернет? stroku данных
С чего ты взял, что только строку можно передавать с пом. OleVariant?
что ты сам захочешь, то она и вернет
ты почитай в хэлпе, какие типы данных способна хранить переменная типа OleVariant
← →
Erik (2004-01-27 15:27) [15]Я сегодня вопрос садавал об устойцивости работы 2-х функций. Одна преобразует данные в variant, другая обратно. Тебе на эти преобразования намекают.
P.S.
Все работает устойчиво, это обявление record мой напарник переделал. А перекомпелировали только клиента. :)
← →
Тимохов (2004-01-27 15:30) [16]У Эрика Хармона в книге "КОМ объекты в дельфи" (или как-то так) был материал о том как передавать буфер. Он там это делал через OleVariant, который хранит массив.
← →
alex_*** (2004-01-27 15:34) [17]Delphi Help->VarArrayLock,example
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.029 c