Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вызов dll функции из dll написанной на С / 7 сообщений из 7, страница 1 из 1
26.05.2007, 12:59
    #34553154
Dima Yermak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов dll функции из dll написанной на С
Подскажите как это проще всего реализовать. Функция будет вызыватса из длл написанной на делфи.

Нашёл в интернете пару статей как это сделать, но они настолько запутанные что у меня ничего не получилось.

Желательно если у кого есть пример.

P.S. Желательно с большим количеством коментариев.

Заранее благодарен за все советы.
...
Рейтинг: 0 / 0
26.05.2007, 13:29
    #34553179
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов dll функции из dll написанной на С
Dima Yermak wrote:

> Подскажите как это проще всего реализовать. Функция будет вызыватса из длл
> написанной на делфи.
Из *.dll, написанной на дельфи, нужно вызвать функцию *.dll, сделанной на C,
я правильно понял?
Тогда (если я правильно помню - это давно было :)) в проекте дельфийской
*.dll нужно сделать модуль, где будут определения функций из C-шной *.dll.
C-шные функции должны быть обьявлены в implementation как external.
Типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
unit MyDllHelper;
interface
uses
    windows,sysutils;
function myC_DllFunction(parameter: integer): boolean; cdecl;
implementation
function myC_DllFuncion(Parameter: integer): boolean; external 'myCDll.dll';
end.
cdecl - это способ передачи аргументов в функцию. (За объяснением лезем в
справку). Доп примеры можно посмотреть, например, в Windows.pas и
OpenGLpas.

Если нужно сделать наоборот - из C-шной *.dll вызвать функцию дельфийской
*.dll, то можно, например, использовать LoadLibrary и GetProcAddress..


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
26.05.2007, 13:43
    #34553191
Dima Yermak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов dll функции из dll написанной на С
Спасибо за ответ, но просто у меня уже мозг варитса.

НОАДО НАОБОРОТ из сишной dll вызывать функцию из делфийской.

Проблема в том что у меня нет опыта работы с си.
Так что желательно полный пример использования LoadLibrary и GetProcAddress.

Заранее благодарен
...
Рейтинг: 0 / 0
26.05.2007, 16:09
    #34553267
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов dll функции из dll написанной на С
Dima Yermak wrote:

> Так что желательно полный пример использования LoadLibrary и
> GetProcAddress.
вот . За пять минут находится, плюс 100%я гарантия, что
точно такой же имеется в дельфийской и сишной справке.

ещё вариант (но уже посложнее :))
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
....
        HMODULE hDll = LoadLibrary("MyDll.dll");
        if (hDll){
                void (*myfunc)(DWORD arg) = (void (*)(DWORD
arg))GetProcAddress(hDll, "MyFunc"); 
                if (myfunc){
                        (*myfunc)((DWORD) 123 );
                }
        }
....

Жутко выглядящая строчка "void (*myfunc)(DWORD arg)" объявляет указатель на
функцию, а (void(*)(DWORD arg))GetProcAddress кастит возвращаемое
GetProcAddress значение в указатель на функцию. (*myfunc)((DWORD)123) -
собственно вызов функции.

Указатель на функцию можно определить typedef'ом, тогда запись будет проще:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
typedef void (*funcptr)(DWORD arg);
....
        HMODULE hDll = LoadLibrary("MyDll.dll");
        if (hDll){
                funcptr myfunc = (funcptr)GetProcAddress(hDll, "MyFunc"); 
                if (myfunc){
                        (*myfunc)((DWORD) 123 );
                }
        }
....     

Далее, дельфйске функции надо будет приводить к сишным аналогом Так,
напримр:
"void func(DWORD arg);"
это аналог дельфийского "procedure func(arg: DWORD); cdecl;"

если у вас MSVC, то, скорее всего (синтаксис просто уже не помню)
"void __stdcall func(DWORD arg);"
будет аналогом
"procedure func(arg: DWORD); stdcall)";
и т.д.

Кроме того, ряд утилит (какие именно - не помню :) - дело давно было)
генерят *.lib файлы, которые позволяют избежать прописывания GetProcAddress
для каждой функции.
Рекомедую почитать вот тут и
вот
тут
.

Потом опять же, ресурсы/примеры на эту тему легко гуглом находятся...
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
29.05.2007, 11:54
    #34557357
Dima Yermak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов dll функции из dll написанной на С
Огромное спасибо.
Получилось.

Правда пришлось использовать явную загрузку DLL в связи с конкретной задачей.
...
Рейтинг: 0 / 0
29.05.2007, 13:18
    #34557705
Dima Yermak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов dll функции из dll написанной на С
И снова здравствуйте :)

Появилась новая проблемка: не передаютса параметры в функцию в Delphi DLL функцию.

Делаю следующим образом
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
typedef void (*pFunction)(LPTSTR, LPTSTR, LPTSTR, LPTSTR);
pFunction pAdd;

lib = LoadLibrary("c:\\MY_DLL.dll");

pAdd = (pFunction)GetProcAddress(lib, "openEditor");
(pAdd)("URL","LOGIN","PASSWORD","MENU_NAME"); 

соответсвенно функция которая вызываетса

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 function  openEditor(url: PChar;login: PChar; password: PChar; menuName: PChar):boolean; export; stdcall;
 var  form: TForm1;
 begin 
  form := TForm1.Create( nil );
  form.login := login;
  form.password := password;
  form.url := url;
  form.menuName := menuName;
  form.ShowModal();
  form.Free;
  Result:=true;
 end ;

 exports  openEditor name 'openEditor';

функция вызываетса как бы с пустыми параметрами.

Подскажите пожалуйста как решить эту проблему.

P.S. После таких изменений, после отработки (pAdd)("URL","LOGIN","PASSWORD","MENU_NAME"); выскакивает ошибка
...
Рейтинг: 0 / 0
29.05.2007, 13:35
    #34557783
Dima Yermak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов dll функции из dll написанной на С
Всё вопрос закрыт разобрался.


Всем спасибо громадное, сыкономили мне кучу времени.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вызов dll функции из dll написанной на С / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]