Форум: "Основная";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.037 c