** 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-ке
Может тебе поможет взгляд с другой колокольни
|
|
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?
Не впервой ни во второй, скобки перестовлять нельзя, иначе компилятор выдаст ошибку. |
|