CoCreateInstance() - 588993460(在comip.h中)C ++

时间:2013-06-14 21:57:19

标签: c# c++ com dllimport dllregistration

我会花一点时间解释我的项目结构:

有三个dll:

  1. mclController.dll - 用C#编写的第三方dll来控制硬件..
  2. MCLWrapper.dll - 我在C#中写了这个ll,它将作为COM工作,将mclControl.dll暴露给本机C ++ DLL。
  3. ThorDetectorSwitch.dll - 我用本机C ++编写了这个dll。
  4. 结构:

    • ThorDetectorSwitch.dll调用包装mclController.dll的MCLWrapper.dll。
    • 我正在用C ++实现一个小型测试控制台应用程序TDSTest.exe来调用ThorDetecttorSwitch.dll。

    所以它基本上是这样的: TDSTest.exe - > ThorDetectorSwitch.dll - > MCLWrapper - > mclController.dll

    部分代码:

    -Tow TDSTest.exe(Windows控制台应用程序,使用x64配置构建)调用ThorDetectorSwitch.dll:

    #include "stdafx.h"    
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    #include <math.h>
    #include <windows.h>
    #include "TDSTest.h"
    
    typedef long (*TDSFindDevices)(long&);
    typedef long (*TDSGetParam)(const long, double&);
    typedef long (*TDSTeardownDevice)();
    typedef long (*TDSStartPosition)();
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
            if (argc < 2) 
            {
                 cout<<"This is ThorDetecttorSwitch test program."<<endl;
                 return 1;  
            }   
    
            HINSTANCE hInst = LoadLibrary(_T(".\\Modules_Native\\ThorDetectorSwitch.dll"));
    
            if( hInst == NULL )
            {
                DWORD err = GetLastError();
                cout<<"Error loading ThorDetectorSwitch.dll. Program exiting..."<<endl;
                return 1;
            }
    
    }
    

    - 2013年6月15日,中部时间19:41,ThorDetectorSwitch.dll EDITTED!的构造函数

    ThorDetectorSwitch::ThorDetectorSwitch() :_mcSwitch(ComHelper(__uuidof(MCLControlClass)))
    {
        CoInitialize(NULL);
        MCLWrapper::MCLControlPtr mclSmartPtr;
        HRESULT hr = CoCreateInstance(__uuidof(MCLWrapper::MCLControlClass), NULL, CLSCTX_ALL, __uuidof(MCLWrapper::MCLControl), (void**)&mclSmartPtr); // program breaks right here!!!
        _mcSwticth = mclSmartPtr;
    
        _A  = WstringToBSTR(L"A"); 
        _B  = WstringToBSTR(L"B");
        _C  = WstringToBSTR(L"C");
        _D  = WstringToBSTR(L"D");
    
        _deviceDetected = FALSE;
    }
    

    制作COM对象的MCLWrapper

    // C# COM wrapper 
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using mcl_RF_Switch_Controller64;
    using System.Runtime.InteropServices;
    // for function reference see miniCircuit RF controller manual
    
    namespace MCLWrapper
    {
        [Guid("7C312A7C-2E77-4de7-A76F-990F268AB818")]
        [InterfaceType(ComInterfaceType.InterfaceIsDual)]
        public interface MCLControl
        {
            [DispId(1)]
            void Connect(string SerialNumber);
    
            [DispId(2)]
            void Set_Switch(string SwitchName, int Val);
    
            [DispId(3)]
            void Set_SwitchesPort(byte binVal);
    
            [DispId(4)]
            void GetSwitchesStatus(int statusRet);
    
            [DispId(5)]
            void Disconnect();
        };
    
        [Guid("BEC33A1D-BB98-4332-B326-92D480ECC246"), 
        ClassInterface(ClassInterfaceType.None)]
        public class MCLControlClass : MCLControl
        {
            private USB_RF_SwitchBox _sb = new USB_RF_SwitchBox();
    
            public void Connect(string SerialNumber)
            {
                _sb.Connect(ref SerialNumber);
            }
    
            public void Set_Switch(string SwitchName, int Val)
            {
                _sb.Set_Switch(ref SwitchName, ref Val);
            }
    
            public void Set_SwitchesPort(byte binVal)
            {
                _sb.Set_SwitchesPort(ref binVal);
            }
    
            public void GetSwitchesStatus(int statusRet)
            {
                _sb.GetSwitchesStatus(ref statusRet);
            }
    
            public void Disconnect()
            {
                _sb.Disconnect();
            }
        }
    }
    

    我的问题:

    当执行TDSTest时,它首先命中

    HINSTANCE hInst = LoadLibrary(_T(".\\Modules_Native\\ThorDetectorSwitch.dll"));
    

    然后它打破了:  ThorDetectorSwitch.cpp中的hr = CoCreateInstance(......)

    hr = -858993460是回报;

    一些额外内容

    1. 我被告知这是因为CoInitialized()没有被调用,这就是原因,但我觉得这不是原因,因为这个ThorDetectorSwitch.dll与另一个应用程序完美配合,我相信我在我的代码中调用了CoInitialized()
    2. 我已使用regasm MCLWrapper.dll /tlb:MCLWrapper.tlb /codebase
    3. 注册了我的MCLWrapper.dll
    4. 调试器输出:“在OS Loader锁定中尝试托管执行。不要尝试在DllMain或图像初始化函数中运行托管代码,因为这样做会导致应用程序挂起。”
    5. 所以现在我不知道应该去哪个方向,而且我已经在这个问题上苦苦挣扎了好几天。所以我真的希望有人可以给我一些指示。谢谢!

1 个答案:

答案 0 :(得分:2)

您需要懒惰地构造对象,而不是将其作为在DLL加载时创建的全局变量。

也许你可以让你的DLL提供一个由客户端调用的Initialize()函数?假设你当然不能让你的对象“根本不是全局的”。