有点奇怪的情况。我有一个为我制作的 C++ dll,它注入到第 3 方应用程序并检索信息。这个 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 就发生了,所以我认为问题也发生在回调函数中。