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

Ваш аккаунт

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

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

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

Проблема! Вызов Dll из Dll

2.2K
25 октября 2002 года
Phantom
7 / / 25.10.2002
Помогите!
есть exe - шник, это обыкновенная форма с одной кнопкой. На OnClick этой кнопки следующее
dll = LoadLibrary("MyDll1.dll");
ptrfInit = (INIT)GetProcAddress(dll,"Init");
ptrfInit(10);
FreeLibrary(dll);
где
typedef int pascal (*INIT)(int);
INIT ptrfInit;
HINSTANCE dll;
Есть так же, как вы догодались файл MyDll1.dll
в нем всего одна функция:
extern "C" int __declspec(dllexport) pascal Init(int i)
{
Form1 = NULL;
Form1 = new TForm1(NULL);
Form1->ShowModal();
delete Form1;
return i*i;
}

Т.е. я создал Dll с помощью Wizzarda и к проекту dll подключаю форму. И единственная функция из dll создает эту форму и показывает.

До этого момента все работает нормально, но дальше в этой форме (Form1) есть то же одна кнопка на клик которой грузим еще одну dll:

(*)
BCode_dll = LoadLibrary("BCode32.dll");
ptrfRun=(PRUN)GetProcAddress(BCode_dll,"RUN");
FreeLibrary(BCode_dll);

где
typedef int pascal (*MYFUNC)(int);
typedef int pascal (*PRUN)(void);
MYFUNC ptrfMyFunc;
HINSTANCE BCode_dll;

Программа падает при выходе (в случае если кнопка на Form1 была нажата т.е. выполнились 3 строки (*) см.выше) Причем падает в exe-шнике при закрывании формы Выскакивает дикий Access Vialetion

Вопрос: Как найти ошибку и обезвредить ее?

PS Смысл всей этой идеи в следующем: есть несколько программ которые выполняют схожие задачи, и надо сделать так что каждая из программ (в них будут использованы компоненты VCL) ,была не ввиде exe-ка а ввиде dll-ки, а из главного exe-ка будет загружаться нужная пользователю программа.

Заранее спасибо
476
26 октября 2002 года
man2002ua
218 / / 16.10.2002
На первый взгляд ошибки нет, поэтому я сделал все как у тебя описано... ОШИБКИ НЕТ!
Давай свои исходники... на [email]man@kiev.vectis.ru[/email]
3
26 октября 2002 года
Green
4.8K / / 20.01.2000
Ты уверен, что во второй DLL ф-ции определены как pascal?
Я бы рекомендовал определить все функции, как WINAPI.
Тип вызова функции определяет порядок очистки стека при выходе из неё. Если тип объявленного указателя на загружаемую ф-ю определен неправильно, то неправильная работа со стеком может привести к различного вида исключениям.

Цитата:
Originally posted by Phantom
Помогите!
есть exe - шник, это обыкновенная форма с одной кнопкой. На OnClick этой кнопки следующее
dll = LoadLibrary("MyDll1.dll");
ptrfInit = (INIT)GetProcAddress(dll,"Init");
ptrfInit(10);
FreeLibrary(dll);
где
typedef int pascal (*INIT)(int);
INIT ptrfInit;
HINSTANCE dll;
Есть так же, как вы догодались файл MyDll1.dll
в нем всего одна функция:
extern "C" int __declspec(dllexport) pascal Init(int i)
{
Form1 = NULL;
Form1 = new TForm1(NULL);
Form1->ShowModal();
delete Form1;
return i*i;
}

Т.е. я создал Dll с помощью Wizzarda и к проекту dll подключаю форму. И единственная функция из dll создает эту форму и показывает.

До этого момента все работает нормально, но дальше в этой форме (Form1) есть то же одна кнопка на клик которой грузим еще одну dll:

(*)
BCode_dll = LoadLibrary("BCode32.dll");
ptrfRun=(PRUN)GetProcAddress(BCode_dll,"RUN");
FreeLibrary(BCode_dll);

где
typedef int pascal (*MYFUNC)(int);
typedef int pascal (*PRUN)(void);
MYFUNC ptrfMyFunc;
HINSTANCE BCode_dll;

Программа падает при выходе (в случае если кнопка на Form1 была нажата т.е. выполнились 3 строки (*) см.выше) Причем падает в exe-шнике при закрывании формы Выскакивает дикий Access Vialetion

Вопрос: Как найти ошибку и обезвредить ее?

PS Смысл всей этой идеи в следующем: есть несколько программ которые выполняют схожие задачи, и надо сделать так что каждая из программ (в них будут использованы компоненты VCL) ,была не ввиде exe-ка а ввиде dll-ки, а из главного exe-ка будет загружаться нужная пользователю программа.

Заранее спасибо

2.2K
28 октября 2002 года
Phantom
7 / / 25.10.2002
Цитата:
Originally posted by Green
Ты уверен, что во второй DLL ф-ции определены как pascal?
Я бы рекомендовал определить все функции, как WINAPI.
Тип вызова функции определяет порядок очистки стека при выходе из неё. Если тип объявленного указателя на загружаемую ф-ю определен неправильно, то неправильная работа со стеком может привести к различного вида исключениям.



Во второй Dll все функции используют модификатор pascal. Эту Dll писал не я, но уже успешно использовал ее функции, когда подключал ее к exe - шнику а не к Dll

2.2K
28 октября 2002 года
Phantom
7 / / 25.10.2002
Странно еще следующее: Я создал вторую простейшую dll с одной функцией с модификатором pascal тело функции простое:

return 1;

При использовании этой функции из первой dll ошибки при выходе не возникает.

Но есть еще 2-dll, которые использовались мною раньше, я их подключал к exe-шнику и ни со дной ни с другой проблем не возникало. При моих попытках подключать любую из этих dll к первой dll происходит падение при выходе из exe-шника.
2.2K
28 октября 2002 года
Phantom
7 / / 25.10.2002
И еще одна вешь, которую удалось обнаружить: Программа завершаеться нормально если мы убираем функцию FreeLibrary
3
28 октября 2002 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Phantom
Странно еще следующее: Я создал вторую простейшую dll с одной функцией с модификатором pascal тело функции простое:

return 1;

При использовании этой функции из первой dll ошибки при выходе не возникает.

Но есть еще 2-dll, которые использовались мною раньше, я их подключал к exe-шнику и ни со дной ни с другой проблем не возникало. При моих попытках подключать любую из этих dll к первой dll происходит падение при выходе из exe-шника.



Еще раз повторюсь: используй WINAPI для указателей на ф-ции из чужой DLL и желательно тебе переписать свою DLL использовав этот тип вызова. Это является стандартом для программирования под Винды. Все твои проблемы только из-за этого (99%).

2.2K
28 октября 2002 года
Phantom
7 / / 25.10.2002
Цитата:
Originally posted by Green


Еще раз повторюсь: используй WINAPI для указателей на ф-ции из чужой DLL и желательно тебе переписать свою DLL использовав этот тип вызова. Это является стандартом для программирования под Винды. Все твои проблемы только из-за этого (99%).




Это все одно и тоже, я даже для очистки совести поставил WINAPI но ничего не изменилось

476
28 октября 2002 года
man2002ua
218 / / 16.10.2002
Повторяю!
Я сделал все как у тебя описано (скопировал один - в один) и ошибка не возникла.
Давай свои исходники (или EXE)... на [email]man@kiev.vectis.ru[/email]
2.2K
28 октября 2002 года
Phantom
7 / / 25.10.2002
Цитата:
Originally posted by man2002ua
Повторяю!
Я сделал все как у тебя описано (скопировал один - в один) и ошибка не возникла.
Давай свои исходники (или EXE)... на [email]man@kiev.vectis.ru[/email]



Отправил тебе исходники еще сегодня утром, но возник какой-то глюк с твоей почтой щас попробую еще.

476
28 октября 2002 года
man2002ua
218 / / 16.10.2002
Цитата:
Originally posted by Phantom


Отправил тебе исходники еще сегодня утром, но возник какой-то глюк с твоей почтой щас попробую еще.



да, иса валялась... теперь жду...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог