IDL和ODL的主要区别是什么.我有很多项目,其中一些有idl,其中一些有odl.我应该在哪里使用它们.什么是权衡.
我有一个.dll,其中包含一些带有特定/自定义界面的DirectShow筛选器(COM)进行查询。
大多数第三方DirectShow组件都包含嵌入式.tlb文件,这些文件可用于跨环境通信(C#typelib导入)。
我不想尝试手动创建c#所需的接口,因为没有提供idl / tlb文件。
是否可以从COM .dll生成tlb(或至少是idl,我可以MIDL编译)?
我正在开发 ATL 项目。一些接口包含传递各种指针的参数。这是我的 IDL 文件:
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(618E64F5-676B-4A13-A513-DE3D4097294A),
dual,
nonextensible,
helpstring("IMyObject Interface"),
pointer_default(unique)
]
interface IMyObject : IDispatch{
[id(1), helpstring("method Make")] HRESULT Make(DWORD type, LPVOID settings);
[id(2), helpstring("method Deserialize")] HRESULT Deserialize(LPVOID dataPtr, DWORD dataSize);
};
[
uuid(E57065B4-498F-4347-9ACC-A2C86A771720),
version(1.0),
helpstring("TestComVoid 1.0 Type Library")
]
library TestComVoidLib
{
importlib("stdole2.tlb");
[
uuid(1DC2528B-EA49-4F89-BB56-B1D667379644),
helpstring("MyObject Class")
]
coclass MyObject
{
[default] interface IMyObject;
};
};
Run Code Online (Sandbox Code Playgroud)
IMyObject 的第一种方法根据类型和对应的结构构造一个对象。第二种方法基于二进制数据构造一个对象。
但我收到错误 MIDL2139:参数的类型不能从 void 或 void * 派生
另外,我想制作一个带有 IntPtr 参数的 C# 包装器来传递指针。(“添加引用”->COM->“TestComVoid 1.0 类型库”) …
我正在用C++实现一个Windows系统服务,它充当RPC服务器和相应的客户端.我使用普通的Windows RPC功能.
将字符串从RPC客户端传递到服务器很容易.只需在IDL文件中声明函数参数,如下所示:
[in, string] wchar_t* myString
Run Code Online (Sandbox Code Playgroud)
MIDL将负责内存分配魔术.就像一种享受.
返回修改后的客户端字符串也很简单:
[in, out, string] wchar_t* myString
Run Code Online (Sandbox Code Playgroud)
但是,这要求我在客户端正确调整字符串的大小.
问题:
我需要将字符串从服务器返回给客户端.我不知道客户端会有多大,所以客户端的内存分配不是一种选择.
我可以分配一个非常大的内存,比如10K,这个数量足够大,可以用于服务器可能返回的每个字符串.但这是对资源(内存,网络)的巨大浪费,我仍然无法确定服务器永远不需要返回更大的字符串.
我尝试了什么:
Amonst许多其他的东西我尝试了微软的strout示例中使用的技术.它在第一次调用RPC函数时起作用,但在第二次调用时崩溃了服务器.
我将一些简单的IDL代码传递给Python.但是,从SciPy/NumPy包中返回的FFT值与IDL包不同,我无法找到原因.
这一切减少到8种元素的一个简单的例子,我发现,SciPy的/ NumPy的例程返回比IDL那些(归一化的问题,我想)更大8(2 ^ 3)倍的值.
以下是两种语言的示例代码(从此处复制):
signal = ([-2., 8., -6., 4., 1., 0., 3., 5.])
fourier = fft(signal)
print, fourier
Run Code Online (Sandbox Code Playgroud)
回报
(1.62500,0.00000)(0.420495,0.506282)(0.250000,0.125000)(-1.17050,-1.74372)(-2.62500,-0.00000)(-1.17050,1.74372)(0.250000,-0.125000)(0.420495,-0.506282)
from scipy.fftpack import fft
import numpy as N
…
signal = N.array([-2., 8., -6., 4., 1., 0., 3., 5.])
fourier = fft(signal)
print fourier
Run Code Online (Sandbox Code Playgroud)
回报
[13. + 0.j,3.36396103 + 4.05025253j,2.+ 1.j,-9.36396103-13.94974747j,-21.+ 0.j,-9.36396103 + 13.94974747j,2.-1.j,3.36396103 -4.05025253j]
我用NumPy包做到了,得到了相同的结果.我也试过print fft(signal, 8 )以防万一,但它返回了同样的,如预期的那样.
然而,并非所有,回到我真正的256个元素阵列,我发现差异不再是8或256,而是256*8!这只是疯了.
虽然我解决了这个问题,但我需要知道为什么会有这种差异.
解决了:这只是规范化,在某些时候我将IDL 256阵列分成8倍,我忘了删除.在Dougal的回答中,有我错过的文档.
是否有机器可读的WinRT API版本?
我正在寻找像WebIDL,经典IDL或任何其他机器可读格式的东西,它将列出可在JavaScript中访问的WinRT的所有类,常量,方法等.
如果它包含上述每个条目的单行描述,和/或相关MSDN文档页面的链接,那当然会更好:-)
编辑:
我想写一个OCaml库,它将被其他编程语言使用,如C或甚至python.
我不确定它是否可行,我想我需要放弃一些类型安全性并将动态检查添加到接口以获得动态类型语言.
它可行吗?是否有工具来实现此目标以自动生成绑定?我认为像Corba这样的东西不适合ocaml ABI,但我可能错了.
编辑:通过删除运行时要求并只使用具有llvm前端的语言,我可以使用llvm作为常见的ABI我猜,但它似乎很棘手.
我有很多生成COM DLL的项目,这些项目输出如下:
projectname_i.h
projectname_i.c
projectname_p.c
projectname_i.tlb
Run Code Online (Sandbox Code Playgroud)
然后在另一个项目使用此DLL的地方使用它,如下所示:
#import "projectname.tlb" named_guids no_namespace
Run Code Online (Sandbox Code Playgroud)
我想将此更改为使用include而不是import.
想从改变背后的原因#import来#include是因为我想使/MP编译器开关,加快构建时间.
http://msdn.microsoft.com/en-us/library/bb385193.aspx
所以我想知道的是:
我正在努力寻找看似超级简单的东西:我想使用MIDL编译器.tlb从.idl文件生成类型库(文件).但是,我只是无法让MIDL生成一个.tlb文件.
这是我的Foo.idl:
import "unknwn.idl";
[object, uuid(400075B9-4BD6-45A5-B8B7-9DA0CF7B9B13)]
interface IFoo : IUnknown
{
HRESULT DoFoo([in] int arg, [out, retval] int *result);
}
Run Code Online (Sandbox Code Playgroud)
这是我调用MIDL编译器的方式:
midl Foo.idl /tlb Foo.tlb
Run Code Online (Sandbox Code Playgroud)
其中将以下输出写入控制台:
Microsoft (R) 32b/64b MIDL Compiler Version 7.00.0555
Copyright (c) Microsoft Corporation. All rights reserved.
Processing .\Foo.idl
Foo.idl
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\unknwn.idl
unknwn.idl
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\wtypes.idl
wtypes.idl
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\basetsd.h
basetsd.h
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\guiddef.h
guiddef.h
Run Code Online (Sandbox Code Playgroud)
MIDL编译器生成三个文件:Foo.h,Foo_i.c, …
例如,
a = [1, 1, 2, 4, 4, 4, 5, 6, 7, 100]
b = [1, 2, 2, 2, 2, 4, 5, 7, 8, 100]
Run Code Online (Sandbox Code Playgroud)
我可以使用以下方法找到匹配的元素:
np.intersect1d(a,b)
Run Code Online (Sandbox Code Playgroud)
输出:
array([ 1, 2, 4, 5, 7, 100])
Run Code Online (Sandbox Code Playgroud)
a那么,如何分别获取数组和中匹配元素的索引b?
IDL 中有一个函数"match"- https://www.l3harrisgeospatial.com/docs/match.html
Python中有类似的函数吗?