![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов функции из DLL: Башня кипит! [D4, Win2k]
Быстрый Шу © (2005-03-02 11:45:00)Добрый день, уважаемые!
Возникла проблема:
Есть DLL, в которой есть такая вот функция:
function ss:string;В вызывающей программе есть функция вызова:
begin
ss:='2222';
end;
function CallStrInOutDLLFunc(LibraryName:String; FuncName:String;InParams:String;FuncKind:Integer):String;И есть кнопка, по нажатию которой выполняется код:
var
hwnd:integer;
TempFunc1:function(s:string):String;
TempFunc2:function:String;
TempFunc3:procedure;
TempFunc4:procedure(p:String);
begin
case FuncKind of
1:begin
//нам это неинтересно...
end;
2: begin
try
hwnd := LoadLibrary ( PChar(LibraryName) );
if hwnd <> 0 then
begin
@TempFunc2 := GetProcAddress ( hwnd, PChar(FuncName) );
if addr ( TempFunc2 ) <> nil then
begin
Result:=TempFunc2;//точка №1
end
else
begin
ShowMessage ( 'Функция "'+FuncName+'" не найдена в библиотеке: '+LibraryName );
Result:='Failed';
end;
end
else
ShowMessage ( 'Библиотека не найдена: '+LibraryName );
finally
FreeLibrary ( hwnd );
end;
end;
3:begin
//это тоже пропускаем...
end;
4:begin
//ну и это тоже...
end;
end;//case//
end;
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
begin
s:=CallStrInOutDLLFunc('MyForms.DLL','ss','',2);//точка №2
ShowMessage(s);
end;
//----------------------------
так вот, дебаггер пишет, что в точке №1 result = '2222', то есть, то что мне и надо, НО после выхода из процедуры CallStrInOutDLLFunc, в точке №2
тот же дабаггер пишет, что s = Inaccessible value
и на showmessage вылетает "Access violation по адресу бла-бла-бла"
я так понимаю, что он типа память что ли освободил и т.д. и потерял значение, но где, и как мне его не теряя вывести и получить?
У (2005-03-02 12:30:00) [21]2Быстрый Шу (02.03.05 12:20) [4]
Это кто тебе сказал?
И если уж система PChar не поддерживает (в чём я сомневаюсь)
- то дельфёвый AnsiString она 101%-но не поддерживает.
Быстрый Шу (2005-03-02 12:20:00) [22]На PChar менять нельзя, система, откуда потом эта функция будет вызываться этот тип не поддерживает...
Быстрый Шу (2005-03-02 12:12:00) [23]Поставил ShareMem и в дллке и в вызывающем модуле, терь он на выходе из процедуры вызова CallStrInOutDLLFunc пишет:
"Invalid pointer operation"
Smithson (2005-03-02 11:50:00) [24]ShareMem стоит? А вообще лучше в DLL (и из нее) передавать не строки, а PChar. Идеологически правильнее.
TUser (2005-03-02 11:49:00) [25]uses ShareMem;