Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
skylinetmk
0 / 0 / 0
Регистрация: 17.09.2015
Сообщений: 2
#1

Работа с DLL - C++

06.02.2011, 18:22. Просмотров 698. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2011, 18:22
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Работа с DLL (C++):

Кто может поделиться файлами ogg.dll, vorbis.dll и vorbisfile.dll - 32-х и 64-битными версиями? - C++
Движок перевожу на платформу Win64 и нужно, чтобы разрядность ЕХЕ и DLL совпадали, а в интернете искал 64-битные версии ogg.dll, vorbis.dll...

Работа с DLL - C++
У меня такая проблема не могу экспортировать функцию с шаблоном без шаблона она без проблем работает. Название функции BubleSort. *.cpp ...

При компиляции DLL-проекта не создается DLL-ка - C++
Добрый день. создал в Visual Studio 2010 проект C+= типа DLL. В файл dllmain.cpp вставил вот такой код: // test.cpp: определяет...

Windows I/o без Kernel32.dll и Advapi32.dll - C++
Добрый день. Необходимо в Windows XP SP3 распечатать в стандартный поток &quot;some text here&quot; без прямого или косвенного использования...

Работа с dll - C++ Builder
Здравствуйте! Пишу программу с dll-кой. Код написала, все подключила. Но не могу разобраться, как правильно вызвать ее в основной...

Работа с библиотеками dll - C++ Builder
Здравствуйте уважаемые форумчане, заранее прошу прощения если задаю вопрос ответ на который здесь уже бы. (Долго искал но не нашел) ...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2011, 18:22
Привет! Вот еще темы с ответами:

Работа с DLL ом, загляните на 1 минуту - C++ Builder
Здрасте всем, создаваю длл по примером, и пытаюс истользовать его в моём приложение вот код из моего приложение: ...

Builder 2009 работа со статической dll? - C++ Builder
Товарищи кто ни будь работал в Builder 2009 со статически связной dll? После добавления в проект файла .lib (который с dll создался...

Ошибка об отсутствии MSVCP140D.dll, ucrtbased.dll, CONCRT140D.dll, VCRUNTIME140D.dll - Visual C++
Добрый день, товарищи. Возникла проблема. Делаю программу с использованием openCV 3.1 на Visual Studio 2013. При компиляции выдает ошибку...

Затупил, скажите где взять libmysqld.dll, libmysqld50.dll, libmysqld51.dll - MySQL
Вечер добрый, ставлю ZEOS на Delphi 7, и для нормальной работы нужны файлы libmysqld.dll, libmysqld50.dll, libmysqld51.dll. Но я нигде...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru