Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VB崩溃问题中的C++ DLL 我有一个DLL,有人用C++制作了我。我需要在VB中使用这个DLL,为了做到这一点,我必须在C++中制作另一个DLL,它具有我可以在VB中调用的函数。 < >我所做的C++ DLL有4个功能。从原始C++中检索信息的2个回调函数。我可以从VB调用两个函数来发送信息_C++_Vb.net_Dll - Fatal编程技术网

在VB崩溃问题中的C++ DLL 我有一个DLL,有人用C++制作了我。我需要在VB中使用这个DLL,为了做到这一点,我必须在C++中制作另一个DLL,它具有我可以在VB中调用的函数。 < >我所做的C++ DLL有4个功能。从原始C++中检索信息的2个回调函数。我可以从VB调用两个函数来发送信息

在VB崩溃问题中的C++ DLL 我有一个DLL,有人用C++制作了我。我需要在VB中使用这个DLL,为了做到这一点,我必须在C++中制作另一个DLL,它具有我可以在VB中调用的函数。 < >我所做的C++ DLL有4个功能。从原始C++中检索信息的2个回调函数。我可以从VB调用两个函数来发送信息,c++,vb.net,dll,C++,Vb.net,Dll,我知道原来的dll工作得很好,因为我在一个控制台应用程序中对它进行了无休止的测试 但是,当我将其与dll和VB一起使用时。。我会随机崩溃 在我的VB应用程序中几乎没有代码,因为它只是用于测试。它只是输出信息,所以没有问题 我相信问题是在我做的C++ DLL中。我是新的C++。 我想可能一个变量在2个点同时被访问,这可能吗?导致它崩溃 我的C++ DLL 的基本布局 //global variables CString allInfo=""; char* info=new char[25000];

我知道原来的dll工作得很好,因为我在一个控制台应用程序中对它进行了无休止的测试

但是,当我将其与dll和VB一起使用时。。我会随机崩溃

在我的VB应用程序中几乎没有代码,因为它只是用于测试。它只是输出信息,所以没有问题

我相信问题是在我做的C++ DLL中。我是新的C++。 我想可能一个变量在2个点同时被访问,这可能吗?导致它崩溃

<>我的C++ DLL

的基本布局
//global variables
CString allInfo="";
char* info=new char[25000];

//call back function 1
HANDLE OnInfo(SendInfo* tempInfo)
{
    CString stringTemp="";
    stringTemp=tempInfo->infomessage;
    allInfo=allInfo+ stringTemp+"\n";
    return 0;
}

//function for vb
BSTR _stdcall vbInfo()
{
    allInfo=allInfo.Right(20000); //get last 20,000 characters
    strcpy_s(info,20000,allInfo);
    BSTR Message;
    Message = SysAllocStringByteLen (info, lstrlen(info));
    return Message;
}
崩溃似乎完全是随机发生的

有什么建议吗


谢谢

除了了解到谷歌搜索CString类引用会返回一些有趣的结果之外,您的问题可能是CString的多址访问

您没有发布太多的信息,因此我假设OnInfo方法是一个回调函数,它由不同于调用vbInfo的执行线程调用。在本例中,您希望查看MSDN上的CString::operator=方法说明:

CString assignment=运算符重新初始化现有CString 对象的新数据。如果目标字符串为,则为左侧 侧面已经足够大,可以存储新数据,没有新内存 执行分配。您应该注意内存异常 在使用赋值运算符时可能会发生,因为新存储 通常分配用于保存生成的CString对象

考虑到您在CString中输入的内容的大小似乎没有限制,当您在另一个函数中读取或写入allInfo时,它可能会在一个函数中释放和分配allInfo中的内存。当你突然试图写入未分配的内存时,事情就不那么顺利了


您可能希望使用类似于的方法来防止两个函数都使用公共内存缓冲区。

您没有说明dll是否编译为使用Unicode或ANSI字符串。您没有说明其他人提供给您的dll是否编译为使用Unicode或ANSI字符串。VB调用程序可能会提供Unicode字符串,但也可以让VB调用程序提供ANSI字符串。因此,我们看到您的代码使用未知类型的CString,char*指向ANSI字符串,BSTR指向Unicode字符串,但大小以字节分配,谁知道是什么

有很多文章解释了如何使用Unicode,但是对于那些对C++来说很新的人来说,它们会有点太重。
如果您回到为您创建另一个dll的人那里,并要求他添加您需要的功能,那将是最好的。还要告诉他们,您将从VB调用dll,因此您需要他们的dll来处理Unicode字符串。

发布这些函数的VB.net声明。