Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Совместное использование . [D7, WinXP]


tytus ©   (2004-12-02 16:24:00) 

Добрый день мастера. В основном модуле отображаю txt файл в память. Хочу написать dll которая бы видела этот отображенный файл, считала с него строку, и передала в основную прогу. Подскажите пожалуйста идею или куском кода.


tytus   (2004-12-03 11:15:00) [1]

>LVT
AV конечно, ...его так..
Тогда и в главном модуле stdcall не нужно.
Про длину строки я забыл.
SetLength(s,62);
А возвращается указатель на начало строки и ровно до конца файла -- RE1.Lines.Add(Result);
Спасибо.


Leonid Troyanovsky   (2004-12-03 10:49:00) [2]


> 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 10:03:00) [3]

>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-02 22:44:00) [4]


> tytus   (02.12.04 16:24)  
> Добрый день мастера. В основном модуле отображаю txt файл
> в память. Хочу написать dll которая бы видела этот отображенный
> файл, считала с него строку, и передала в основную прогу.
> Подскажите пожалуйста идею или куском кода.


В dll передается PChar полученный путем MapViewOfFile,
а возвращается адрес(PChar) начала найденной строки и ее длина.
Ну, и это, конечно, в предположении, что просмотр открыт на
весь файл.

--
С уважением, LVT.


Наверх

Титульная страница Поиск, карта сайта Написать письмо