Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#调用C++;基于单例类的动态链接库_C#_C++_Dll_Marshalling - Fatal编程技术网

C#调用C++;基于单例类的动态链接库

C#调用C++;基于单例类的动态链接库,c#,c++,dll,marshalling,C#,C++,Dll,Marshalling,我试图从C到C++调用dll。 C++ DLL是一个单独的类,如下: .h文件(简化) 我相信C++的DLL路径是正确的,因此在这一点上,我不确定是什么导致了这个问题。谁能给点建议?非常感谢。谢谢。编译器找不到SetStatsMask(),因为它正在查找类之外的函数。不能使用 dLimPult以这种方式调用C++类的函数。< /P> 我本来打算建议在StatsManager类之外创建一个函数来调用它,但是看起来您的SetStatsMask()成员函数不需要StatsManager的任何非公共部

我试图从C到C++调用dll。

C++ DLL是一个单独的类,如下: .h文件(简化)


<>我相信C++的DLL路径是正确的,因此在这一点上,我不确定是什么导致了这个问题。谁能给点建议?非常感谢。谢谢。

编译器找不到
SetStatsMask()
,因为它正在查找类之外的函数。不能使用<代码> dLimPult以这种方式调用C++类的函数。< /P> 我本来打算建议在
StatsManager
类之外创建一个函数来调用它,但是看起来您的
SetStatsMask()
成员函数不需要
StatsManager
的任何非公共部分,您只需将其转换为常规函数而不是成员函数即可

long SetStatsMask(unsigned short *mask, long width, long height)
{
    long ret = TRUE;

    realloc(StatsManager::getInstance()->GetMaskPtr(),width*height*sizeof(unsigned short));
    memcpy(mask,StatsManager::getInstance()->GetMaskPtr(),width*height*sizeof(unsigned short));

    return ret;
}
#include "stdafx.h"
#include "StatsManager.h"
#include "ImageStats.h"

auto_ptr<LogDll> logDll(new LogDll(L".MyLoggingUnmanaged.dll"));
wchar_t message[256];

typedef void (_cdecl *statsPrototype)(long chan, long &numROI, long * min, long *max, double *mean, double *stdDev);

void (*statsFunctionPointer)(long chan, long &numROI, long * min, long *max, double *mean, double *stdDev) = NULL;

bool StatsManager::_instanceFlag = false;

bool StatsManager::_setupFlag = false;

StatsManager::StatsManager()
{
    SetThreadBusyStatus(FALSE);
    SetDataPtr(NULL);
    SetMaskPtr(NULL);
    hThread = NULL;
}

StatsManager::~StatsManager()
{
    _instanceFlag = false;
}

auto_ptr<StatsManager> StatsManager::_single(new StatsManager());

StatsManager* StatsManager::getInstance()
{
    if(! _instanceFlag)
    {
        try
        {
            _single.reset(new StatsManager());

            wsprintf(message,L"StatsManager Created");
            logDll->TLTraceEvent(VERBOSE_EVENT,1,message);
        }
        catch(...)
        {
            //critically low on resources
            //do not proceed with application
            throw;
        }
        _instanceFlag = true;
        return _single.get();
    }
    else
    {
        return _single.get();
    }
}

//model will call this function
long StatsManager::SetStatsMask(unsigned short *mask, long width, long height)
{
    long ret = TRUE;

    realloc(StatsManager::getInstance()->GetMaskPtr(),width*height*sizeof(unsigned short));
    memcpy(mask,StatsManager::getInstance()->GetMaskPtr(),width*height*sizeof(unsigned short));

    return ret;
}
[DllImport("StatsManager.dll", EntryPoint = "SetStatsMask")]
private static extern int SetStatsMask(IntPtr mask, int imgWidth, int imgHeight);

try
{
    ea.Result = mask;
    IntPtr maskPtr = Marshal.AllocHGlobal(2 * mask.Length);
    Marshal.Copy(mask, 0, maskPtr, mask.Length);
    SetStatsMask(maskPtr, width, height);
    SaveMask("d:\\myMask.csv", mask);
}
catch (Exception e)
{
    e.ToString();

}  
long SetStatsMask(unsigned short *mask, long width, long height)
{
    long ret = TRUE;

    realloc(StatsManager::getInstance()->GetMaskPtr(),width*height*sizeof(unsigned short));
    memcpy(mask,StatsManager::getInstance()->GetMaskPtr(),width*height*sizeof(unsigned short));

    return ret;
}