关于网友提出的“ 将C++的dll程序改为ATL的COM程序”问题疑问,本网通过在网上对“ 将C++的dll程序改为ATL的COM程序”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 将C++的dll程序改为ATL的COM程序
描述: 请问 要将C++的dll程序改为ATL的COM程序。
COM程序调用C++ dll,包装一下接口,这样可以吗?C++有个结构体
struct abc
{
int a;
string b;
bool c;
};
COM的.h文件包含C++的头文件,这样可以使用C++ 中的结构体类型abc,但是COM的IDL文件怎么使用C++的结构体类型?如果在IDL文件定义一个相同名字的结构体类型abc,会报类型冲突错误。
1.COM程序调用C++ dll,包装一下接口,这样可以吗?
2. 有其他方式吗?
3. IDL可以包含C++的.h文件吗?这样就可以直接使用C++的结构体了。
解决方案1: 以后不要多次重复发帖,这贴你不用结,得到答案后提醒我关闭它,我另外补偿你分数
解决方案2: struct abc
{
int a;
string b;
bool c;
};
是这样定义的。
interface Iabc : public IUnknown
{
[propget] HRESULT a([out, retval] int *a);
[propput] HRESULT a([in] int a);
// string 定义为 BSTR。
// bool 定义为 VARIANT_BOOL
};
这样你可以返回 Iabc 的接口。
使用 pabc->get_a(&a); 和 pabc->put_a(a); 来存取 a。
在脚本中获取 abc 的接口,此时 Iabc 必须继承于 IDispatch 。
var a = abc.a; 和 abc.a = a; 来存取 a。
解决方案3: 你没有理解 COM 组件的意义。
假定你的 COM 组件提供给 JavaScript 这样的脚本使用。
就算你提供了 UDT ,又能怎样在 JS 里面使用呢。
如果你的 COM 仅仅支持 C/C++ 呼叫,那么久多此一举了。
所以,通常的方法就是为你的 UDT 定义一个接口。
这个接口中使用 propget 和 propset 来存取属性。
解决方案4: 从c++角度来看,STRUCT只是一个默认访问权限为public的类,所以你可以同样为该结构体创建一个COM对象,为每个成员设置get与set接口
解决方案5: 在MSDN里面搜“COM Tutorial Samples”?
以上介绍了“ 将C++的dll程序改为ATL的COM程序”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2857919.html