![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Cpp DLL и Delphi App... [D5, Win95/98, Win2k]
Landgraph © (2002-08-30 09:50:00)На C++ написана библиотека со следующей функцией:
extern"C" char __export*asd( char*text)
{
MessageBox(0, text, "tst", 0);
return "asd";
}
Библиотека динамически загружается программой:
procedure TForm1.Button1Click(Sender: TObject);
var
dll:HWND;
asd: function(text:PChar):PChar;
begin
@asd:=nil;
dll:=LoadLibrary("dll.dll");
if(dll>=32) then
begin
asd:=GetProcAddress(dll, "_asd");
if(@asd=nil) then MessageBox(Handle, "NO FUNC!", "damn!", 0)
else
begin
Memo1.Lines.Add(asd("TEST MSG"));
end;
end;
FreeLibrary(dll);
end;
В результате работы получается, что функция возвращает "asd", но MessageBox выдает отнюдь не "TEST MSG", а какие-то отвлеченные символы.
Вопрос: Что не так? И вообще, какие типы надо использовать в качестве параметров функции?
Заранее спасибо.
Suntechnic (2002-08-30 17:58:00) [1]Пересмотри логику программы. То, что ты пытаешься делать, либо абсурд, либо приведёт к memory leak.
Zelius (2002-08-30 11:16:00) [2]код в корне не правильный! Потому что возвращая таким образом строку ты обретешь проблемы, например подвисшей памяти или нарушения доступа! Советую выделять буфер перед вызовом ф-ии!
Странный Прохожий (2002-08-30 10:41:00) [3]type
asdfunct = function(text:PChar):PChar; cdecl; // !!!
// <...>
procedure TForm1.Button1Click(Sender: TObject);
var
dll:HWND;
asd: asdfunct
// <...>
т.е. забыли cdecl.
c0pYc@t (2002-08-30 09:57:00) [4]там как я заметил
> asd(char *text)
стоит указатель, когда выводишь, ты его разименовываешь?