2013-06-14 3 views
1

C++ я потрачу немного времени, объясняя свой проект stucture:CoCreateInstance() -858993460 (в comip.h)

Есть три DLLs:

  1. mclController.dll - третья сторона dll, написанный на C# для управления аппаратным обеспечением.
  2. MCLWrapper.dll - я написал этот ll на C#, чтобы он работал как COM, чтобы вывести mclControl.dll на родную C++ dll.
  3. ThorDetectorSwitch.dll - Я написал эту dll с родным C++.

Состав:

  • ThorDetectorSwitch.dll называет MCLWrapper.dll который оборачивает mclController.dll.
  • Я использую небольшое тестовое консольное приложение в C++, TDSTest.exe для вызова ThorDetecttorSwitch.dll.

Так что в основном работает следующим образом: TDSTest.exe -> ThorDetectorSwitch.dll -> MCLWrapper -> mclController.dll

Некоторый код:

-Как 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; 
     } 

} 

-Constructor в ThorDet ectorSwitch.dll EDITTED! на 06/15/2013, Центральное время 19:41

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; 
} 

MCLWrapper, что делает COM объект

// 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")); 

затем он ломается по адресу: hr = CoCreateInstance(......) в ThorDetectorSwitch.cpp

hr = -858993460 возвращение;

Несколько

Вспомогательные
  1. Я продолжал быть сказан, что это было потому, что CoInitialized() не дозвонились, и это причина, но я чувствую, что это не причина, потому что это ThorDetectorSwitch.dll работает отлично отлично с другим приложением, и я верю, что в своем коде я вызвал CoInitialized().
  2. Я зарегистрировал свой MCLWrapper.dll с regasm MCLWrapper.dll /tlb:MCLWrapper.tlb /codebase
  3. Выход отладчика: «Попытка управляемого выполнения внутри ОС Блокировка загрузчика. Не пытайтесь запустить управляемый код внутри функции инициализации DllMain или изображения, поскольку это может привести к зависанию приложения».

Так что прямо сейчас я понятия не имею, в каком направлении я должен идти, и я боролся с этой проблемой в течение нескольких дней. Поэтому я действительно надеюсь, что кто-то может дать мне несколько указателей. Благодаря!

+1

1) -858993460 не является допустимой ошибкой COM (уже объяснил это и почему). 2) Когда приложение выходит из строя, вы получаете исключение, и если да, то какой? 3) При попытке вызова в CoCreateInstance() приложение оказалось неудачным, - я также упомянул об этом. Это указывает на то, что с вашей оберткой что-то не так, но поскольку я не парень из C#, я не собираюсь догадываться. –

+0

Возможный дубликат [Значения структуры не остаются, значения изменены на -858993460] (http://stackoverflow.com/questions/14841507/stucture-values-not-staying-values-changed-to-858993460) –

+0

@HansPassant Похоже, в моем коде что-то не инициализируется. Это то, что я пытаюсь понять. –

ответ

2

Вам нужно лениться построить свой объект, вместо того чтобы иметь его как глобальную переменную, созданную при загрузке DLL.

Возможно, у вас может быть ваша DLL-функция Initialize(), которая будет вызываться клиентом? Предполагая, что вы не можете сделать свой объект «вообще не глобальным».

 Смежные вопросы

  • Нет связанных вопросов^_^