HackingMemory Опубликовано 4 ноября, 2014 Поделиться Опубликовано 4 ноября, 2014 Всем привет. У меня тут возникла проблема. Я пишу dll-ку, в которой есть определенный набор API функций(она написана на С++). Так же есть Delphi приложение, в котором я и собираюсь вызывать функции. procedure TForm2.Button1Click(Sender: TObject); var libHandle:THandle; Printf:function(text:PChar):Boolean; // Возможно тут ошибка, ибо не PChar, а что то другое.begin libHandle:= LoadLibrary('MyLib.dll'); // Подгружаем библиотеку @Printf:= GetProcAddress(libHandle,'lib_Printf');//Получаем ее адрес Printf('Hello world'); //Вызываем функцию из ее FreeLibrary(libHandle);// Выгружаемend;После чего в приложении создается консоль и по идее должна выводиться эта надпись, но вместо этой надписи появляется всякий бред. Вот сам код вызываемой функции #define EXPORT extern "C" __declspec (dllexport)EXPORT bool lib_Printf(char* text){CreateConsole(); // Описание ее думаю не нужноprintf("Text : ");printf(text);return true;} Результат: В чем проблема? Как вывести изначально задуманный текст(Hello world)?Надеюсь на помощь, спасибо. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 4 ноября, 2014 Поделиться Опубликовано 4 ноября, 2014 В конце прототипа функции stdcall нужно добавить в дельфях. Попробуй, возможно, поможет. Все дело в типе передачи парамеров. stdcall (или thiscall) как раз и поясняют тип передачи параметров для функции. Ссылка на комментарий Поделиться на другие сайты Поделиться
HackingMemory Опубликовано 4 ноября, 2014 Автор Поделиться Опубликовано 4 ноября, 2014 Проблема решена. Решение:procedure TForm2.Button1Click(Sender: TObject);var libHandle:THandle;Printf:function(text: PAnsiChar): Boolean; stdcall; // Изменил тип на PAnsiChar и добавил stdcall;beginlibHandle:= LoadLibrary('MyDLL.dll');@Printf:= GetProcAddress(libHandle,'lib_Printf');Printf('Hello world');FreeLibrary(libHandle);end;Спасибо! Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения