Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перевод функций с Delphi на C++, Использование DLL 
:(
    Опции темы
Random
Дата 3.4.2005, 18:10 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Need help.

Есть DLL, написанная на Delphi, мне нужно использовать ее в своей прграмме, написаннной на С++.
Собственно в чем вопрос - в библиотеке есть функция со следующим прототипом:

Код

FUNCTION DLLFunction( BMP: TBitmap ): TMemoryStream;

Как должен выглядеть прототип этой функции на с++?

Заранее спасибо за ответы по теме.
  Вверх
Void
Дата 3.4.2005, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



В любом случае, эту функцию можно будет использовать только в C++ Builder, т.к. VCL классы есть только в нем.
Delphi не создает .lib-файла для библиотек, так что его нужно будет сгенерировать с помощью IMPLIB:
implib mylibrary.lib mylibrary.dll
После этого mylibrary.lib добавить в проект Билдера и объявить функцию так:
Код
__declspec(dllimport) TMemoryStream* DLLFunction(TBitmap *BMP);

Вроде так.



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Random
Дата 3.4.2005, 18:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо конечно, но хотелось бы использовать библиотеку в Visual C++.
lib-файлы мне кстати не нужны, линковка динамическая.

  Вверх
Void
Дата 3.4.2005, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Цитата(Random @ 3.4.2005, 18:55)
Спасибо конечно, но хотелось бы использовать библиотеку в Visual C++.

Невозможно. Ну не там VCL-ных классов TBitmap и TMemoryStream. Перепишите функцию на чистом C++ или WinAPI или MFC, Qt - на чем угодно, только не VCL.
Цитата(Random @ 3.4.2005, 18:55)
lib-файлы мне кстати не нужны, линковка динамическая.

lib-файл нужен и при динамическом связывании.



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Random
Дата 4.4.2005, 09:47 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ладно, подробнее что я хотел:

Как я использую DLL:
Пусть А и B - некоторые типы
Код

#include <windows.h>

typedef A* (WINAPI*mainFunc)( B* arg );
mainFunc dllFunc;

void func( B* arg ) 
{
    HINSTANCE hLib=LoadLibrary("proj_dll.dll");

    dllFunc=(mainFunc)GetProcAddress((HMODULE)hLib, "dllFunc");

    A* result = dllFunc( arg );

    FreeLibrary((HMODULE)hLib);
}


Как я понимаю и как показывают эксперименты функции GetProcAdress по большому счету пофиг к какому типу функции кастят ее результат. При вызове функции через указатель на стек записываются те аргументы, которые я передал в функцию. Внутри DLL они считываются со стека и из них пытаются построить аргументы нужные функции из библиотеки.Затем обратно на стек записывается результат работы функции в виде DLL, которые уже в моей программе будут приведены к возвращаемому типу.
Вопрос был в том, можно ли, используя знания о методох построения объектов для типов аргумента и возвращаемого значения, использовать для прототипа функции в моей программе какие-либо общедоступные для с++ типы.

Т.е., условно говоря будет ли работать например вот такой вариант:
Код

typedef void* (WINAPI*mainFunc)( HBITMAP arg );

Сможет ли DLL построить TBitmap из HBITMAP и как вытянуть данные по указателю на то, что раньше было TMemoryStream?
Вообще возможно ли такое сделать или требуются очень глубинные знания о внутренней структуре VCL классов?
  Вверх
Void
Дата 4.4.2005, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Цитата(Random @ 4.4.2005, 09:47)
Как я понимаю и как показывают эксперименты функции GetProcAdress по большому счету пофиг к какому типу функции кастят ее результат. При вызове функции через указатель на стек записываются те аргументы, которые я передал в функцию. Внутри DLL они считываются со стека и из них пытаются построить аргументы нужные функции из библиотеки.Затем обратно на стек записывается результат работы функции в виде DLL, которые уже в моей программе будут приведены к возвращаемому типу.

Ну, примерно так оно и работает. Только указатели и целочисленные типы (кроме 64-разрядных) возвращаются через eax, числа с плавающей точкой - на вершине FP-стека, если ничего не попутал.

Цитата(Random @ 4.4.2005, 09:47)
Сможет ли DLL построить TBitmap из HBITMAP и как вытянуть данные по указателю на то, что раньше было TMemoryStream?

smile TBitmap наследуется от TGraphic->TInterfacedPersistent->TPersistent->TObject. Куча виртуальных функций. То же самое относится и к TMemoryStream. Не могу себе представить, как это сделать.

Цитата(Random @ 4.4.2005, 09:47)
Вообще возможно ли такое сделать или требуются очень глубинные знания о внутренней структуре VCL классов?

По-моему, фактически придется портировать часть VCL на VC++. Вот здесь есть библиотека, позволяющая использовать VCL из VC++, но она, сколько я понял, платная.

Что функция-то делает? Может, легче все-таки ее переписать?


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Ignat
Дата 4.4.2005, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 3
Всего: 73



Как вариант - написать в Билдере свою библиотеку, с использованием VCL и прилинковать её к проекту в VC++.
Кстати, если не принципиально использование именно мелкософтовского компиллера, то проект на VC++ можно перенести в билдер, он поддерживает MFC.


--------------------
Теперь при чем :P
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

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


 




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


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

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