![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Есть элементарная 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
|
||||
|
||||
|
Стоит попробовать в целях дебага перед 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 Если же планируется изменение строки - передавать как VAR параметр. Последний раз редактировалось Bargest, 11.03.2012 в 20:11. |
|
#3
|
|||
|
|||
|
Спасибо большое за быстрый отклик, но я уже сам разобрался.
В действительности проблема была в кодировке, которая идёт для русского языка через консоль (там вроде используется cp866). Дело в том, что я не глянул, что проблема только с файлами с русскоязычными названиями. А к общему итогу, действительно использовать нужно ansistring и pansistring и всегда будет порядок! |