ATL COM DLL适用于C#,但不适用于C ++

时间:2012-02-19 02:32:21

标签: c++ visual-c++ dll com atl

编辑:我已经为我的ATL COM dll,测试应用程序和我原来的C#dll的代码添加了一个链接。由于这是一个复杂的项目,它可能是最简单的解决方案。我非常绝望,因为我自己找不到解决方案。 这是链接,如果有人想看看: https://docs.google.com/open?id=0B3ehFEncKJH7ZDgxMGI1YjgtZTE2MS00ZTBkLWI2NzgtYzVhZjUxOWEzZGI0

我使用ATL创建了一个dll,并试图让它与我给出的测试程序一起工作。我不想改变它访问dll的方式,因为这是固定的。我将dll基于之前的C#版本,并尝试保持ProgID和UUID相同。

当我尝试使用任何方法时,我一直遇到缓冲区溢出问题。但是我遇到了另一个问题,我不知道它为什么会发生。为了确保我的dll工作,我在其中一个方法中添加了一个sleep语句。当我从我的测试程序中调用此方法时,用非托管c ++编写,睡眠函数似乎不起作用。但是,如果我创建一个C#应用程序并将我的dll添加为引用并调用该方法,它确实有效。有谁知道为什么会发生这种情况?

编辑: 我想我应该提供一些关于如何使用它的更多细节。测试c ++应用程序创建对象的实例,如下所示:

IUserIDAPtr m_pUserIDA; 
::CoInitialize(m_pUserIDA);
m_pUserIDA.CreateInstance(_T("Analyst_UserIDA.UserIDAObject"));

if (m_pUserIDA != NULL)
{
    cout << "Aww yeah, that point isn't null" << endl;
    m_pUserIDA->AddRef();


    HRESULT result = m_pUserIDA->OnInitIDA();

现在睡眠功能在OnInitIDA中。

使用C#时,我添加了对DLL的引用并执行了此操作:

        UserIDAObject IDAObject = new UserIDAObject();
        IDAObject.OnInitIDA();
        short minCharge = 0;
        short maxCharge = 0;
        bool doChargeState = false;
        IDAObject.GetChargeStateParam(ref minCharge, ref maxCharge, ref doChargeState);

当我尝试在c ++应用程序中使用GetChargeStatParam时,我得到一个缓冲区溢出但这不会发生在C#版本中。但我离题了...... 在这种情况下,C#应用程序会休眠10秒钟。

我只是不知道在哪里开始寻找以找出它无效的原因。

编辑:这是在dll中定义的接口:

STDMETHOD(GetSwitchCriteria)(DOUBLE* intensity, DOUBLE* minMass, DOUBLE* maxMass, BOOL* selectIntensity, LONG* numOfDepCycles);
STDMETHOD(GetChargeStateParam)(SHORT* minCharge, SHORT* maxCharge, BOOL* doChargeState);
STDMETHOD(GetInclusionList)(DOUBLE* intensity, DOUBLE* theList, SHORT* numOfItems);
STDMETHOD(GetExclusionList)(LONG* exRTWindow, DOUBLE* theMassList, LONG* theRTList, SHORT* numOfItems);
STDMETHOD(GetOtherCriteria)(LONG* smartFilterTime, DOUBLE* isoExclusionWin, DOUBLE* massTolerance, BOOL* isPPM);
STDMETHOD(GetIsotopeMatchParam)(DOUBLE* theMassList, DOUBLE* theAbundanceList, DOUBLE* abTolerance, DOUBLE* maTolerance);
STDMETHOD(OnInitIDA)(void);
STDMETHOD(OnScreenSurveySpec)(void);
STDMETHOD(OnPrepareNextScan)(DOUBLE* selectedMasses, DOUBLE* selectedIntensities, LONG* selectedCharges, LONG itemCount);

这是OnInitIDA

的实现
STDMETHODIMP CUserIDA::OnInitIDA(void)
{
// TODO: Add your implementation code here
Sleep(5000);
return S_OK;
}

我是否应该关注如何在我的dll中定义UserIDA?我之前使用相同方法的C#dll在这个测试应用程序中运行良好。

修改 奇怪的是,我发现了一些相当奇怪的行为,可能会给某人一个想法虽然让我感到困惑。我使用VS2008的“Step Into”功能,发现当调用OnInitIDA时,它实际上会进入另一个方法GetInclusionList。如果我在这个方法中加入一些代码就会运行。我也想象这种行为可能会导致缓冲区溢出,但我不确定为什么会发生这种情况。

1 个答案:

答案 0 :(得分:0)

很难说。您可能想要发布OnInitIDA的代码。

你确实有一个可能相关或不相关的错误:

不要将任何内容传递给CoInitialize。来自MSDN

  

参数

pvReserved [in, optional] 
     

此参数是保留的,必须为NULL。