Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.04.2012, 18:58
Yo_Asakyra Yo_Asakyra вне форума
Прохожий
 
Регистрация: 18.12.2011
Сообщения: 11
Репутация: 10
Восклицание DLL с приложением. Проблемы их взаимопонимания

Уже пол дня бъюсь на проблемой:
Функция возвращяет неправильные результаты вычисления и после закрытия приложения вываливается "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.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:18.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025