Проблема! Вызов Dll из Dll
есть 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-ка будет загружаться нужная пользователю программа.
Заранее спасибо
Давай свои исходники... на [email]man@kiev.vectis.ru[/email]
Я бы рекомендовал определить все функции, как 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-ка будет загружаться нужная пользователю программа.
Заранее спасибо
Помогите!
есть 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-ка будет загружаться нужная пользователю программа.
Заранее спасибо
Цитата:
Originally posted by Green
Ты уверен, что во второй DLL ф-ции определены как pascal?
Я бы рекомендовал определить все функции, как WINAPI.
Тип вызова функции определяет порядок очистки стека при выходе из неё. Если тип объявленного указателя на загружаемую ф-ю определен неправильно, то неправильная работа со стеком может привести к различного вида исключениям.
Ты уверен, что во второй DLL ф-ции определены как pascal?
Я бы рекомендовал определить все функции, как WINAPI.
Тип вызова функции определяет порядок очистки стека при выходе из неё. Если тип объявленного указателя на загружаемую ф-ю определен неправильно, то неправильная работа со стеком может привести к различного вида исключениям.
Во второй Dll все функции используют модификатор pascal. Эту Dll писал не я, но уже успешно использовал ее функции, когда подключал ее к exe - шнику а не к Dll
return 1;
При использовании этой функции из первой dll ошибки при выходе не возникает.
Но есть еще 2-dll, которые использовались мною раньше, я их подключал к exe-шнику и ни со дной ни с другой проблем не возникало. При моих попытках подключать любую из этих dll к первой dll происходит падение при выходе из exe-шника.
И еще одна вешь, которую удалось обнаружить: Программа завершаеться нормально если мы убираем функцию FreeLibrary
Цитата:
Originally posted by Phantom
Странно еще следующее: Я создал вторую простейшую dll с одной функцией с модификатором pascal тело функции простое:
return 1;
При использовании этой функции из первой dll ошибки при выходе не возникает.
Но есть еще 2-dll, которые использовались мною раньше, я их подключал к exe-шнику и ни со дной ни с другой проблем не возникало. При моих попытках подключать любую из этих dll к первой dll происходит падение при выходе из exe-шника.
Странно еще следующее: Я создал вторую простейшую dll с одной функцией с модификатором pascal тело функции простое:
return 1;
При использовании этой функции из первой dll ошибки при выходе не возникает.
Но есть еще 2-dll, которые использовались мною раньше, я их подключал к exe-шнику и ни со дной ни с другой проблем не возникало. При моих попытках подключать любую из этих dll к первой dll происходит падение при выходе из exe-шника.
Еще раз повторюсь: используй WINAPI для указателей на ф-ции из чужой DLL и желательно тебе переписать свою DLL использовав этот тип вызова. Это является стандартом для программирования под Винды. Все твои проблемы только из-за этого (99%).
Цитата:
Originally posted by Green
Еще раз повторюсь: используй WINAPI для указателей на ф-ции из чужой DLL и желательно тебе переписать свою DLL использовав этот тип вызова. Это является стандартом для программирования под Винды. Все твои проблемы только из-за этого (99%).
Еще раз повторюсь: используй WINAPI для указателей на ф-ции из чужой DLL и желательно тебе переписать свою DLL использовав этот тип вызова. Это является стандартом для программирования под Винды. Все твои проблемы только из-за этого (99%).
Это все одно и тоже, я даже для очистки совести поставил WINAPI но ничего не изменилось
Я сделал все как у тебя описано (скопировал один - в один) и ошибка не возникла.
Давай свои исходники (или EXE)... на [email]man@kiev.vectis.ru[/email]
Цитата:
Originally posted by man2002ua
Повторяю!
Я сделал все как у тебя описано (скопировал один - в один) и ошибка не возникла.
Давай свои исходники (или EXE)... на [email]man@kiev.vectis.ru[/email]
Повторяю!
Я сделал все как у тебя описано (скопировал один - в один) и ошибка не возникла.
Давай свои исходники (или EXE)... на [email]man@kiev.vectis.ru[/email]
Отправил тебе исходники еще сегодня утром, но возник какой-то глюк с твоей почтой щас попробую еще.
Цитата:
Originally posted by Phantom
Отправил тебе исходники еще сегодня утром, но возник какой-то глюк с твоей почтой щас попробую еще.
Отправил тебе исходники еще сегодня утром, но возник какой-то глюк с твоей почтой щас попробую еще.
да, иса валялась... теперь жду...