0 / 0 / 0
Регистрация: 17.09.2015
Сообщений: 2
|
|
1 | |
Работа с DLL06.02.2011, 18:22. Показов 872. Ответов 0
Метки нет Все метки)
(
В общем смысл такой, есть библиотека, которая должна возвращать два значения. Одно интовское и одно текстовое. Какой длины будет тест я узнаю только в библиотеке, соответственно и память выделять надо в ней под char*, так как ансистринги лучше не использовать. Значит вот исходники..
Файл cpp библиотеки Код: c 1. //--------------------------------------------------------------------------- 2. #include <vcl.h> 3. #include <windows.h> 4. 5. char * s = "Библиотека для работы с RAR"; 6. 7. #pragma argsused 8. int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) 9. { 10. return 1; 11. } 12. //--------------------------------------------------------------------------- 13. 14. extern "C" void __stdcall __declspec(dllexport) GetDllName(char **NameDll, int * TypeDll) 15. { 16. *NameDll = (char*)malloc(sizeof(s)); 17. *NameDll = strcpy(*NameDll,s); 18. *TypeDll = 38; 19. } 20. extern "C" void __stdcall __declspec(dllexport) FreeDllMemory(char ** NameDll, int * TypeDll) 21. { 22. free(*NameDll); 23. } //--------------------------------------------------------------------------- #include <vcl.h> #include <windows.h> char * s = "Библиотека для работы с RAR"; #pragma argsused int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { return 1; } //--------------------------------------------------------------------------- extern "C" void __stdcall __declspec(dllexport) GetDllName(char **NameDll, int * TypeDll) { *NameDll = (char*)malloc(sizeof(s)); *NameDll = strcpy(*NameDll,s); *TypeDll = 38; } extern "C" void __stdcall __declspec(dllexport) FreeDllMemory(char ** NameDll, int * TypeDll) { free(*NameDll); } Далее файл h проги Код: c 1. //--------------------------------------------------------------------------- 2. 3. #ifndef function2H 4. #define function2H 5. 6. //--------------------------------------------------------------------------- 7. typedef void __stdcall (__import * NameDllType(char **, int *)); 8. typedef void __stdcall (__import * FreeDllType(char **, int *)); 9. NameDllType * FunctionDllName;//тип описан в h модуле 10. FreeDllType * FreeDllFunc; 11. 12. void LoadLibraryDlls(); 13. #end //--------------------------------------------------------------------------- #ifndef function2H #define function2H //--------------------------------------------------------------------------- typedef void __stdcall (__import * NameDllType(char **, int *)); typedef void __stdcall (__import * FreeDllType(char **, int *)); NameDllType * FunctionDllName;//тип описан в h модуле FreeDllType * FreeDllFunc; void LoadLibraryDlls(); #end файл cpp проги, точнее одна функця одного модуля..не важно. Эта функция берет из папки кучу библиотек dll и ищет в них одну и те же функции FreeDllMemory и GetDllName. Когда в папке одна библиотека, код срабатывает..когда две и более...то глючит на второй..ошибка с памтью AV на функции dlls_name_array = NameDll когда вызывает уже второй раз (i=2) а в NameDll полная фигня, хотя в первый раз все ок; И еще такая тема!!!!! Когда в цикле второй раз вызывается FunctionDllName(&NameDll,&TypeDll); в нее по F8 не заходит, хотя точки останова в библиотекке стоят. Может функция тупо не срабатывает??? ПОМОГИТЕ В ОБЩЕМ!!! dlls_name_array = NameDll; dlls_ext_array = "RAR"; Переменные массивы выше - Ансистринги , объявленные в проге. Надо чтоб в них по выходу из функции LoadLibraryDlls() были значения. Проблема скорее всего в NameDll. Как ее правильно объявлять, выделять память и т.п. Код: c 1. void LoadLibraryDlls() 2. { 3. TSearchRec sr; 4. int i = 1; 5. if (FindFirst(ExtractFilePath(Application->ExeName) + "plugins\\*.DLL", faAnyFile, sr) == 0) 6. { 7. do 8. { 9. if ((sr.Attr & faDirectory) == 0) 10. { 11. if (UpperCase(ExtractFileExt(sr.Name)) == ".DLL") 12. { 13. AnsiString sss = ExtractFilePath(Application->ExeName) + "plugins\\" + sr.Name; 14. HINSTANCE lib = LoadLibrary(sss.c_str()); 15. if(lib) 16. { 17. FunctionDllName = (NameDllType *)GetProcAddress(lib,"GetDllName"); 18. FreeDllFunc = (FreeDllType *)GetProcAddress(lib,"FreeDll"); 19. if (FunctionDllName) 20. { 21. char * NameDll; 22. int TypeDll = 0; 23. FunctionDllName(&NameDll,&TypeDll); 24. dlls_name_array[i] = NameDll; 25. dlls_ext_array[i] = "RAR"; 26. //FreeDllFunc(&NameDll,&TypeDll); 27. NameDll = NULL; 28. i++; 29. } 30. } 31. FreeLibrary(lib); 32. } 33. } 34. } while (FindNext(sr) == 0); 35. FindClose(sr); 36. dlls_name_array[i] = "ERROR"; 37. dlls_ext_array[i] = "ERROR"; 38. } 39. }
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|
06.02.2011, 18:22 | |
Ответы с готовыми решениями:
0
Кто может поделиться файлами ogg.dll, vorbis.dll и vorbisfile.dll - 32-х и 64-битными версиями? Работа с DLL Windows I/o без Kernel32.dll и Advapi32.dll При компиляции DLL-проекта не создается DLL-ка |
06.02.2011, 18:22 | |
Помогаю со студенческими работами здесь
1
Работа с dll Работа с библиотеками dll Работа с DLL ом, загляните на 1 минуту Builder 2009 работа со статической dll? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |