| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Создание dll в LCC |
| Автор: Гость_Andy 9.11.2004, 10:16 |
| Плиз, хелп! Неполучается создать dll модуль в lcc, точнее dll создаётся, но функций из неё я вызвать не могу! В чём может быть дело? Заранее благодарен за помощь. |
| Автор: shedon 9.11.2004, 10:17 |
| Я с таким компилятором не работал, но опиши подробнее как функции экспортируешь/импортируешь , как загружаешь длл, как вызываешь функцию ? |
| Автор: D_BuG 9.11.2004, 10:37 |
| Это 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; } |
| Автор: shedon 9.11.2004, 11:05 | ||
| Если вызываешь функцию из динамически подключённой длл'ки, то тебе ещё надо добавить функцию в таблицу экспорта в *.def файл. Например так:
Что возвращают LoadLibrary() и GetProcAddress() ? |
| Автор: D_BuG 9.11.2004, 11:12 | ||||
Про .def неподумал что он обязателен. LoadLibrary() - адрес длл GetProcAddress() - NULL :-( То есть длл подгружается, а функцию вызвать никак :-( |
| Автор: shedon 9.11.2004, 11:22 | ||
Вызови GetLastError и посмотри код ошибки... |
| Автор: D_BuG 9.11.2004, 13:53 | ||||
Вот что получилось: 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 9.11.2004, 14:14 |
| 127 - Не найдена указанная процедура Ты добавил функцию в деф файл ? и убери в исходниках библиотеки __declspec(dllexport) |
| Автор: D_BuG 9.11.2004, 14:23 | ||
Да уже довно добавил..... и всё равно ненайдена :-( Вот щас на 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 10.11.2004, 03:32 |
| про __declspec в MSDN сказано: Microsoft Specific т.е. это фича чисто микрософтовская и их компилятора... Для других компиляторов надо либо использовать DEF-файл, либо читать хелп к нему - может у него тоже подобные трюки есть |
| Автор: D_BuG 10.11.2004, 12:42 |
| Спасибо большое всем!(особенно shedon за оперативность :-)) Решение нашол :-) Вопрос снят. |