Главная страница
    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.45 MB
Время: 0.036 c
14-1080246459
Ломброзо
2004-03-25 23:27
2004.04.18
Хехех.. "Во вторник Земля налетит на небесную ось"


3-1079728481
Igoryok
2004-03-19 23:34
2004.04.18
По сути про собственные репликации


14-1080392583
X9
2004-03-27 16:03
2004.04.18
DLL на Turbo Pascal


1-1080494148
able
2004-03-28 21:15
2004.04.18
Поиск ссылок (картинки)


3-1079894810
Игорь
2004-03-21 21:46
2004.04.18
Запрос по таблице в памяти





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский