Текущий архив: 2004.12.19;
Скачать: CL | DM;
Вниз
Совместное использование . Найти похожие ветки
← →
tytus (2004-12-02 16:24) [0]Добрый день мастера. В основном модуле отображаю txt файл в память. Хочу написать dll которая бы видела этот отображенный файл, считала с него строку, и передала в основную прогу. Подскажите пожалуйста идею или куском кода.
← →
Leonid Troyanovsky (2004-12-02 22:44) [1]
> tytus (02.12.04 16:24)
> Добрый день мастера. В основном модуле отображаю txt файл
> в память. Хочу написать dll которая бы видела этот отображенный
> файл, считала с него строку, и передала в основную прогу.
> Подскажите пожалуйста идею или куском кода.
В dll передается PChar полученный путем MapViewOfFile,
а возвращается адрес(PChar) начала найденной строки и ее длина.
Ну, и это, конечно, в предположении, что просмотр открыт на
весь файл.
--
С уважением, LVT.
← →
tytus (2004-12-03 10:03) [2]>LVT
Выдает AE!
library AdphSearch;
uses
ShareMem, Windows, SysUtils, Classes;
{$R *.res}
procedure GetAdphData(const AdphFile,SearchStr:PChar;var ResultStr:PChar);stdcall;
begin
ResultStr:=StrPos(AdphFile,SearchStr);
end;
exports
GetAdphData;
begin
end.
//Основной модуль
implementation
{$R *.dfm}
procedure GetAdphData(const AdphFile,SearchStr:PChar;
var ResultStr:PChar);stdcall external "ADPHSEARCH.DLL";
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
Result:PChar;
FH:=FileOpen(OpenDialog1.FileName,fmOpenRead or fmShareDenyNone);
if FH=INVALID_HANDLE_VALUE then
raise Exception.Create("Ошибка открытия файла.");
GetFileInformationByHandle(FH,FilInfo);
FilSize:=FilInfo.nFileSizeLow+FilInfo.nFileSizeHigh;
ObjMapHandle:=CreateFileMapping(FH,0,PAGE_READONLY,0,
FilSize,nil);
DataFileMap:=MapViewOfFile(ObjMapHandle,FILE_MAP_READ,0,0,FilSize);
GetAdphData(DataFileMap,PChar("BAE31"),Result);
move(Result^,Pointer(s)^,62);
RE1.Lines.Add(s);//RE1-RichEdit
← →
Leonid Troyanovsky (2004-12-03 10:49) [3]
> tytus (03.12.04 10:03) [2]
> Выдает AE!
AV (Access violation) ?
> library AdphSearch;
>
> uses
> ShareMem, Windows, SysUtils, Classes;
В данном случае, ShareMem и не нужно.
>
> {$R *.res}
> procedure GetAdphData(const AdphFile,SearchStr:PChar;var
> ResultStr:PChar);stdcall;
В данном случае stdcall и не нужно.
> ResultStr:=StrPos(AdphFile,SearchStr);
В данном случае безопасней поиск, ограниченный по длине,
скажем, размером файла. Бо mmf здесь не ограничен #0.
> //Основной модуль
> var
> s:string;
..
> move(Result^,Pointer(s)^,62);
Т.е., память для s будет выделять Пушкин?
Я ж говорил, нужно возвращать из dll длину строки.
Ее и пользуй в SetLength/SetString.
--
С уважением, LVT.
← →
tytus (2004-12-03 11:15) [4]>LVT
AV конечно, ...его так..
Тогда и в главном модуле stdcall не нужно.
Про длину строки я забыл.
SetLength(s,62);
А возвращается указатель на начало строки и ровно до конца файла -- RE1.Lines.Add(Result);
Спасибо.
Страницы: 1 вся ветка
Текущий архив: 2004.12.19;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.036 c