集成c# &c++应用程序使用安全的COM通过引用c++ . tlb

本文关键字:c++ COM 引用 tlb 应用程序 集成 安全 | 更新日期: 2023-09-27 18:13:32

我正试图让我的c# 4.0 (VS2010)应用程序与使用COM和引用类型库的c++应用程序进行交互。

我看到的所有使用第三方库的例子大多包括ActiveX控件或dll,你可以简单地添加一个引用和创建对象。我无法直接创建任何对象(我得到一个错误,说使用接口代替),我无法找到任何将返回接口。

这是一个安全的COM库,用于访问加密数据库,在创建实例时需要一个密码短语。

我花了很多时间在这上面,大致知道需要做什么,但也足够意识到它是足够模糊的,我不可能在合理的时间内弄清楚。我找到的最接近的例子是非常抽象和没有文档的。对于那些非常了解COM、反射和互操作的人来说,它可能很有用,但以我的经验不足以作为起点。

我被困在我有一个方法可以调用,但我觉得离能够调用它还有好几个月的时间。


c++应用程序是使用VS2005在发布模式下构建的,.tlb被成功添加为我的c# 2010解决方案的参考。c++应用程序已安装在我的开发机器上。

在对象浏览器中,我可以看到公共类SecureRepositoryClass, SecurityAgentLib的成员,具有我想调用的方法GetPolicyValue(string,string,string)。它实现了定义了GetPolicyValue的ISecureRepository。

我知道某些东西应该返回一个引用,我可以将其强制转换为ISecureRepository,然后调用我需要的方法。

我不知道怎么做的是得到这个的引用。我们的c++项目(由其他人编写,不幸的是我不是c++开发人员)使用以下代码(其中的变量在另一个上下文中设置)

   HRESULT hr = CoGetClassObject(CLSID_SecureRuntimeAgent, CLSCTX_LOCAL_SERVER, NULL, IID_IClassFactory2, (void**) &pClf);
   if ((SUCCEEDED(hr)))
   {
         CComBSTR bstrKey = (LPCTSTR)ProduceKey();
         hr = pClf->CreateInstanceLic(NULL, NULL, IID_ISecureRuntimeAgent, bstrKey, (void**)&m_pIAPLI);
         if ((!SUCCEEDED(hr)))

我已经搜索了CreateInstanceLic, CoGetClassObject,并一直试图找到c#的等效物。

我已经尝试了几个例子,但没有真正理解他们的意思,很难适应这种特殊的情况。

我知道我有什么,我需要什么,但不知道如何得到。

集成c# &c++应用程序使用安全的COM通过引用c++ . tlb

似乎iclassfactory2com接口是在标准的运行时可调用包装器中实现的,因此看起来您将不得不以蛮力方式进行操作,并从托管代码调用Ole32.dll中的非托管api。这里有一个c#的例子http://www.dotnet247.com/247reference/msgs/28/144657.aspx。我不太愿意直接复制这段代码,因为没有为这段代码指定版权条款。