我是个物理学家。我正在尝试用一个导入的activex控件(ocx文件)在Delphi上工作。假设库中有3个自动化接口: IGraph、IGraphAxes和IAxis。库的结构是这样的:
=IGraph的properties:===
Idispatch* IGraphAxes;
... //其他成员
===IGraphAxes的properties:===
Idispatch* XAxis;
Idispatch* YAxis;
Idispatch* ZAxis;
整型颜色;
整型风格;
…//其他成员
===IAxis properties:===
浮点最小,最大;
布尔ShowNumbers;
…//其他成员
在IGraph中,我可以使用GetIDsOfNames()和Invoke()函数访问IGraphAxes (颜色和样式)的简单成员。但是,当我尝试访问XAxis (或YAxis,Zaxis)时,它会产生一个错误。首先,我使用GetIDsOfNames(),它返回XAxis的调度it,没有任何问题。但是,当我使用该调度I调用Invoke时,出现错误“Access violation at address…”。看起来,idispatch指针(**X轴)*没有指向任何内容。我该如何解决这个问题呢?如何制作
Idispatch* Xaxis
和
IAxis接口是否相互连接?
另外,对不起我的英语,我不是以英语为母语的人。
发布于 2010-09-12 15:07:47
Delphi内置了对Invoke后期绑定的支持,因此您不需要直接调用IDispatch ()。只需像访问普通属性一样访问成员,Delphi将在幕后为您调用Invoke()。
如果您想直接调用Invoke(),请显示实际失败的代码。AV很可能是由于代码中的错误,而不是OCX本身。
发布于 2010-09-20 12:53:11
感谢您的回复。实际上,activex控件是用于绘制某些3d图形的第三方可视化组件。下面是activex库的内容:
uuid(...),
版本(x.x),
helpstring(“三维图形模块”),
控制,
自定义(...,...),
自定义(...,...)
库GraphLib
{
importlib(“stdoe2.tlb”);
uuid(...),
helpstring(“3D图形控制调度接口”),
隐藏
显示接口_IGraph
{
属性:
id(0x0000006)
IDispatch * GraphAxes(...);
方法:
id(0x0000001)
byte AddScatterGraph(...);
id(0x0000002)
byte AddVectorFieldGraph(...);
id(0x0000003)
byte AddParametricSurfaceGraph(...);
id(0x0000004)
byte AddSurfaceGraph(...);
id(0x0000005)
字节RemoveGraphs(空);
};
uuid(...),
helpstring(“三维图形控件”),
控制
coclass cGraph
{
默认显示接口_IGraph;
默认值,源调度接口_IGraphEvents;
};
uuid(...)
显示接口IGraphAxis
{
属性:
id(0x00000001)
字节编号;
id(0x00000002)
double Min;
id(0x00000003)
双倍最大值;
id(0x00000004)
short GridNum;
id(0x00000005)
字节ShowLabel;
方法:
};
uuid(...)
coclass cGraphAxis
{
默认显示接口IGraphAxis;
};
uuid(...)
显示接口IGraphAxes
{
属性:
id(0x00000001)
IDispatch * XAxis;
id(0x00000002)
IDispatch * YAxis;
id(0x00000003)
IDispatch * ZAxis;
id(0x00000004)
整型颜色;
id(0x00000005)
整型风格;
方法:
};
uuid(...)
coclass cGraphAxes
{
默认显示接口IGraphAxes;
};
uuid(...),
helpstring(“三维图形控件的事件接口”)
显示接口_IGraphEvents
{
属性:
方法:
id(0xFFFFFDA3)
无效MouseDown(…);
id(0xFFFFFDA8)
void单击…);
id(0xFFFFFDA7)
无效DblClick(…);
id(0xFFFFFDA6)
无效KeyDown(…);
id(0xFFFFFDA5)
无效KeyPress(…);
id(0xFFFFFDA4)
无效KeyUp(…);
id(0xFFFFFDA2)
无效MouseMove(…);
id(0xFFFFFDA1)
无效MouseUp(…);
};
};
发布于 2010-09-20 14:55:11
下面是从类型库生成的单元文件。
单元GraphLib_TLB;
// ************************************************************************
// The types declared in this file were generated from data read from a
// Type Library. If this type library is explicitly or indirectly (via
// another type library referring to this type library) re-imported, or the
// 'Refresh' command of the Type Library Editor activated while editing the
// Type Library, the contents of this file will be regenerated and all
// manual modifications will be lost.
// ************************************************************************ //
// ************************************************************************ //
// Type Lib: graph3d.ocx (1)
// LIBID: {...}
// LCID: 0
// HelpString: 3-D Graph module
// DepndLst:
// (1) v2.0 stdole, (C:\Windows\system32\stdole2.tlb)
// ************************************************************************ //
{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
interface
uses Windows, ActiveX, Classes, Graphics, OleCtrls, OleServer, StdVCL, Variants;
// *********************************************************************//
// GUIDS declared in the TypeLibrary. Following prefixes are used:
// Type Libraries : LIBID_xxxx
// CoClasses : CLASS_xxxx
// DISPInterfaces : DIID_xxxx
// Non-DISP interfaces: IID_xxxx
// *********************************************************************//
const
// TypeLibrary Major and minor versions
GraphLibMajorVersion = x;
GraphLibMinorVersion = x;
LIBID_GLLib: TGUID = '{...}';
DIID__IGraph: TGUID = '{...}';
DIID__IGraphEvents: TGUID = '{...}';
CLASS_cGraph: TGUID = '{...}';
DIID_IGraphAxis: TGUID = '{...}';
CLASS_cGraphAxis: TGUID = '{...}';
DIID_IGraphAxes: TGUID = '{...}';
CLASS_cGraphAxes: TGUID = '{...}';
type
// *********************************************************************//
// Forward declaration of types defined in TypeLibrary
// *********************************************************************//
_IGraph = dispinterface;
_IGraphEvents = dispinterface;
IGraphAxis = dispinterface;
IGraphAxes = dispinterface;
// *********************************************************************//
// Declaration of CoClasses defined in Type Library
// (NOTE: Here we map each CoClass to its Default Interface)
// *********************************************************************//
cGraph = _IGraph;
cGraphAxis = IGraphAxis;
cGraphAxes = IGraphAxes;
// *********************************************************************//
// Declaration of structures, unions and aliases.
// *********************************************************************//
PWideString1 = ^WideString; {*}
PShortint1 = ^Shortint; {*}
PSmallint1 = ^Smallint; {*}
// *********************************************************************//
// DispIntf: _IGraph
// Flags: (4112) Hidden Dispatchable
// GUID: {...}
// *********************************************************************//
_IGraph = dispinterface
['{...}']
function AddScatterGraph(...): {??Shortint}OleVariant; dispid 1;
function AddVectorFieldGraph(...): {??Shortint}OleVariant; dispid 2;
function AddParametricSurfaceGraph(...): {??Shortint}OleVariant; dispid 3;
function AddSurfaceGraph(...): {??Shortint}OleVariant; dispid 4;
function RemoveGraphs: {??Shortint}OleVariant; dispid 5;
property GraphAxes: IDispatch dispid 6;
end;
// *********************************************************************//
// DispIntf: _IGraphEvents
// Flags: (4096) Dispatchable
// GUID: {...}
// *********************************************************************//
_IGraphEvents = dispinterface
['{...}']
procedure MouseDown(); dispid -605;
procedure Click; dispid -600;
procedure DblClick; dispid -601;
procedure KeyDown(...); dispid -602;
procedure KeyPress(...); dispid -603;
procedure KeyUp(...); dispid -604;
procedure MouseMove(...); dispid -606;
procedure MouseUp(...); dispid -607;
procedure ReadyStateChange; dispid -609;
end;
// *********************************************************************//
// DispIntf: IGraphAxis
// Flags: (4096) Dispatchable
// GUID: {...}
// *********************************************************************//
IGraphAxis = dispinterface
['{...}']
property Numbered: {??Shortint}OleVariant dispid 1;
property Min: Double dispid 2;
property Max: Double dispid 3;
property GridNum: Smallint dispid 4;
property ShowLabel: {??Shortint}OleVariant dispid 5;
end;
// *********************************************************************//
// DispIntf: IGraphAxes
// Flags: (4096) Dispatchable
// GUID: {...}
// *********************************************************************//
IGraphAxes = dispinterface
['{...}']
property XAxis: IDispatch dispid 1;
property YAxis: IDispatch dispid 2;
property ZAxis: IDispatch dispid 3;
property Color: Integer dispid 4;
property Style: Smallint dispid 5;
end;
// *********************************************************************//
// OLE Control Proxy class declaration
// Control Name : TGraph
// Help String : 3-D Graph Control
// Default Interface: _IGraph
// Def. Intf. DISP? : Yes
// Event Interface: _IGraphEvents
// TypeFlags : (34) CanCreate Control
// *********************************************************************//
TGraph = class(TOleControl)
private
FOnError: TGraphError;
FOnReadyStateChange: TNotifyEvent;
FIntf: _IGraph;
function GetControlInterface: _IGraph;
protected
procedure CreateControl;
procedure InitControlData; override;
function Get_GraphAxes: IDispatch;
procedure Set_GraphAxes(const Value: IDispatch);
public
function AddScatterGraph(...): {??Shortint}OleVariant;
function AddVectorFieldGraph(...): {??Shortint}OleVariant;
function AddParametricSurfaceGraph(...): {??Shortint}OleVariant;
function AddSurfaceGraph(...): {??Shortint}OleVariant;
function RemoveGraphs: {??Shortint}OleVariant;
property ControlInterface: _IGraph read GetControlInterface;
property DefaultInterface: _IGraph read GetControlInterface;
property GraphAxes: IDispatch index 6 read GetIDispatchProp write SetIDispatchProp;
published
//properties visible in the Object Inspector go here
...
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnStartDrag;
property OnMouseUp;
property OnMouseMove;
property OnMouseDown;
property OnKeyUp;
property OnKeyPress;
property OnKeyDown;
property OnDblClick;
property OnClick;
property OnError: TGraphError read FOnError write FOnError;
property OnReadyStateChange: TNotifyEvent read FOnReadyStateChange write FOnReadyStateChange;
end;
// *********************************************************************//
// The Class CocGraphAxis provides a Create and CreateRemote method to
// create instances of the default interface IGraphAxis exposed by
// the CoClass cGraphAxis. The functions are intended to be used by
// clients wishing to automate the CoClass objects exposed by the
// server of this typelibrary.
// *********************************************************************//
CocGraphAxis = class
class function Create: IGraphAxis;
class function CreateRemote(const MachineName: string): IGraphAxis;
end;
// *********************************************************************//
// The Class CocGraphAxes provides a Create and CreateRemote method to
// create instances of the default interface IGraphAxes exposed by
// the CoClass cGraphAxes. The functions are intended to be used by
// clients wishing to automate the CoClass objects exposed by the
// server of this typelibrary.
// *********************************************************************//
CocGraphAxes = class
class function Create: IGraphAxes;
class function CreateRemote(const MachineName: string): IGraphAxes;
end;
procedure Register;
resourcestring
dtlServerPage = 'ActiveX';
dtlOcxPage = 'ActiveX';
implementation
uses ComObj;
procedure TGraph.InitControlData;
const
CEventDispIDs: array [0..1] of DWORD = (...);
CLicenseKey: array[0..33] of Word = ($006F, ..., ..., e.g.);
CControlData: TControlData2 = (
ClassID: '{...}';
EventIID: '{...}';
EventCount: 2;
EventDispIDs: @CEventDispIDs;
LicenseKey: @CLicenseKey;
Flags: $00000000;
Version: 401);
begin
ControlData := @CControlData;
TControlData2(CControlData).FirstEventOfs := Cardinal(@@FOnError) - Cardinal(Self);
end;
procedure TGraph.CreateControl;
procedure DoCreate;
begin
FIntf := IUnknown(OleObject) as _IGraph;
end;
begin
if FIntf = nil then DoCreate;
end;
function TGraph.GetControlInterface: _IGraph;
begin
CreateControl;
Result := FIntf;
end;
function TGraph.Get_GraphAxes: IDispatch;
begin
Result := DefaultInterface.GraphAxes;
end;
procedure TGraph.Set_GraphAxes(const Value: IDispatch);
begin
DefaultInterface.GraphAxes := Value;
end;
function TGraph.AddScatterGraph(...): {??Shortint}OleVariant;
begin
Result := DefaultInterface.AddScatterGraph(...);
end;
function TGraph.AddVectorFieldGraph(...): {??Shortint}OleVariant;
begin
Result := DefaultInterface.AddVectorFieldGraph(...);
end;
function TGraph.AddParametricSurfaceGraph(...): {??Shortint}OleVariant;
begin
Result := DefaultInterface.AddParametricSurfaceGraph(...);
end;
function TGraph.AddSurfaceGraph(...): {??Shortint}OleVariant;
begin
Result := DefaultInterface.AddSurfaceGraph(...);
end;
function TGraph.RemoveGraphs: {??Shortint}OleVariant;
begin
Result := DefaultInterface.RemoveGraphs;
end;
class function CocGraphAxis.Create: IGraphAxis;
begin
Result := CreateComObject(CLASS_cGraphAxis) as IGraphAxis;
end;
class function CocGraphAxis.CreateRemote(const MachineName: string): IGraphAxis;
begin
Result := CreateRemoteComObject(MachineName, CLASS_cGraphAxis) as IGraphAxis;
end;
class function CocGraphAxes.Create: IGraphAxes;
begin
Result := CreateComObject(CLASS_cGraphAxes) as IGraphAxes;
end;
class function CocGraphAxes.CreateRemote(const MachineName: string): IGraphAxes;
begin
Result := CreateRemoteComObject(MachineName, CLASS_cGraphAxes) as IGraphAxes;
end;
procedure Register;
begin
RegisterComponents(dtlOcxPage, [TGraph]);
end;
end.https://stackoverflow.com/questions/3693637
复制相似问题