Главная страница
    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.043 c
1-1080642232
Timego
2004-03-30 14:23
2004.04.18
Подскажите, пожалуйста, хорошую книгу по Delphi для начинающих


3-1080037845
}|{yk
2004-03-23 13:30
2004.04.18
Поддержание синхронности БД


1-1080526986
Алексей Петухов
2004-03-29 06:23
2004.04.18
Excel, обратный вызов?


1-1080586827
Gero
2004-03-29 23:00
2004.04.18
DragAndDrop в TTreeView


11-1062795120
Immortal_Death
2003-09-06 00:52
2004.04.18
Resource





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