![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
работа с DLL и ее интерфейсами [D7, WinXP]
JohnnySE © (2006-07-05 11:50:00)Есть бинарный файл, как его прочитать и передать в dll у которой есть интерфейс IzlibEngine c методами pkCompress(Istream* lpstrmFrom, IStream* lpstrmTo) и pkDecompress(Istream* lpstrmFrom, IStream* lpstrmTo)
JohnnySE (2006-07-06 15:23:00) [1]СПАСИБО. Все получилось
guav (2006-07-06 14:00:00) [2]> Ошибка
> 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 09:15:00) [3]За 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-05 18:03:00) [4]> ... здесь вылетает ошибка.
Какая ?
> izl : izlibEngine;
Как осуществляется присвоение этой переменной значения ?
ZLENGINELib_TLB - сгенерированный по команде Import Type Library ? Тогда там должен быть класс CozlibEngine, и izl должен быть инициализирован так: izl := CozlibEngine.Create;
> FileStreamIn := TFileStream.Create(FileNameIn, fmCreate);
Для открытия для чтения должно быть fmOpenRead
JohnnySE (2006-07-05 17:04:00) [5]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 13:53:00) [6]Использовать TStreamAdapter для TFileStream