Название: Вопрос по DLL Отправлено: Примерный ученик от Сентябрь 20, 2009, 12:16 WINDOWS 2000,VC6, QT3.3.8
Есть DLL стороннего разработчика. Загружаю DLL через QLibrary Описал Код: QLibrary *lib_ims; Вызвал Код: QString path=qApp->applicationDirPath(); Библиотека грузится, функцию находит, но при вызове функции валится http://img37.imagevenue.com/img.php?image=38074_err_122_428lo.JPG Где я накосячил? С DLL раньше работать не приходилось Название: Re: Вопрос по DLL Отправлено: Igors от Сентябрь 20, 2009, 12:55 1) Ничто не спасет если не бьется по параметрам, ims_set_input_coding должна принимать 1 аргумент int
2) Попробовать "дела давно минувших дней" typedef int (pascal *My_ims_set_input_coding) (int coding); Название: Re: Вопрос по DLL Отправлено: Примерный ученик от Сентябрь 20, 2009, 13:04 1) Ничто не спасет если не бьется по параметрам, ims_set_input_coding должна принимать 1 аргумент int 2) Попробовать "дела давно минувших дней" typedef int (pascal *My_ims_set_input_coding) (int coding); 1) Я и передаю int, CP_WIN это из enum; 2) поробовал C:\SEP\form2.ui.h(29) : error C4226: nonstandard extension used : 'pascal' is an obsolete keyword Название: Re: Вопрос по DLL Отправлено: Rcus от Сентябрь 20, 2009, 13:26 В windows стандартным соглашением вызова является stdcall (а функции без дополнительных указаний объявляются как cdecl), надо ее первым делом опробовать.
Название: Re: Вопрос по DLL Отправлено: Примерный ученик от Сентябрь 20, 2009, 13:30 В windows стандартным соглашением вызова является stdcall (а функции без дополнительных указаний объявляются как cdecl), надо ее первым делом опробовать. А как это должно выглядеть в моем случае, если не сложно...Название: Re: Вопрос по DLL Отправлено: Igors от Сентябрь 20, 2009, 13:49 А как это должно выглядеть в моем случае, если не сложно... typedef int (_stdcall *My_ims_set_input_coding) (int coding); У меня на VS 2008 pascal проходит и ничего про obsolete не говорит :) Хотя. наверное, правильно _stdcall (справа налево) Название: Re: Вопрос по DLL Отправлено: Примерный ученик от Сентябрь 20, 2009, 13:54 А как это должно выглядеть в моем случае, если не сложно... typedef int (_stdcall *My_ims_set_input_coding) (int coding); У меня на VS 2008 pascal проходит и ничего про obsolete не говорит :) Хотя. наверное, правильно _stdcall (справа налево) Спасибо Код: typedef int (_stdcall *My_ims_set_input_coding)(int coding); Название: Re: Вопрос по DLL Отправлено: Примерный ученик от Сентябрь 27, 2009, 12:26 Igors, что то не могу сообразить, как описать вызов в LINUX
Название: Re: Вопрос по DLL Отправлено: Igors от Сентябрь 27, 2009, 12:58 Igors, что то не могу сообразить, как описать вызов в LINUX Не отвечу потому что Linux ни разу даже не видел :)Но в любом случае можно "подсмотреть" как это делается для API функции. Например для Вындоуз мы знаем что какая-то функция сидит в dll. Смотрим как она описана. Код: HWND Код: #define WINAPI __stdcall Название: Re: Вопрос по DLL Отправлено: Примерный ученик от Сентябрь 27, 2009, 13:23 спасибо
Название: Re: Вопрос по DLL Отправлено: Alchazar от Февраль 10, 2010, 15:08 Никак не получается вызвать функцию из длл:
.cpp Код
WMI_access.h Код
Длл писал сам в Visual C++, это моя первая длл'ка, но вроде всё сделал правильно. В Application output получаю Код: Starting Q:\Darbai\HTMON\Client\client\debug\client.exe... Название: Re: Вопрос по DLL Отправлено: Alchazar от Февраль 11, 2010, 12:40 Получилось добраться до функции в длл файле, теперь программа вылетает когда я пытаюсь вызвать функцию
Код Если закоментировать две строчки: Код то програмка запускается.... Я так понимаю, проблемма в том, что длл требует времени чтобы выполнить свою работу, а программа не даёт ему (длл) достаточно времени, на это. Поэтому программа и вылетает. Как можно узнать когда длл будет готов дать ответ? методом тыка удалось запустить программу, добавил ещё одну строчку Код: qDebug() << "ram count: " << ramInfo.ramCount; ram available: 0 ram count: 5.28063e-308 Что-то я никак не пойму где тут собака зарыта.... |