Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1080554509
СержК
2004-03-29 14:01
2004.04.18
Синхронизация системного времени


7-1075920853
Rim
2004-02-04 21:54
2004.04.18
Параметры панели задач


1-1080473055
Александр из Минска
2004-03-28 15:24
2004.04.18
КАК разбить на листы при печати TStringGrid?


14-1080041696
Rouse_
2004-03-23 14:34
2004.04.18
Названия :)))


7-1076701323
Khabibulin
2004-02-13 22:42
2004.04.18
Volume





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский