Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DLL каким макаром можна вернуть из нее результат, может ли DLL вернуть TMemoryStream? 
V
    Опции темы
X-Vlad
Дата 9.4.2008, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 570
Регистрация: 10.4.2002
Где: Украина, Львов

Репутация: 1
Всего: 5



Привет всем.

Пишу длл. в ней лежат компоненты которые работают с веб камерой... с программы я ее запускаю появляется окно с длл там нажимаю кнопку делается снимок - мне его надо передать обратно в программу. Как это сделать? пробовал 
что типа:

функция в длл
Код

function ShowWebCamDlg(aApplication: tApplication): TImage;
...
Result := aTmpImage;
...


Из длл вроди нельзя передавать обьекты.. какой есть выход? может стоит юзать МемориСтрим?

Может кто нибуть стыкался с подобным? 

Зарание благодарен.





--------------------
Хорошая штука - комп..:)
www.x-vlad.com
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 9.4.2008, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  Если юзается общий менеджер памяти, то можно заюзать обычный array of byte, можно вернуть интерфейс IStream, который получается через TStreamAdapter, а в проге работать уже с IStream.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
pseud
Дата 9.4.2008, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



смотри мой пост:
предлагаю передать картинку через строку#

там я рекомендовал передавать картинку строкой при помощи преобразований:

TBitmap -> TStringStream -> string

string -> TStringStream -> TBitmap

чувствую, где-то есть подводный камень, но должно работать )))

Это сообщение отредактировал(а) pseud - 9.4.2008, 11:58


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
MetalFan
Дата 9.4.2008, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



pseud, всетаки AnsiString не стоит передавать в/из DLL.
стоит прислушаться к совету Alexeis. самый разумный вариант.



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
X-Vlad
Дата 9.4.2008, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 570
Регистрация: 10.4.2002
Где: Украина, Львов

Репутация: 1
Всего: 5



тоесть  в моем варианте должно быть
Код

function ShowWebCamDlg(aApplication: tApplication): IStream;
var
  aStream: TStream;
...
begin
..
aStream := TMemoryStream.Create;
try
  aTmpImage.Picture.Bitmap.SaveToStream(aStream);
  Result := aStream;
finally
  aStream.Free;
end;
...


?

Это сообщение отредактировал(а) X-Vlad - 9.4.2008, 12:44


--------------------
Хорошая штука - комп..:)
www.x-vlad.com
PM MAIL WWW ICQ   Вверх
MetalFan
Дата 9.4.2008, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



почти. только "поверх" aStream (кстати нелогичное название локальной переменной) надо создать обертку TStreamAdapter


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
X-Vlad
Дата 9.4.2008, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 570
Регистрация: 10.4.2002
Где: Украина, Львов

Репутация: 1
Всего: 5



Цитата

надо создать обертку TStreamAdapter 


можешь поподробней?

 smile  smile 


--------------------
Хорошая штука - комп..:)
www.x-vlad.com
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 9.4.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  Ничего сложного
Код

var
  strm : IStream; 
Begin
  strm := TStreamAdapter.Create(aStream) as IStream;


   Больше ничего не нужно. Переменную strm можно передавать куда угодно, но главное не забыть после окончания работы занулить ее присвоив nil, иначе созданный объект не уничтожиться. Если TStreamAdapter назначить владельцем aStream, то он в добавок еще aStream уничтожит по окончанию работы.
Код

var
  strm : IStream; 
Begin
  strm := TStreamAdapter.Create(aStream, soOwned) as IStream;



  На той стороне можно сделать такой же адаптер для TMemoryStream или просто вызывать методы интерфейса IStream для передачи данных.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
X-Vlad
Дата 9.4.2008, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 570
Регистрация: 10.4.2002
Где: Украина, Львов

Репутация: 1
Всего: 5



программа
Код

type 
  TWebCamTool = function(aApplication: TApplication; const aFormCaption: string; abtnCaption: string): IStream;  StdCall;
...
procedure ...
...
var
  LibHandle: THandle;
  GetImageFromWebCam: TWebCamTool;
  aStream: IStream;
begin
  LibHandle := LoadLibrary('webcam.dll');
  try
    if LibHandle = HINSTANCE_ERROR then
      raise EDLLLoadError.Create('Unable to Load DLL');
    @GetImageFromWebCam := GetProcAddress(LibHandle, 'GetImageFromWebCam');
    if not (@GetImageFromWebCam = nil) then begin
      aStream := TStreamAdapter.Create(aStream) as IStream;
      try 
        aStream := GetImageFromWebCam(Application, 'Test', 'Press Btn');      
        Image1.Picture.Bitmap.LoadFromStream(aStream);
      finally
        aStream.Free; 
      end;      
    end
  finally
    FreeLibrary(LibHandle);
  end;
end;


DLL
Код

function ShowWebCamDlg(aApplication: TApplication; const aFormCaption: string; abtnCaption: string): IStream;
var
  aStream: TStream;
  Strm : IStream; 
Begin
...
  aStream := TMemoryStream.Create;
  Strm := TStreamAdapter.Create(aStream, soOwned) as IStream;

   aTmpImage.Picture.Bitmap.SaveToStream(aStream);
  Result := aStream;
...



так? или я чтото непонял?


--------------------
Хорошая штука - комп..:)
www.x-vlad.com
PM MAIL WWW ICQ   Вверх
Rennigth
Дата 9.4.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



X-Vlad, 
1. раз строки передаешь используешь ли общий менеджер памяти?
2. Функция в dll также должна быть stdcall.

Добавлено через 39 секунд
п.с. оттально не смотрел...


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
X-Vlad
Дата 9.4.2008, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 570
Регистрация: 10.4.2002
Где: Украина, Львов

Репутация: 1
Всего: 5



что за фишка такая.. добавляю в uses модуль Types, все равно матерится что незнает что такое IStream?


--------------------
Хорошая штука - комп..:)
www.x-vlad.com
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 9.4.2008, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



X-Vlad, не не так. 

Код

      aStream := TStreamAdapter.Create(aStream) as IStream;
      try 
        aStream := GetImageFromWebCam(Application, 'Test', 'Press Btn');     


1я строчка бесполезная, так как указатель затирается указателем полученным от GetImageFromWebCam.

Код

Image1.Picture.Bitmap.LoadFromStream(aStream);


тоже не проканнает, так как Bitmap.LoadFromStream не умеет тянуть из IStream.

Так что одно из 2х, либо создавать временный TMemoryStream и перекачивать в него данные из aStream, или написать своего потомка от TStream который в своих функциях будет вызывать методы IStream. Т.е. в конструкторе он получит указатель на внешний IStream.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
X-Vlad
Дата 9.4.2008, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 570
Регистрация: 10.4.2002
Где: Украина, Львов

Репутация: 1
Всего: 5



Alexeis, 

Цитата

что за фишка такая.. добавляю в uses модуль Types, все равно матерится что незнает что такое IStream? 


что это?


--------------------
Хорошая штука - комп..:)
www.x-vlad.com
PM MAIL WWW ICQ   Вверх
Rennigth
Дата 9.4.2008, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



X-Vlad, а делфя у тя какая?


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Alexeis
Дата 9.4.2008, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



uses AciveX;


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0786 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.