Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.20;
Скачать: CL | DM;

Вниз

работа с DLL и ее интерфейсами   Найти похожие ветки 

 
JohnnySE   (2006-07-05 11:50) [0]

Есть бинарный файл, как его прочитать и передать в dll у которой есть интерфейс IzlibEngine c методами pkCompress(Istream* lpstrmFrom, IStream* lpstrmTo) и pkDecompress(Istream* lpstrmFrom, IStream* lpstrmTo)


 
guav ©   (2006-07-05 13:53) [1]

Использовать TStreamAdapter для TFileStream


 
JohnnySE   (2006-07-05 17:04) [2]

unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ActiveX, StdCtrls, ZLENGINELib_TLB;
type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
izl : izlibEngine;
iw : iUnknown; ff : Text;
const zG : tGUID = "{C5276425-F299-11D0-8149-004095E1F439}";
zlibG : tGuid = "{C5276436-F299-11D0-8149-004095E1F439}";
izg : tGuid = "{C5276445-F299-11D0-8149-004095E1F439}";
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
var
FileStreamIn: TFileStream;
FileStreamOut: TFileStream;
StreamIn: IStream;
StreamOut: IStream;
FileNameIn: String;
FileNameOut: String;
begin // читаем файл
// НАЗНАЧАЕМ ПУТЬ К ФАЙЛУ
FileNameIn:= "C:\sea\in.bin";
FileNameOut:= "C:\sea\Out.txt";
FileStreamIn := TFileStream.Create(FileNameIn, fmCreate);
FileStreamOut := TFileStream.Create(FileNameOut, fmCreate);
StreamIn := TStreamAdapter.Create(FileStreamIn, soReference);
StreamOut := TStreamAdapter.Create(FileStreamOut, soReference);
izl.pkdecompress(StreamIn as IStream,StreamOut as IStream);
... здесь вылетает ошибка.
/////////////////////////////////////////////
в ZLENGINELib_TLB
IzlibEngine = interface(IUnknown)
["{C5276445-F299-11D0-8149-004095E1F439}"]
procedure pkDecompress(const lpstrmFrom, lpstrmTo: IStream); safecall;
end;


 
guav ©   (2006-07-05 18:03) [3]

> ... здесь вылетает ошибка.

Какая ?


> izl : izlibEngine;

Как осуществляется присвоение этой переменной значения ?
ZLENGINELib_TLB - сгенерированный по команде Import Type Library ? Тогда там должен быть класс CozlibEngine, и izl должен быть инициализирован так: izl := CozlibEngine.Create;


> FileStreamIn := TFileStream.Create(FileNameIn, fmCreate);

Для открытия для чтения должно быть fmOpenRead


 
JohnnySE   (2006-07-06 09:15) [4]

За fmOpenRead - спасибо, совсем заработался
Ошибка
Project Project2.exe raised exception class EAccessViolation with message "Access violation at address 0045EC9E in module "Project2.exe". Read of address 00000000".

вот текст ZLENGINELib_TLB

unit ZLENGINELib_TLB;

{ This file contains pascal declarations imported from a type library.
 This file will be written during each import or refresh of the type
 library editor.  Changes to this file will be discarded during the
 refresh process. }
{ zlEngine 1.0 Type Library }
{ Version 1.0 }
interface
uses Windows, ActiveX, Classes, Graphics, OleCtrls, StdVCL;
const
 LIBID_ZLENGINELib: TGUID = "{C5276436-F299-11D0-8149-004095E1F439}";
const
{ Component class GUIDs }
 Class_zlibEngine: TGUID = "{C5276425-F299-11D0-8149-004095E1F439}";
 Class_jpegEngine: TGUID = "{E196D997-FB8C-11D0-AE1D-D9180F4C4641}";
 Class_tiffEngine: TGUID = "{E196D999-FB8C-11D0-AE1D-D9180F4C4641}";
type
{ Forward declarations: Interfaces }
 IzlibEngine = interface;
 ISequentialStream = interface;
 IjpegEngine = interface;
 ItiffEngine = interface;
{ Forward declarations: CoClasses }
 zlibEngine = IzlibEngine;
 jpegEngine = IjpegEngine;
 tiffEngine = ItiffEngine;
 _LARGE_INTEGER = record
   QuadPart: Comp;
 end;
 _FILETIME = record
   dwLowDateTime: UINT;
   dwHighDateTime: UINT;
 end;
 _ULARGE_INTEGER = record
   QuadPart: Largeuint;
 end;
 tagSTATSTG = record
   pwcsName: PWideChar;
   atype: UINT;
   cbSize: _ULARGE_INTEGER;
   mtime: _FILETIME;
   ctime: _FILETIME;
   atime: _FILETIME;
   grfMode: UINT;
   grfLocksSupported: UINT;
   clsid: TGUID;
   grfStateBits: UINT;
   reserved: UINT;
 end;
{ IzlibEngine Interface }
 IzlibEngine = interface(IUnknown)
   ["{C5276445-F299-11D0-8149-004095E1F439}"]
   procedure pkZip(pszCommandLine: PWideChar); safecall;
   procedure pkUnzip(pszCommandLine: PWideChar); safecall;
   procedure pkCompress(const lpstrmFrom, lpstrmTo: IStream); safecall;
   procedure pkDecompress(const lpstrmFrom, lpstrmTo: IStream); safecall;
 end;
 ISequentialStream = interface(IUnknown)
   ["{0C733A30-2A1C-11CE-ADE5-00AA0044773D}"]
   procedure RemoteRead(out pv: Shortint; cb: UINT; out pcbRead: UINT); safecall;
   procedure RemoteWrite(var pv: Shortint; cb: UINT; out pcbWritten: UINT); safecall;
 end;
{ IjpegEngine Interface }
 IjpegEngine = interface(IUnknown)
   ["{E196D996-FB8C-11D0-AE1D-D9180F4C4641}"]
   procedure CreateDIBFromJPEG(pszPathName: PWideChar; var hBitmap: SYSUINT); safecall;
 end;
{ ItiffEngine Interface }
 ItiffEngine = interface(IUnknown)
   ["{E196D998-FB8C-11D0-AE1D-D9180F4C4641}"]
   procedure CreateDIBFromTIFF(pszPathName: PWideChar; var hBitmap: SYSUINT); safecall;
 end;
{ zlibEngine Class }
 CozlibEngine = class
   class function Create: IzlibEngine;
   class function CreateRemote(const MachineName: string): IzlibEngine;
 end;
{ jpegEngine Class }
 CojpegEngine = class
   class function Create: IjpegEngine;
   class function CreateRemote(const MachineName: string): IjpegEngine;
 end;
{ tiffEngine Class }
 CotiffEngine = class
   class function Create: ItiffEngine;
   class function CreateRemote(const MachineName: string): ItiffEngine;
 end;
implementation
uses ComObj;
class function CozlibEngine.Create: IzlibEngine;
begin
 Result := CreateComObject(Class_zlibEngine) as IzlibEngine;
end;
class function CozlibEngine.CreateRemote(const MachineName: string): IzlibEngine;
begin
 Result := CreateRemoteComObject(MachineName, Class_zlibEngine) as IzlibEngine;
end;
class function CojpegEngine.Create: IjpegEngine;
begin
 Result := CreateComObject(Class_jpegEngine) as IjpegEngine;
end;
class function CojpegEngine.CreateRemote(const MachineName: string): IjpegEngine;
begin
 Result := CreateRemoteComObject(MachineName, Class_jpegEngine) as IjpegEngine;
end;
class function CotiffEngine.Create: ItiffEngine;
begin
 Result := CreateComObject(Class_tiffEngine) as ItiffEngine;
end;
class function CotiffEngine.CreateRemote(const MachineName: string): ItiffEngine;
begin
 Result := CreateRemoteComObject(MachineName, Class_tiffEngine) as ItiffEngine;
end;
end.


 
guav ©   (2006-07-06 14:00) [5]

> Ошибка
> Project Project2.exe raised exception class EAccessViolation
> with message "Access violation at address 0045EC9E in module
> "Project2.exe". Read of address 00000000".

ошибка свидетельствует об обращении к нулевому адресу, что обычно происходит при попытке раобты с нулевым указателем.

> izl.pkdecompress(StreamIn as IStream,StreamOut as IStream);

т.к. StreamIn и StreamOut присваиваются выше, похоже что izl = nil

см. [3] guav ©   (05.07.06 18:03)

> izl должен быть инициализирован так: izl := CozlibEngine.Create;


 
JohnnySE   (2006-07-06 15:23) [6]

СПАСИБО. Все получилось



Страницы: 1 вся ветка

Текущий архив: 2006.08.20;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.082 c
1-1152080166
ancot
2006-07-05 10:16
2006.08.20
Цвет TMainMenu


3-1150353422
s_t_d
2006-06-15 10:37
2006.08.20
Отображение длинных текстов в DBGrid


15-1153722652
Yuri Btr
2006-07-24 10:30
2006.08.20
Как создать компонент SysTreeView32+SysListView32


6-1143652902
chizra
2006-03-29 21:21
2006.08.20
Почтовый клиент через почтовый прокси...


2-1154079558
Ega23
2006-07-28 13:39
2006.08.20
Разрушается ли Glyph у SpeedButton?