Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-16193
chtr
2004-01-13 14:04
2004.02.06
Как запросом вставить данные из mdb в таблицу MSSQL?


1-16351
AlexLine
2004-01-24 13:52
2004.02.06
Как вызвать стандартный калькулятор Windows


14-16587
Knight
2004-01-10 17:27
2004.02.06
Не могу загрузить комп...


8-16536
Overlord
2003-09-06 22:15
2004.02.06
Вопрос про звук!


3-16043
www
2004-01-12 22:04
2004.02.06
Проблемы с выполнением запроса.





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