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

Вниз

Как получить данные в определенный мной буфер из 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
3-16121
RUYurik
2004-01-15 07:59
2004.02.06
Объем данных - 4,5 млн записей: не хватает вирт.памяти


7-16774
Magical
2003-11-16 19:28
2004.02.06
список пользователей на компьютере


3-16081
rosl
2004-01-12 06:09
2004.02.06
проблемка с датами


1-16507
Zheks
2004-01-27 10:31
2004.02.06
Вопрос про мьютексы


3-16083
Van
2004-01-11 14:55
2004.02.06
DBComboBox