0

有点奇怪的情况。我有一个为我制作的 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 就发生了,所以我认为问题也发生在回调函数中。

4

0 回答 0