我使用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。如果我在这个方法中加入一些代码就会运行。我也想象这种行为可能会导致缓冲区溢出,但我不确定为什么会发生这种情况。
答案 0 :(得分:0)
很难说。您可能想要发布OnInitIDA的代码。
你确实有一个可能相关或不相关的错误:
不要将任何内容传递给CoInitialize
。来自MSDN:
参数
pvReserved [in, optional]
此参数是保留的,必须为NULL。