使用来自非托管c ++的com dll失败了REGDB_E_CLASSNOTREG

时间:2014-11-25 14:57:48

标签: c++ dll com

我真的坚持这个并且花了几个小时的时间与谷歌这样我需要在这里问,因为我没有想法...

使用this示例我目前有这个:

#include <stdio.h>
#include <tchar.h>
// get ATL's client templates
#include <atlcomcli.h>
// import the typelibrary direct from the dll
#import "FibuSvrDLL.dll" raw_interfaces_only no_namespace

int main(int argc, char* argv[])
{
    // declare com ptr
    CComPtr<_Server> comInterfacePtr;

    // cocreate an instance
    HRESULT r = comInterfacePtr.CoCreateInstance(__uuidof(Server));
    // this always fails with REGDB_E_CLASSNOTREG
}

_Server似乎是正确的界面,Server是它的coclass。从这里看到生成的tlh文件中的相应片段:

struct __declspec(uuid("5f3a9f5c-196d-4e4c-b339-6664c1c7f4f9"))
/* dual interface */ _Server;
struct /* coclass */ Server;

如果我在c#中使用相同的DLL,它开箱即用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using fnSrvDLL5r;

namespace ConsoleApplication1
{
    class Program
    {
        public Program()
        {
            try {
                Server server = new Server();
                server.set_Konfiguration("...");
                [...]

DLL是我无法控制的第三方应用程序的一部分。我所知道的是它是用VB6编写的。

在我能够从上面的c#代码中使用DLL之前,我首先需要使用regsvr32。也许这有任何帮助。

问候,马丁

1 个答案:

答案 0 :(得分:2)

您显示的代码不会调用CoInitialize()OleInitialize()。如果不先调用它们,你将永远不会成功。