C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Возвращение функции int * funk() из DLL
** Valery_52
Отправлено: 04.03.2005, 10:06


Не зарегистрирован







Здравствуйте!
В ВСВ 6 создал DLL с функцией
int fmult(int m1 , int m2){return(m1*m2)}
Динамически в приложении подгружаю библиотеку, получаю на эту функцию указатель Fm с помощью функций WinAPI. Готовый результат получаю следующим образом:
int *a;
a = Fm(StrToInt(Edit1->Text),StrToInt(Edit2->Text));
Edit3->Text =IntToStr (a);
Здесь а — это указатель на результат, но почему-то, у меня < а> принимает значение результата. Отсюда вырожение Edit3->Text ="1".
Если a объявить так: int a;, то компилятор выдает ошибку несоответствия типов. Скажу ещё, если я использую статическое связывание DLL, то там работает все нормально. Подскажите, в чем моя ошибка рассуждений.
AVC
Отправлено: 04.03.2005, 10:24


Ветеран

Группа: Модератор
Сообщений: 1583



При динамической загрузке скорее всего у вас неправильно описан указатель на функцию (что она возвращает).
Для полного ответа необходимо видеть полный прототип fmult.
Bond
Отправлено: 04.03.2005, 11:38


Станционный диспетчер

Группа: Участник
Сообщений: 142



int *a(void) — функция, которая возвращает указатель на int
int (*a)(void) — указатель на функцию, которая возвращает int
Valery_52
Отправлено: 05.03.2005, 08:19


Ученик-кочегар

Группа: Участник
Сообщений: 25



В качестве примера был взят пример из книги Архангельского А.Я.
Все if я здесь опустил, но в тексте проги они есть.
в файле .h
private:
HINSTANCE dllInstance;

typedef char(__import *FType (char * ,char ) );// эта строка
как у автора
FType * C_D;

в файле .cpp
dllInstance = LoadLibrary("MyDLL.dll");
С_D = (FType *)GetProcAddress(dllInstance, "_Code_Dec");
Edit1->Text =C_D(Edit1->Text.c_str(),'A');

Этот пример работает бузупречно. На основе этго примера
я попытался написать для функции int Fmult(int , int).
Что из этого получилось, я описал в прошлом сообщении.
После ваших подсказок о скобках, компилятор позволил написать
следующие коды:

в файле .h
private:
HINSTANCE dllInstance;

typedef int(__import *FType )(int ,int ); // в этой строке я перенёс
скобку !
FType F_D2;

в файле .cpp
void __fastcall TForm1::Button_F1Click(TObject *Sender)
{
dllInstance = LoadLibrary("MyDLL.dll");
F_D2 = (FType)GetProcAddress(dllInstance, "_Fmult");
int res;
res = F_D2(StrToInt(Edit1->Text), StrToInt(Edit2->Text));
Edit3->Text = IntToStr(res );

//выгрузка DLL
FreeLibrary(dllInstance);
F_D2 = NULL;
}
Программа заработала.Ответы я стал получать правильные, но
при выходе из программы выскакивает ошибка:
'Proect TMyDLL.dll raised exception class EinvalidPointer
with message "Invalid pointer operation".
Эта ошибка пропадает, если я уберу строку
dllInstance = LoadLibrary("MyDLL.dll");
Эта же ошибка выскакивает и в первом варианте кодов(из прошлого сообщения).
Прошу помочь в отыскании ошибки.
Bond
Отправлено: 05.03.2005, 11:01


Станционный диспетчер

Группа: Участник
Сообщений: 142



Попробуй создать новый проект, который работает с ДЛЛ-кой.
Возможно что-то в настройках проекта — у меня были приколы что рабочий проект приходилось править в bpr-ке
Может тебе поможет взгляд с другой колокольни smile.gif
Bond
Отправлено: 05.03.2005, 11:04


Станционный диспетчер

Группа: Участник
Сообщений: 142



P.S.: При динамической загрузке ДЛЛ-ки прикручивать ее к проекту ненужно — может в этом вся трабла?
Valery_52
Отправлено: 05.03.2005, 22:30


Ученик-кочегар

Группа: Участник
Сообщений: 25



Cпасибо за помощь! Пример я сделал, теперь он работает. Причина ошибки: не стояла опция Use Dinamic RTL. Но мне до сих пор не понятно почему для функции
typedef char(__import *FType (char * ,char ) ); скобка ставиться в конце, а для функции
typedef int(__import *FType )(int ,int ); после указателя FType?
Не впервой ни во второй, скобки перестовлять нельзя, иначе компилятор выдаст ошибку.

Вернуться в Вопросы программирования в C++Builder