Оболочка C++/cli dll для нативного C++ для использования в LabView
Я пытаюсь написать оболочку C++/cli для IO Industries Core2 DVR, которая затем будет использоваться LabView. Компания предоставила SDK со всеми заголовками (написанными на C++) и библиотекой boost. Мне удалось создать оболочку, которая собирает, и LabView может видеть функцию через паллету.net.
// ManagedProject.h
#pragma once
#include "core_api_helper.h"
#include "core_api.h"
using namespace System;
using namespace CoreApi;
namespace ManagedProject {
//Setup class
public ref class Setup
{
private:
public:
unsigned int initializeTest();
};
}
// Это DLL-оболочка.
#include "stdafx.h"
#include "ManagedProject.h"
#include "core_api_helper.h"
#include "core_api.h"
#include "resource.h"
using namespace CoreApi;
using namespace Common;
using namespace ManagedProject;
//Global handles
//A handle to the Core Api
InstanceHandle g_hApi;
//A handle to the Core Api Device Collection
DeviceCollectionHandle g_hCoreDeviceCollection;
unsigned int Setup::initializeTest()
{
try
{
//Initialize the Core API (must be called before any other Core API functions)
//Returns a handle to the Core Api
g_hApi = Instance::initialize();
// get a collection of Core devices
g_hCoreDeviceCollection = g_hApi->deviceCollection();
unsigned int deviceCount = g_hCoreDeviceCollection->deviceCount();
return deviceCount;
}
catch (GeneralException& e)
{
e.what();
return 3;
}
}
Однако, когда я запускаю LabView через Visual studio 2015 в режиме отладки, я сталкиваюсь с проблемой, описанной ниже, и в LabView возвращается 3 из блока catch.
Первый перерыв в режиме отладки (NULL ptr)ПРИМЕЧАНИЕ. InstanceHandle является shared_ptr
Как видно, переменная является указателем NULL, то же самое происходит и с g_hCoreDeviceCollectoin. Я думаю, что мне нужно создать экземпляр с помощью новой команды, но я немного не уверен, так как InstanceHandle является shared_ptr.
Любая помощь приветствуется
1 ответ
В C++/CLI есть отличная функция, называемая смешанным режимом. Вы можете использовать как управляемые, так и собственные типы данных в одном и том же коде (в одном классе C++/CLI). Попробуйте использовать объект из этого SDK, написанного на C++, прямо в вашей оболочке.