![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Гость_Andy |
|
|||
Unregistered |
Плиз, хелп!
Неполучается создать dll модуль в lcc, точнее dll создаётся, но функций из неё я вызвать не могу! В чём может быть дело? Заранее благодарен за помощь. |
|||
|
||||
shedon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1209 Регистрация: 17.1.2003 Где: Нижнiй Новгородъ Репутация: 4 Всего: 11 |
Я с таким компилятором не работал, но опиши подробнее как функции экспортируешь/импортируешь , как загружаешь длл, как вызываешь функцию ?
-------------------- Programming is like sex: One mistake and you have to support it your lifetime |
|||
|
||||
D_BuG |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 9.11.2004 Репутация: нет Всего: нет |
Это Andy, я зарегился под D_BUG.
Итак: Есть файл dll.c #include <windows.h> #include <stdio.h> extern "C" __declspec(dllexport) int MyFunction(); extern "C" __declspec(dllexport) int MyFunction() { return 1; } После этого компилятор выдаёт кучу ошибок: Wedit output window build: Tue Nov 9 10:41:02 2004 Warning d:\lcc\projects\dll\dll.c: 7 no type specified. Defaulting to int Error d:\lcc\projects\dll\dll.c: 7 empty declaration Error d:\lcc\projects\dll\dll.c: 7 Syntax error; missing semicolon before "C" Error d:\lcc\projects\dll\dll.c: 7 unrecognized declaration Warning d:\lcc\projects\dll\dll.c: 11 no type specified. Defaulting to int Error d:\lcc\projects\dll\dll.c: 11 empty declaration Error d:\lcc\projects\dll\dll.c: 11 Syntax error; missing semicolon before "C" Error d:\lcc\projects\dll\dll.c: 11 unrecognized declaration Compilation + link time:0.1 sec, Return code: 1 А соответственно если extern не делать , то моих функций невидно из вне :-( Пример: #include <windows.h> #include <stdio.h> int __declspec(dllexport) MyFunction(); MyFunction(); { return 1; } или #include <windows.h> #include <stdio.h> int __declspec(dllexport) MyFunction() { return 1; } Вызов с помощью обычных LoadLibrary() и GetProcAddress(). Пример: #include <windows.h> typedef int (WINAPI *PFN_MyFunction)(char *); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HINSTANCE hMyDll; if((hMyDll=LoadLibrary("dll.dll"))==NULL) return 1; PFN_MyFunction pfnMyFunction; pfnMyFunction=(PFN_MyFunction)GetProcAddress(hMyDll,"MyFunction"); int iCode=(*pfnMyFunction)(); FreeLibrary(hMyDll); return 0; } Это сообщение отредактировал(а) D_BuG - 9.11.2004, 11:00 |
|||
|
||||
shedon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1209 Регистрация: 17.1.2003 Где: Нижнiй Новгородъ Репутация: 4 Всего: 11 |
Если вызываешь функцию из динамически подключённой длл'ки, то тебе ещё надо добавить функцию в таблицу экспорта в *.def файл.
Например так:
Что возвращают LoadLibrary() и GetProcAddress() ? -------------------- Programming is like sex: One mistake and you have to support it your lifetime |
|||
|
||||
D_BuG |
|
||||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 9.11.2004 Репутация: нет Всего: нет |
Про .def неподумал что он обязателен. LoadLibrary() - адрес длл GetProcAddress() - NULL :-( То есть длл подгружается, а функцию вызвать никак :-( |
||||
|
|||||
shedon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1209 Регистрация: 17.1.2003 Где: Нижнiй Новгородъ Репутация: 4 Всего: 11 |
Вызови GetLastError и посмотри код ошибки... -------------------- Programming is like sex: One mistake and you have to support it your lifetime |
|||
|
||||
D_BuG |
|
||||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 9.11.2004 Репутация: нет Всего: нет |
Вот что получилось: d:\lcc\projects\dll\loaddll\lcc\loaddll.exe Starting...OK! LoadLibrary...OK! Error:0 GetProcAddress...Failed! Error:127 Вот сам исходник: #include <windows.h> typedef int (*PFN_MyFunction)(char *); int main(int argc,char *argv[]) { printf("Starting...OK!\n"); HINSTANCE hMyDll; if((hMyDll=LoadLibrary("dll.dll"))==NULL) { printf("LoadLibrary...Failed!\nError:%d\n",GetLastError()); return -1; } else { printf("LoadLibrary...OK!\n"); } PFN_MyFunction pfnMyFunction; pfnMyFunction=(PFN_MyFunction)GetProcAddress(hMyDll,"MyFunction"); if(pfnMyFunction==NULL) { printf("GetProcAddress...Failed!\nError:%d\n",GetLastError()); return -1; } else { printf("GetProcAddress...OK!\n"); } int iCode=(*pfnMyFunction)(""); FreeLibrary(hMyDll); return 0; } |
||||
|
|||||
shedon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1209 Регистрация: 17.1.2003 Где: Нижнiй Новгородъ Репутация: 4 Всего: 11 |
127 - Не найдена указанная процедура
Ты добавил функцию в деф файл ? и убери в исходниках библиотеки __declspec(dllexport) -------------------- Programming is like sex: One mistake and you have to support it your lifetime |
|||
|
||||
D_BuG |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 9.11.2004 Репутация: нет Всего: нет |
Да уже довно добавил..... и всё равно ненайдена :-( Вот щас на Visual .NET c++ съделал: extern "C" __declspec(dllexport) void MyFunction(); extern "C" __declspec(dllexport) void MyFunction() { printf("I'm MyFunction()!!!\n"); } И всё работает на УРА! d:\lcc\projects\dll\loaddll\lcc\loaddll.exe Starting...OK! LoadLibrary...OK! GetProcAddress...OK! I'm MyFunction()!!! А в LCC нехочет.... Где же может ещё быть собака зарыта???? |
|||
|
||||
Tatarin |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 5.1.2004 Где: Россия Репутация: нет Всего: нет |
про __declspec в MSDN сказано:
Microsoft Specific т.е. это фича чисто микрософтовская и их компилятора... Для других компиляторов надо либо использовать DEF-файл, либо читать хелп к нему - может у него тоже подобные трюки есть |
|||
|
||||
D_BuG |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 9.11.2004 Репутация: нет Всего: нет |
Спасибо большое всем!(особенно shedon за оперативность :-))
Решение нашол :-) Вопрос снят. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |