打通 C++ 和 C# 关于 COM 组件互相调用的任督二脉
2012-06-26 17:31
519 查看
至此, C# 组件开发完毕. 通过查看注册表,可以看到增添了如下内容:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\CLSID\{E57F961E-9925-3025-A854-AF3E4B7C0801}]
@="MyTestClsLib.SimpleType"
[HKEY_CLASSES_ROOT\CLSID\{E57F961E-9925-3025-A854-AF3E4B7C0801}\Implemented Categories]
[HKEY_CLASSES_ROOT\CLSID\{E57F961E-9925-3025-A854-AF3E4B7C0801}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}]
[HKEY_CLASSES_ROOT\CLSID\{E57F961E-9925-3025-A854-AF3E4B7C0801}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="both"
"Class"="MyTestClsLib.SimpleType"
"Assembly"="MyTestClsLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
"RuntimeVersion"="v2.0.50727"
"CodeBase"="file:///E:/WUTemp/MyTestClsLib/bin/Debug/MyTestClsLib.dll"
[HKEY_CLASSES_ROOT\CLSID\{E57F961E-9925-3025-A854-AF3E4B7C0801}\InprocServer32\1.0.0.0]
"Class"="MyTestClsLib.SimpleType"
"Assembly"="MyTestClsLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
"RuntimeVersion"="v2.0.50727"
"CodeBase"="file:///E:/WUTemp/MyTestClsLib/bin/Debug/MyTestClsLib.dll"
[HKEY_CLASSES_ROOT\CLSID\{E57F961E-9925-3025-A854-AF3E4B7C0801}\ProgId]
@="MyTestClsLib.SimpleType"
[HKEY_CLASSES_ROOT\MyTestClsLib.SimpleType]
@="MyTestClsLib.SimpleType"
[HKEY_CLASSES_ROOT\MyTestClsLib.SimpleType\CLSID]
@="{E57F961E-9925-3025-A854-AF3E4B7C0801}"
2. C++ 客户端的例子.
(1). 新建一个 C++ 控制台程序, 工程名字是 TestClient, 见下图 [--图4--] .
(2). 在包含文件 stdafx.h 内添加
#include <windows.h>
#include <atlbase.h>
(3). 在 TestClient.cpp 文件添加如下内容.
#import "..\MyTestClsLib\bin\Debug\MyTestClsLib.tlb" raw_interfaces_only
using namespace MyTestClsLib;
(4). 随便声明一个函数并实现之, 比如 void Foo(void); 在这个函数体内就可以调用我们先前实现的 C# 组件了.
比如这些代码:
void Foo(void)
{
HRESULT hr = E_FAIL;
CComPtr<_SimpleType> spTmp;
hr = spTmp.CoCreateInstance(__uuidof(SimpleType));
if (SUCCEEDED(hr))
{
CComBSTR str;
spTmp->ConvertIntToString(887, &str);
}
}
(5). 然后在 main 函数里就可以调用 Foo 函数了, 调用之前记得初始化 COM 环境. 见下图 [--图5--] .
(6). 到此, 打完收工. 现在, 就可以编译调试看看效果了. 看看 CComBSTR str 变量里是不是有了返回值 887?
例子代码下载: http://www.cppblog.com/Files/free2000fly/cstocpptest.zip
另一个例子, 用 C++ 的 ATL 定义接口, 然后用 C# 实现接口. 然后用 C++ 客户端来调用之. http://www.cppblog.com/Files/free2000fly/com2cs-impl.zip
参考资料:
(1) http://www.codeproject.com/KB/cs/ManagedCOM.aspx
(2) http://www.codeproject.com/KB/COM/cominterop.aspx
(3) http://www.codeproject.com/KB/cs/cominterop.aspx
(4) http://blogs.msdn.com/yizhang/archive/2007/11/05/net-mscoree-dll.aspx
(5) http://www.codeproject.com/KB/cs/unmanagedtomanaged.aspx
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\CLSID\{E57F961E-9925-3025-A854-AF3E4B7C0801}]
@="MyTestClsLib.SimpleType"
[HKEY_CLASSES_ROOT\CLSID\{E57F961E-9925-3025-A854-AF3E4B7C0801}\Implemented Categories]
[HKEY_CLASSES_ROOT\CLSID\{E57F961E-9925-3025-A854-AF3E4B7C0801}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}]
[HKEY_CLASSES_ROOT\CLSID\{E57F961E-9925-3025-A854-AF3E4B7C0801}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="both"
"Class"="MyTestClsLib.SimpleType"
"Assembly"="MyTestClsLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
"RuntimeVersion"="v2.0.50727"
"CodeBase"="file:///E:/WUTemp/MyTestClsLib/bin/Debug/MyTestClsLib.dll"
[HKEY_CLASSES_ROOT\CLSID\{E57F961E-9925-3025-A854-AF3E4B7C0801}\InprocServer32\1.0.0.0]
"Class"="MyTestClsLib.SimpleType"
"Assembly"="MyTestClsLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
"RuntimeVersion"="v2.0.50727"
"CodeBase"="file:///E:/WUTemp/MyTestClsLib/bin/Debug/MyTestClsLib.dll"
[HKEY_CLASSES_ROOT\CLSID\{E57F961E-9925-3025-A854-AF3E4B7C0801}\ProgId]
@="MyTestClsLib.SimpleType"
[HKEY_CLASSES_ROOT\MyTestClsLib.SimpleType]
@="MyTestClsLib.SimpleType"
[HKEY_CLASSES_ROOT\MyTestClsLib.SimpleType\CLSID]
@="{E57F961E-9925-3025-A854-AF3E4B7C0801}"
2. C++ 客户端的例子.
(1). 新建一个 C++ 控制台程序, 工程名字是 TestClient, 见下图 [--图4--] .
(2). 在包含文件 stdafx.h 内添加
#include <windows.h>
#include <atlbase.h>
(3). 在 TestClient.cpp 文件添加如下内容.
#import "..\MyTestClsLib\bin\Debug\MyTestClsLib.tlb" raw_interfaces_only
using namespace MyTestClsLib;
(4). 随便声明一个函数并实现之, 比如 void Foo(void); 在这个函数体内就可以调用我们先前实现的 C# 组件了.
比如这些代码:
void Foo(void)
{
HRESULT hr = E_FAIL;
CComPtr<_SimpleType> spTmp;
hr = spTmp.CoCreateInstance(__uuidof(SimpleType));
if (SUCCEEDED(hr))
{
CComBSTR str;
spTmp->ConvertIntToString(887, &str);
}
}
(5). 然后在 main 函数里就可以调用 Foo 函数了, 调用之前记得初始化 COM 环境. 见下图 [--图5--] .
(6). 到此, 打完收工. 现在, 就可以编译调试看看效果了. 看看 CComBSTR str 变量里是不是有了返回值 887?
例子代码下载: http://www.cppblog.com/Files/free2000fly/cstocpptest.zip
另一个例子, 用 C++ 的 ATL 定义接口, 然后用 C# 实现接口. 然后用 C++ 客户端来调用之. http://www.cppblog.com/Files/free2000fly/com2cs-impl.zip
参考资料:
(1) http://www.codeproject.com/KB/cs/ManagedCOM.aspx
(2) http://www.codeproject.com/KB/COM/cominterop.aspx
(3) http://www.codeproject.com/KB/cs/cominterop.aspx
(4) http://blogs.msdn.com/yizhang/archive/2007/11/05/net-mscoree-dll.aspx
(5) http://www.codeproject.com/KB/cs/unmanagedtomanaged.aspx
相关文章推荐
- 打通 C++ 和 C# 关于 COM 组件互相调用的任督二脉
- COM 打通 C++ 和 C# 关于 COM 组件互相调用的任督二脉 (转)
- 打通 C++ 和 C# 关于 COM 组件互相调用的任督二脉
- C++调用C# COM组件
- C++调用C#编写的COM组件
- C++和C#编写调用COM组件
- C++和C#编写调用COM组件
- 如何从c++中调用c#的com组件
- VC6.0和VS2005:C++和C#编写调用COM组件
- C++调用C# COM组件
- C++ 调用 C#的COM组件
- C++和C#编写调用COM组件
- [转]C++和C#编写调用COM组件
- C++和C#编写并且相互调用COM组件
- VC6.0和VS2005:C++和C#编写调用COM组件
- C++和C#编写并且相互调用COM组件
- 关于在C#中,调用C++ COME组件SDK 中的
- C++和C#编写调用COM组件
- C++和C#编写调用COM组件
- C++调用C#编写的COM组件