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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.03.2012, 19:22
sVAR sVAR вне форума
Прохожий
 
Регистрация: 11.03.2012
Сообщения: 2
Репутация: 10
Сообщение Проблема при работе с файлами внешней процедуры

Есть элементарная dll-ка. Например:
Код:
library www;
uses SysUtils;
//{$R *.res}
procedure xxx(inf : pstring);stdcall;
var str:ansistring; ft:textfile;
begin
  assignfile(ft,inf^);
  reset(ft);
  readln(ft,str);
  closefile(ft);
end;
exports xxx;
begin
end.

Есть её подключение в exe-модуле:


Код:
program test;
{$APPTYPE CONSOLE}
uses SysUtils;

procedure xxx(fname : pstring);stdcall;external 'www.dll';//procedure's initialization

label _FILE_MISSING;
var ss:string;
BEGIN
    write('Enter textfile name (without extension .TXT) ');
    readln(ss);
    ss:=ss+'.txt';
    if FileExists(ss)=false then goto _FILE_MISSING
      writeln('Input file - ',ss);
      xxx(@ss);
      write('Proceed is SUCCESSFUL! ');
_FILE_MISSING:
END.

Проблема такова: при выполнении кода assignfile(ft,inf^) вылазит ошибка 'The specified file was not found'.
Я так понимаю, что у dll-модуля нет доступа к строковой переменной, указанной через поинтер inf^ потому, что она, наверное, не глобальная (т.е. не видима за пределами exe-модуля).

В любом случае, всё это - странно.

Подскажите, как быть и что делать. Или объясните, пожалуйста, в чём моё недопонимание.

Последний раз редактировалось sVAR, 11.03.2012 в 19:58.
Ответить с цитированием
  #2  
Старый 11.03.2012, 19:48
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Стоит попробовать в целях дебага перед AssignFile вывести полученную строку через ShowMessage(inf^); или через WriteLn(inf^); Строка должна быть "видна", она же по адресу передается.
И проверить наличие файла в рабочей папке exe-файла.

UPD: только что скомпилировал Ваш код. У меня в Delphi XE работает нормально. Модифицировал всего чуть-чуть:
Код:
program tst;

{$APPTYPE CONSOLE}

uses
  SysUtils;

procedure xxx(fname : pstring);stdcall;external 'www.dll';//procedure's initialization

var ss: String;
    i:integer;

begin
   write('Enter textfile name (without extension .TXT) ');
    readln(ss);
    ss:=ss+'.txt';
    if FileExists(ss) then
    begin
      writeln('Input file - ',ss);
      xxx(@ss);
      write('Proceed is SUCCESSFUL! ');
      readln;
    end;
end.
Но сути это не должно менять. В теории может быть такое, что какая-то несостыковка с типами строк. Можно попробовать использовать функцию с таким заголовком:
Код:
procedure xxx(fname : AnsiString);stdcall;external 'www.dll';//procedure's initialization
Ну и соответственно поменять в DLL-ке (и использовать без "^") и ss сделать AnsiString для упрощения. Так у меня тоже работает.
Если же планируется изменение строки - передавать как VAR параметр.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 11.03.2012 в 20:11.
Ответить с цитированием
  #3  
Старый 11.03.2012, 20:30
sVAR sVAR вне форума
Прохожий
 
Регистрация: 11.03.2012
Сообщения: 2
Репутация: 10
По умолчанию

Спасибо большое за быстрый отклик, но я уже сам разобрался.

В действительности проблема была в кодировке, которая идёт для русского языка через консоль (там вроде используется cp866).

Дело в том, что я не глянул, что проблема только с файлами с русскоязычными названиями.

А к общему итогу, действительно использовать нужно ansistring и pansistring и всегда будет порядок!
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter