![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Уже пол дня бъюсь на проблемой:
Функция возвращяет неправильные результаты вычисления и после закрытия приложения вываливается "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; Так же очень буду признателен за критику стиля написания кода и наличие\отсутствие нужных на ваш взгляд моментов. Последний раз редактировалось Yo_Asakyra, 27.04.2012 в 19:04. |