Уже пол дня бъюсь на проблемой:
Функция возвращяет неправильные результаты вычисления и после закрытия приложения вываливается "Invalid Pointer Operation".
Причём если функцию описать в приложении, то всё работает как надо и ничего не вываливается.
Помогите разобраться с причаними
DLL код:
Код:
uses
ShareMem
. . . . .
function ExtractFileName(FilePath: PChar; ShowExtension: byte): PChar;
var
FNameLength, CopyLength: Word;
FNameTrunc: PChar;
begin
FNameLength := Length(FilePath);
CopyLength := FNameLength;
case ShowExtension of
0: begin
while (FilePath[FNameLength] <> '\') and (FNameLength > 0) do
Dec(FNameLength);
if FNameLength <> 0 then
FNameTrunc := PChar(Copy(FilePath, FNameLength + 2, CopyLength-FNameLength))
else
FNameTrunc := Pchar('');
end;
1: begin
while (FilePath[FNameLength] <> '\') and (FNameLength > 0) do
Dec(FNameLength);
if FNameLength <> 0 then
Begin
FNameTrunc := PChar(Copy(FilePath, FNameLength + 2, CopyLength-FNameLength));
FNameLength :=Length(FNameTrunc);
while (FNameTrunc[FNameLength] <> '.') and (FNameLength > 0) do
Dec(FNameLength);
FNameTrunc := PChar(Copy(FNameTrunc, 1, FNameLength));
End
else
FNameTrunc := PChar('');
end;
2: begin
FNameTrunc := PChar(FilePath);
end;
else
FNameTrunc := PChar('Incorrect input value in Case. Use 0 - Name+Ext; 1 - Name; 2 - full path; Only!');
end;
Result := FNameTrunc;
End;
. . . .
exports
ExtractFileName;
Эта функция находится в DLL и предназначения для отделения имени файла от его расширения. Как видно, она имеет 3 режима в зависимости от переданных параметров:
1)Отделить имя и расшир от пути;
2) отделить имя от пути и расшир;
3) собственно ничего не делать.
Вызываю из программы её таким способом:
Код:
procedure Button1.Click(Sender: TObject);
var
ExtractFileName : Function(FilePath: PChar; ShowExtension: byte) : PChar; Stdcall;
DLLInstance : THandle;
GettedFileName : String;
begin
OpenWordFile(FileOpen1.Dialog.FileName);
@ExtractFileName := nil; //Очищаем адресс функции от мусора
DLLInstance := LoadLibrary(PChar('Main.dll')); //Подгружаем DLL к приложению
if (DLLInstance = 0) then
begin
MessageDlg('Невозможно загрузить DLL', mtError, [mbOK], 0);
Exit;
end;
try
@ExtractFileName := GetProcAddress(DLLInstance, 'ExtractFileName'); //Пытаемся вызвать из DLL указанную фунцию
if Assigned(@ExtractFileName) then
Begin
GettedFileName := 'Файл:' + ' ' + StrPas(ExtractFileName(Pchar(FileOpen1.Dialog.FileName), 0));
AddTextInDB.StatusBar.Panels.Items[0].Text := GettedFileName;
End
else
MessageDlg('Искомая функция не найдена!', mtError, [mbOK], 0);
finally
FreeLibrary(DLLInstance);
end;
End;
Так же очень буду признателен за критику стиля написания кода и наличие\отсутствие нужных на ваш взгляд моментов.