Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вызов функции из DLL: Башня кипит! [D4, Win2k]


Страницы:   1 2

Быстрый Шу ©   (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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо