- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个 COM 服务器,以允许第三方程序自动化我的程序。鉴于我需要传递具有大量属性的对象,我正在尝试创建方法来创建此类对象以供客户端使用。
(这样做的目的是允许客户端程序创建可以传递回主 COM 对象中其他函数的文档;这些文档对象包含许多没有实际功能的属性。)
给定以下类(class):
编辑:我现在在返回函数上使用TAutoObject
,但只是因为我想减少做意外事情的机会 - 代码主要是生成的通过 Delphi 向导“新自动化对象”。
编辑 2:直接从消费程序创建 Bar 对象与该程序完美配合,但这并不理想,因为在很多情况下我想创建一个对象作为来自用户发起的操作。
// ************************************************************************ //
// WARNING
// -------
// This file is generated by the Type Library importer or Type Libary Editor.
// Barring syntax errors, the Editor will parse modifications made to the file.
// However, when applying changes via the Editor this file will be regenerated
// and comments or formatting changes will be lost.
// ************************************************************************ //
// File generated on 14-08-2014 11:36:16 (- $Rev: 12980 $, 1111483734).
[
uuid(94A2B97E-553F-4A4A-9DAD-84D7C96DBEFD),
version(1.0)
]
library FooTest
{
importlib("stdole2.tlb");
interface IFoo;
coclass Foo;
interface IBar;
coclass Bar;
[
uuid(1C220E81-3794-4F09-ACA7-10D690AF4D92),
dual,
oleautomation
]
interface IFoo: IDispatch
{
[id(0x000000C9)]
HRESULT _stdcall NewBar([out, retval] IBar* Res);
};
[
uuid(B2FAD09E-58F9-43B8-95E1-5E962D1D6115),
helpstring("Dispatch interface for Bar Object"),
dual,
oleautomation
]
interface IBar: IDispatch
{
};
[
uuid(1FEB672A-3289-4CD8-BB27-8077BCE00FA8)
]
coclass Foo
{
[default] interface IFoo;
};
[
uuid(2C3B9E1F-12F4-4BD8-A047-B9DFCB60B4C9),
helpstring("Bar Object")
]
coclass Bar
{
[default] interface IBar;
};
};
unit FooTest_TLB;
// ************************************************************************ //
// WARNING
// -------
// 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.
// ************************************************************************ //
// $Rev: 34747 $
// File generated on 14-08-2014 11:26:20 from Type Library described below.
// ************************************************************************ //
// Type Lib: D:\Projects\Delphi\Pruebas\OLE - StackOverflow\FooTest (1)
// LIBID: {94A2B97E-553F-4A4A-9DAD-84D7C96DBEFD}
// LCID: 0
// Helpfile:
// HelpString:
// DepndLst:
// (1) v2.0 stdole, (C:\Windows\SysWOW64\stdole2.tlb)
// ************************************************************************ //
{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
{$ALIGN 4}
interface
uses Windows, ActiveX, Classes, Graphics, 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
FooTestMajorVersion = 1;
FooTestMinorVersion = 0;
LIBID_FooTest: TGUID = '{94A2B97E-553F-4A4A-9DAD-84D7C96DBEFD}';
IID_IFoo: TGUID = '{1C220E81-3794-4F09-ACA7-10D690AF4D92}';
CLASS_Foo: TGUID = '{1FEB672A-3289-4CD8-BB27-8077BCE00FA8}';
IID_IBar: TGUID = '{B2FAD09E-58F9-43B8-95E1-5E962D1D6115}';
CLASS_Bar: TGUID = '{2C3B9E1F-12F4-4BD8-A047-B9DFCB60B4C9}';
type
// *********************************************************************//
// Forward declaration of types defined in TypeLibrary
// *********************************************************************//
IFoo = interface;
IFooDisp = dispinterface;
IBar = interface;
IBarDisp = dispinterface;
// *********************************************************************//
// Declaration of CoClasses defined in Type Library
// (NOTE: Here we map each CoClass to its Default Interface)
// *********************************************************************//
Foo = IFoo;
Bar = IBar;
// *********************************************************************//
// Interface: IFoo
// Flags: (4416) Dual OleAutomation Dispatchable
// GUID: {1C220E81-3794-4F09-ACA7-10D690AF4D92}
// *********************************************************************//
IFoo = interface(IDispatch)
['{1C220E81-3794-4F09-ACA7-10D690AF4D92}']
function NewBar: IBar; safecall;
end;
// *********************************************************************//
// DispIntf: IFooDisp
// Flags: (4416) Dual OleAutomation Dispatchable
// GUID: {1C220E81-3794-4F09-ACA7-10D690AF4D92}
// *********************************************************************//
IFooDisp = dispinterface
['{1C220E81-3794-4F09-ACA7-10D690AF4D92}']
function NewBar: IBar; dispid 201;
end;
// *********************************************************************//
// Interface: IBar
// Flags: (4416) Dual OleAutomation Dispatchable
// GUID: {B2FAD09E-58F9-43B8-95E1-5E962D1D6115}
// *********************************************************************//
IBar = interface(IDispatch)
['{B2FAD09E-58F9-43B8-95E1-5E962D1D6115}']
end;
// *********************************************************************//
// DispIntf: IBarDisp
// Flags: (4416) Dual OleAutomation Dispatchable
// GUID: {B2FAD09E-58F9-43B8-95E1-5E962D1D6115}
// *********************************************************************//
IBarDisp = dispinterface
['{B2FAD09E-58F9-43B8-95E1-5E962D1D6115}']
end;
// *********************************************************************//
// The Class CoFoo provides a Create and CreateRemote method to
// create instances of the default interface IFoo exposed by
// the CoClass Foo. The functions are intended to be used by
// clients wishing to automate the CoClass objects exposed by the
// server of this typelibrary.
// *********************************************************************//
CoFoo = class
class function Create: IFoo;
class function CreateRemote(const MachineName: string): IFoo;
end;
// *********************************************************************//
// The Class CoBar provides a Create and CreateRemote method to
// create instances of the default interface IBar exposed by
// the CoClass Bar. The functions are intended to be used by
// clients wishing to automate the CoClass objects exposed by the
// server of this typelibrary.
// *********************************************************************//
CoBar = class
class function Create: IBar;
class function CreateRemote(const MachineName: string): IBar;
end;
implementation
uses ComObj;
class function CoFoo.Create: IFoo;
begin
Result := CreateComObject(CLASS_Foo) as IFoo;
end;
class function CoFoo.CreateRemote(const MachineName: string): IFoo;
begin
Result := CreateRemoteComObject(MachineName, CLASS_Foo) as IFoo;
end;
class function CoBar.Create: IBar;
begin
Result := CreateComObject(CLASS_Bar) as IBar;
end;
class function CoBar.CreateRemote(const MachineName: string): IBar;
begin
Result := CreateRemoteComObject(MachineName, CLASS_Bar) as IBar;
end;
end.
unit Foos;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
ComObj, ActiveX, FooTest_TLB, StdVcl, Bars;
type
TFoo = class(TAutoObject, IFoo)
protected
function NewBar: IBar; safecall;
end;
implementation
uses ComServ;
function TFoo.NewBar: IBar;
begin
Result := TBar.Create;
end;
initialization
TAutoObjectFactory.Create(ComServer, TFoo, Class_Foo, ciMultiInstance,
tmApartment);
end.
unit Bars;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
ComObj, ActiveX, FooTest_TLB, StdVcl;
type
TBar = class(TAutoObject, IBar)
protected
end;
implementation
uses ComServ;
initialization
TAutoObjectFactory.Create(ComServer, TBar, Class_Bar,
ciMultiInstance, tmApartment);
end.
using FooTest;
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
Foo foo;
public Form1()
{
InitializeComponent();
foo = new Foo();
}
private void button2_Click(object sender, EventArgs e)
{
var obj = foo.NewBar();
}
}
}
我可以从客户端程序创建 TFoo
对象,但是当我调用 NewBar
时,一旦它返回,我就会遇到访问冲突。
这是从 COM 函数返回 COM 对象的正确方法吗?
最佳答案
嗯,答案似乎就在 RIDL 代码中:
HRESULT _stdcall NewBar([out, retval] IBar* Res);
我只需将其更改为使用双指针:
HRESULT _stdcall NewBar([out, retval] IBar** Res);
我通过阅读这份令人难以置信的简洁文档得到了这个答案:Building COM Components by Binh Ly :
Note that interface pointers are pointers to vtables. Therefore, they are represented in IDL with at least 1 level of indirection using the asterisk (*) symbol. When defining interface pointers as [out] params, we'll also need another extra level of indirection. Thus:
interface IEcho: IDispatch {
HRESULT _stdcall YouGotMe( [out] IEcho** Param );
};procedure TEcho.YouGotMe(out Param: IEcho);
begin
//return IEcho pointer to self
Param := Self;
end;
如果您正在考虑进行一些 COM 编程,请务必首先阅读 his site 中的所有文章。 .
关于delphi - 从 TAutoObject 返回 TAutoIntfObject 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25297749/
有没有一种方法可以使用标准类型构造函数(例如 int、set、dict、list、tuple 等)以用户定义的方式将用户定义类的实例强制转换为其中一种类型?例如 class Example:
我知道这个问题在Stackoverflow中有很多问题,但是即使有很多答案,这些答案也帮不了我什么,也没有找到答案。 在我的WebAPP中,它可以正常工作,但是当我将其转换为API时,它失败了(主题标
这个问题已经有答案了: Why does the ternary operator unexpectedly cast integers? (3 个回答) 已关闭 9 年前。 最近遇到一个Java的陷
我尝试使用 FirebaseApp.configure() 配置 Firebase,但遇到以下崩溃: *** Terminating app due to uncaught exception 'c
我有一个自连接员工实体类,其中包含与其自身相关的 id、name 和 ref 列。我想创建它的新实例并将其保存到数据库。 首先我创建了一个 Employee 类的实例并将其命名为 manager。然后
我有一个用于添加新公寓的表单,在该表单中我有一个下拉列表,用户可以在其中选择负责的人员。 显然,当您从下拉列表中选择并尝试保存公寓时,我的应用程序认为该人已被修改。它给了我下面的错误,指示我应该首先保
从 Visualforce 页面,我需要检索我们组织的 salesforce 实例的 URL,而不是 Visual Force URL。 例如我需要https://cs1.salesforce.com
我遇到了一些可能的问题答案,但这是关于从 Hibernate 3.4.0GA 升级到 Hibernate 4.1.8 的问题。所以这曾经在以前的版本下工作,我已经四处搜索了为什么它在这个新版本中出现了
似乎一遍又一遍地问这个问题,我仍然找不到解决我问题的答案。我在下面有一个域模型。每个新创建或更新的“安全用户”都需要我确保其具有配置文件,如果没有,则创建一个新的配置文件并分配给它。 配置文件的要求相
我很难调试为什么 JPA 不级联我的 @ManyToMany 关系。我发现的所有答案都与缺少级联语句有关。但我确实拥有它们并且仍然得到: Caused by: org.hibernate.Transi
Play 服务 API 表明有一个叫做 Instance ID 的东西 但是,在 Android Studio 中包含以下内容后,我无法导入 InstanceID 类 compile "com.goo
我正在使用 Seam 框架。我有 2 个实体: 请求.java @Entity @Table(name = "SRV_REQUEST") public class Request { private
This question处理构建一个适当的Monad来自单子(monad)的实例,但仅在某些约束下 - 例如Set .诀窍是将其包装成 ContT ,它将约束推迟到包装/展开其值。 现在我想对 Ap
我正在尝试执行此查询: StringBuffer sb = new StringBuffer(); sb.append("select p from PointsEntity p " + "where
我试图了解是否可以更改我的 hibernate 配置并使用单个 MySQL 实例(而不是我当前拥有的多个 MySQL 实例): 我有一个使用 hibernate 的 Java 应用程序,与 2 个模式
我有一个选项卡滑动布局,其中包括四个选项卡,每个选项卡都有自己的布局和 fragment ,在我的主要 Activity 布局中,viewpager 参与更改选项卡。特定 View (选项卡)在应用程
我看到很多帖子声称他们正在运行 MySql 的 RDS 实例,但无法连接到该实例,但我没有运行 RDS。 我使用 EC2 实例来托管我的 WordPress 博客,该博客是使用 Web 平台安装程序安
因为我在我的 ec-2 实例上的 python 虚拟环境中运行应用程序( Airflow ),并且我想在同一个 ec2 实例上的默认 python 环境中运行命令,所以我认为 ssh 到我自己的实例更
这个问题已经有答案了: How to fix the Hibernate "object references an unsaved transient instance - save the tra
例子: run APP1 .. ... run APP1 ... run APP2 如何在 APP2 中对 Vue 说我需要调用 APP1?
我是一名优秀的程序员,十分优秀!