默认的ATL Simple Object在其IDL文件的顶部有以下内容:
import "oaidl.idl";
import "ocidl.idl";
Run Code Online (Sandbox Code Playgroud)
这些文件是什么,以及我如何知道何时需要导入它们?是否有任何文档描述这两个文件中定义的内容?我不知道"oa"和"oc"代表什么,文件本身没有有用的评论.
在我工作的一些IDL中,我注意到在方法中有两种用于标记返回值的约定 - [in, out]和[out, retval].
似乎[in, out]在有多个返回值时使用,例如:
HRESULT MyMethod(
[in] long InputParam,
[in, out] long* OutputParam1,
[in, out] long* OutputParam2
);
Run Code Online (Sandbox Code Playgroud)
似乎[out, retval]只有一个返回值时使用,例如:
HRESULT MyMethod2(
[in] long InputParam,
[out, retval] long* OutputParam1
);
Run Code Online (Sandbox Code Playgroud)
这是一个COM IDL约定还是我正在使用的代码中的约定?
从2个符号生成的代码是否存在功能差异,或者它们是否完全可互换?
我有一个使用MS ATL库编写的COM对象.我在IDL中声明了一堆枚举,但在使用MS COM对象查看器工具查看类型库时它们不会出现.问题似乎是缺少的枚举实际上并没有被任何COM方法用作参数 - 我如何强制这些枚举出现?
例如,在IDL中:
// Used by Foo method, so appears in the type library
typedef enum FOO
{
FOO_1,
FOO_2,
} FOO;
// Not used by any method, so won't appear in the type library
typedef enum BAR
{
BAR_1,
BAR_2,
} BAR;
[id(1)] HRESULT Foo([in] FOO eFoo);
Run Code Online (Sandbox Code Playgroud)
即使所讨论的枚举没有被任何方法直接使用,它们对使用该对象的任何人仍然有用,但我不能让它们导出.
谁看过这个吗?
我正要为Notepad ++创建一个用户定义的语言文件,以语法高亮IDL.但是在我去创建一个之前,我想与"社区"核实,看看是否有其他人已经准备好了.
有没有人有什么建议?
我们有一个.NET程序集(实际上是Aspose.Words),我们希望客户端可以毫不费力地从COM客户端使用它.
因此我们使用程序集发送.TLB,以便客户端可以从C++或Delphi等语言中使用它,并且不需要自己提取.TLB.
我们还使用程序集发送.IDL,以便客户端可以查看它,如果他们想要查看枚举值(如果他们在ASP中编程).
我希望.TLB和.IDL由构建脚本生成.我可以生成.TLB没问题.但我无法在命令行中生成.IDL(或作为替代转换.TLB到.IDL).我使用OLEVIEW.EXE手动执行此操作,这不是很好.
听说Delphi的TLIBIMP.EXE听起来像它可以做到这一点,但它似乎没有单独提供.
所以问题是:
从上面的任何东西听起来都很愚蠢?
如何使用命令行从.NET程序集中获取.IDL.
谢谢.
我正在尝试转换mscorlib.tlb.它通常在C++中使用,如下所示:
#import "mscorlib.tlb" raw_interfaces_only \
high_property_prefixes("_get","_put","_putref") \
rename("ReportEvent", "InteropServices_ReportEvent")
Run Code Online (Sandbox Code Playgroud)
如何将其转换为标题和实现文件?
我能够使用Visual Studio编译包含上面行的虚拟cpp文件,并生成一个.tlh文件.不应该有实施文件吗?
我正在使用大型遗留C++代码库,其中包含许多IDL文件,这些文件具有在任何模块之外声明的所有类型和常量.
对于C++,这会导致代码生成到全局命名空间 - 丑陋但可以接受.
现在我正在尝试添加Java客户端以通过CORBA进行连接.但是,对于Java,从IDL生成的类型(使用适用于java的Sun/Oracle IDL编译器:idlj)位于java 默认包中,因为它们不在IDL模块中.这会导致Java编译错误,因为从默认包导入是非法的.
我正在寻找解决问题的最简单方法.
我考虑过以下几点:
我发现如果没有包含所有类型的现有模块,很难相信没有简单的方法强制IDL在Java包中.我希望我只是错过了显而易见的事!
编辑:
例:
Foo.idl
struct Foo
{
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
Foo.java :( 注意没有指定包,这意味着默认包):
public final class Foo implements org.omg.CORBA.portable.IDLEntity
{
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
ClassUsesFoo.java:
package com.sigh;
import Foo; // <-- this is an error
public class ClassUsesFoo
{
private Foo f;
};
Run Code Online (Sandbox Code Playgroud) 我的代码目前传递了很多(有时是嵌套的)C(或C++ Plain Old Data)结构和数组.
我想将这些转换为谷歌protobufs.我可以手动编写在这两种格式之间进行转换的代码,但是自动生成此类代码的错误会更少.做这个的最好方式是什么?(在具有足够内省的语言中迭代成员变量的名称会很容易,但这是我们正在讨论的C++代码)
我正在考虑的一件事是编写解析C结构的python代码,然后吐出一个.proto文件,以及为所有类型从成员复制到成员(在任一方向上)的C代码,但也许有一个更好的方式......或者可能有另一个已经可以生成的IDL:
我不确定每个IDL用户是否都会遇到这种情况,但在升级到macOS Sierra和xQuartz 2.7.11之后,我的IDL小部件的响应速度变得非常慢.我在Red Hat Enterprise Linux Workstation 6.6上运行相同的程序.它运作顺利.我曾经在升级之前使用相同的程序SSH到OS X Mavericks.通过适当的互联网连接,它也运行良好.不幸的是,我不记得我使用的是哪个版本的xQuartz.
我不认为这个问题与SSH有关.我试图用SSH和本地运行程序,响应率似乎非常相似.
我试图将我的xQuartz降级到2.7.9,问题没有解决.
我试着自己调试,所以我发现以下链接与我有类似的问题. https://bugs.freedesktop.org/show_bug.cgi?id=93430
现在可以加速响应的唯一方法是强制将输出设置为256色.但它打破了我程序中的所有颜色设置.
所有建议和问题都表示赞赏!
找不到编译.idl文件的idlj工具。检查/usr/bin并/usr/lib/jvm/java-11-jdk。它不是和JDK捆绑在一起的吗?如何添加idlj编译器?
PS 我更喜欢Python,并且不经常使用Java。如果这是一个愚蠢的问题,我很抱歉。