C++ VB 崩溃问题中的 DLL

C++ DLL in VB crashing issue

本文关键字:DLL 问题 VB 崩溃 C++      更新时间:2023-10-16

我有一个dll,有人在C++里给我做了。 我需要在 VB 中使用这个 dll,为此我必须在 C++ 中制作另一个 dll,它具有我可以在 VB 中调用的函数。

我制作的C++ dll 有 4 个功能。 2 个从原始C++检索信息的回调函数。 我可以从 VB 调用 2 个函数来发送该信息。

我知道原始 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 赋值 (=( 运算符重新初始化现有的 CString 具有新数据的对象。如果目标字符串(即左侧 side(已经足够大,可以存储新数据,没有新内存 执行分配。您应该知道内存异常 每当使用赋值运算符时都可能发生,因为新的存储 通常被分配以保存生成的 CString 对象。

鉴于您放入 CString 的大小似乎没有限制,它可能在一个函数中allInfo中解除分配和分配内存,而您在另一个函数中读取或写入内存。 当您突然尝试写入未分配的内存时,事情就不那么顺利了。

您可能希望查看诸如关键部分或互斥锁之类的内容,以防止两个函数占用公共内存缓冲区。

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

有很多文章解释了如何使用Unicode,但对于刚接触C++的人来说,它们有点太重了。

最好回到为您

制作另一个dll的人那里,并要求该人添加您需要的功能。 还要向他们提及您将从 VB 调用 dll,因此您需要他们的 dll 来处理 Unicode 字符串。