Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Dll

6.0K
16 июня 2008 года
Tramp
71 / / 25.07.2006
Есть библиотека скомпилированная в VC++ 2005
Вот фрагмент кода её хедер файла:
 
Код:
class OCCViewer
{
 public:
    __declspec(dllexport) bool InitViewer(void* wnd);
    ...
};


как использовать её в Билдере

 
Код:
dllInst = LoadLibrary("OCC.dll");
 typedef bool (__declspec(dllimport) FType(void*));
 FType * MyFunc;
 MyFunc = (FType)GetProcAddress(dllInst, "InitViewer");
 if(MyFunc(Form->Handle)) ...


не получается
11
17 июня 2008 года
oxotnik333
2.9K / / 03.08.2007
че выдает?
MyFunc ?= NULL
dllInst ?= NULL
6.0K
17 июня 2008 года
Tramp
71 / / 25.07.2006
Ошибка:
Цитата:
[BCC32 Error] Unit.cpp(30): E2031 Cannot cast from 'int (__stdcall *)()' to 'bool(void *)'


вот в этой строке:

 
Код:
MyFunc = (FType)GetProcAddress(dllInst, "InitViewer");


oxotnik333
dllInst != NULL
1.8K
17 июня 2008 года
Arkady
153 / / 18.12.2007
Ему не удается привести тип. Т.е. ты тип функции неверно задал.

Запрос возвращает такое:
 
Код:
int (__stdcall *)()


А ты ждешь такое:
 
Код:
'bool(void *)'


Скорее всего проблема в том, что тип bool - имеет подводные камни, не помню какие =)
Поэкспериментируй с
 
Код:
typedef bool (__declspec(dllimport) FType(void*));

должно помочь.
6.0K
17 июня 2008 года
Tramp
71 / / 25.07.2006
хочу заметить что функция пренадлежит классу
 
Код:
class OCCViewer


или это не важно?
не стоит ли сделать так:

 
Код:
__declspec(dllexport) OCCViewer* myOCCViewer;


в хедер файле, и что это может нам дать?

Експортироваемая функция:

 
Код:
bool __thiscall OCCViewer::InitViewer(void *)


как показывает плугин fileinfo у Total Commander'а ;)
1.8K
18 июня 2008 года
Arkady
153 / / 18.12.2007
Цитата: Tramp
хочу заметить что функция пренадлежит классу
 
Код:
class OCCViewer


или это не важно?
не стоит ли сделать так:

 
Код:
__declspec(dllexport) OCCViewer* myOCCViewer;


в хедер файле, и что это может нам дать?

Експортироваемая функция:

 
Код:
bool __thiscall OCCViewer::InitViewer(void *)


как показывает плугин fileinfo у Total Commander'а ;)



Конечно, лучше если тебе поможет кто поопытнее, но по-моему, если ты попыдаешься поменять эту строчку

 
Код:
typedef bool (__declspec(dllimport) FType(void*));

Так, чтобы компилятор думал, будто это
 
Код:
int (__stdcall *)()

То должно заработать.
Как она должна выглядеть я тоже не знаю, вечно путаюсь с указателями на функции, но попробуй вот так:

 
Код:
typedef int __stdcall (FType*)();
6.0K
18 июня 2008 года
Tramp
71 / / 25.07.2006
Arkady
 
Код:
typedef int __stdcall (FType*)();

синтаксически не верно
Цитата:
[BCC32 Error] Unit.cpp(28): E2293 ) expected

1.8K
18 июня 2008 года
Arkady
153 / / 18.12.2007
Цитата: Tramp
Arkady
 
Код:
typedef int __stdcall (FType*)();

синтаксически не верно


Ну да, я же говорю, что путаюсь в этих вещах. =)
Поэкспериментируйте, добавьте скобки где-нибудь, уберите, ещё что-то, Ваша задача получить в итоге указатель на то, что возвращает DLL.

В инете валом инфы на эту тему тоже. Когда у меня была такая проблема, я минут 20 помучился с экспериментами и нашел подходящий вариант. Так и Вы давно бы уже решили проблему =)

Затычка в том, что нет приведения типов у указателей на функцию, поэтому тип указателя, который получает из DLL указатель на функцию, должен в точности совпадать с типом возвращаемого указателя. А значит, что тип указателя на функцию определен неверно, вот его и надо поправить %)

6.0K
18 июня 2008 года
Tramp
71 / / 25.07.2006
Я решил упростить задачу
сделал хедер файл таким:
 
Код:
__declspec(dllexport) int InitViewer(void* wnd);

т.е. избавился от класса
 
Код:
dllInst = LoadLibrary("OCC.dll");
 if (dllInst == NULL) ShowMessage("dll = Null");
 //typedef int __stdcall (FType*)();
 typedef int (*importFunction)(void*); // это прокатывает, но MyFunc == NULL
 //typedef int (__declspec(dllimport) importFunction(void*)); // ругается :(
 importFunction MyFunc;
 MyFunc = (importFunction)GetProcAddress(dllInst, "InitViewer");
 if(MyFunc == NULL) ShowMessage("false");
6.0K
18 июня 2008 года
Tramp
71 / / 25.07.2006
нашёл решение:
 
Код:
extern "C" __declspec(dllexport) int InitViewer(void* wnd);


вопрос немного не в тему
как получить HWND hWnd элемента окна, например Панели,
Panel1->Handle ? так или не так?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог