有点奇怪的情况。我有一个C ++ DLL,它是为我注入第三方应用程序并检索信息。这个DLL最初只会输出信息,但我需要在我制作的VB应用程序中使用它。
所以我创建了另一个C ++ dll,它有来自原始C ++ dll的2个回调函数..这是发送信息的地方。并且具有我的VB应用程序可以调用以检索该信息的功能。
我对C ++并不是很擅长...我已经搞砸了一段时间并且降低了崩溃的发生但是它仍然发生(尽管很少)。我认为在某些时候,2个不同的部分正在读取或写入导致崩溃的同一地址。 这是代码:
这是一个全局cstring,用于存储来自回调函数的信息并发送到VB
class Global
{
public:
static CString & get_allstacks() {
static CString allstacks; return allstacks; }
};
这是我从VB调用的函数,它向我发送信息。
BSTR _stdcall vbFunction()
{
BSTR Message;
int len = Global::get_allstacks().GetLength();
Message = SysAllocStringByteLen ((LPCTSTR)Global::get_allstacks(), len+1 );
return Message;
}
这是回调函数之一..还有另一个函数也将信息放入同一个全局cstring中。在此函数中,当cstring达到> 100k长度时,它也会调整大小。请注意,调整大小代码仅在1个回调中。
HANDLE OnInfo(SendInfo* info)
{
strcpy_s(tempID,200,info->GameId);
CString stringTempID="";
stringTempID=tempID;
CString tempRound="";
strcpy_s(round,200,info->round);
tempRound=round;
// get a reference to global string
CString & allstacks= Global::get_allstacks();
// add new info
allstacks+= stringTempID + tempRound + "\n";
//resize cstring
int len =allstacks.GetLength();
if (len > 100000)
{
int nstart = 0;
int npos = 0;
while ((npos = allstacks.Find(_T('\n'), nstart)) < len - 50000) {
nstart = npos+1;
}
allstacks= allstacks.Right(nstart);
}
return 0;
}
这是必要的
char* tempID =new char[255];
char* round=new char[255];
无论如何,崩溃是非常罕见的,当调用vbFunction时发生了几次但是大部分时间都没有调用vbFunction,所以我认为问题也发生在回调函数中。