Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.18;
Скачать: CL | DM;

Вниз

Access violation при использовании функции из DLL   Найти похожие ветки 

 
Jul   (2004-03-30 20:56) [0]

Привет, есть такой код:

procedure TForm1.Button2Click(Sender: TObject);
var GetXciFileName : TGetXciFileName;
begin
 @GetXciFileName := nil;
 LibHandle := LoadLibrary("fileutl.dll");
 if LibHandle <> 0 then begin
   @GetXciFileName  := GetProcAddress(LibHandle,"GetXciFileName");
   if @GetXciFileName <> nil then
     ShowMessage(GetXciFileName("test"));
 end;
 FreeLibrary(LibHandle);
end;

// in DLL
function GetFileName(FileName: PChar): PChar; stdcall;
var AppIni: TIniFile;
   ValueList: TStringList;
   IniFolder, TmpFolder: string;
   IniName: string;
begin
try
       // get field name test
       IniFolder:="C:\TEMP\";
       IniName:="test.txt";
       ValueList:=TStringList.Create;
       AppIni := TIniFile.Create(IniFolder+IniName);
       // do something
       AppIni.Free;
       ValueList.Free;
       TmpFolder:=_GetTempPath();
       CopyFile(PChar(IniFolder+IniName),PChar(TmpFolder+"\"+IniName),false);
       TmpFolder:=TmpFolder+"\"+IniName;
       Result:=PChar(TmpFolder);
except
on e:exception do begin
   Result:= "ERROR";
end;
end;

exports GetFileName;


так вот, если я GetFileName как результат присваиваю что-нибудь типа "OK", то ошибки нет при вызове функции, а если Result:=PChar(TmpFolder);, то возникает Access violation в вызывающей программе. К чему бы это?


 
TUser ©   (2004-03-30 20:59) [1]

PChar - это указатель на локальный "объект". После завершения выполнения функции этого объекта уже нет. Поэтому - AV. Кажется Vuk недавно хорошо описывал, как этого избегать. Смысл в том, что надо память выделять ручками.


 
panov ©   (2004-03-30 21:00) [2]

А ShareMem используется?


 
Jul   (2004-03-30 21:04) [3]

uses
 ShareMem,
 SysUtils,
 Classes, Dialogs, IniFiles, Windows;

спасибо - используется.
Я вроде искала про это, но не нашла в существующих. Может можно еще пару наводящих фраз.


 
Юрий Зотов ©   (2004-03-30 21:18) [4]

> Jul   (30.03.04 21:04) [3]

Для параметров PChar ипользование ShareMem ничего не дает. Если Ваша DLL предназначена только для Delphi-программ, то замените PChar на string, подключите ShareMem (к EXE и к DLL) и забудьте обо всех проблемах. Если нет - то уберите ShareMem и выделяйте под PChar память в ВЫЗЫВАЮЩЕМ модуле (то есть, в Exe). В нем же ее и освобождайте.


 
Jul   (2004-03-30 21:22) [5]

Спасибо.



Страницы: 1 вся ветка

Текущий архив: 2004.04.18;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.034 c
3-1080117156
Шурик Ш
2004-03-24 11:32
2004.04.18
Не получается создать числовое поле заданной точности!


1-1080572787
Xobbit
2004-03-29 19:06
2004.04.18
PopupMenu и чужое окно


1-1081073944
jiuraf
2004-04-04 14:19
2004.04.18
TOleContainer и запароленый файл


11-1062155159
Dimaxx
2003-08-29 15:05
2004.04.18
KOLDHTMLEDIT не удаляется по Free!!!


1-1080655599
lehich
2004-03-30 18:06
2004.04.18
отработка закрытия файла