Главная страница
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.043 c
1-1080590699
Shopot
2004-03-30 00:04
2004.04.18
Горячие клавиши в Delphi.


8-1072982130
SaM[87]
2004-01-01 21:35
2004.04.18
Размер изображения!


14-1080045191
Rule
2004-03-23 15:33
2004.04.18
Кто знает как связатся с MDFE?


3-1079468454
Zhenja
2004-03-16 23:20
2004.04.18
Index is out of date


4-1076152288
Kolyan
2004-02-07 14:11
2004.04.18
DispatchMessage &amp; TranslateMessage