VB中的C ++ DLL崩溃问题

时间:2011-12-09 00:23:14

标签: c++ vb.net dll

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

我制作的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;
}

崩溃似乎是完全随机发生的。

有什么建议吗?

由于

2 个答案:

答案 0 :(得分:0)

除了学习谷歌搜索CString类引用返回一些 ahem 有趣的结果之外,你的问题可能是CString的多次访问。

你没有发布很多信息,所以我假设OnInfo方法是一个回调函数,由一个执行线程调用,该线程与调用vbInfo的执行线程不同。在这种情况下,您需要查看MSDN上的CString::operator=()方法说明:

  

CString赋值(=)运算符重新初始化现有的CString   具有新数据的对象。如果是目标字符串(即左侧)   已经足够大,可以存储新数据,没有新内存   执行分配。你应该知道内存异常   每当您使用赋值运算符时都可能出现,因为新存储   经常被分配来保存生成的CString对象。

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

您可能希望查看Critical Section or a mutex之类的内容,以防止您的两个函数占用公共内存缓冲区。

答案 1 :(得分:0)

您没有说您的dll是否编译为使用Unicode或ANSI字符串。您没有说出对方提供给您的dll是否编译为使用Unicode或ANSI字符串。 VB调用者可能会为您提供Unicode字符串,但可以使VB调用者为您提供ANSI字符串。所以我们看到你的代码的CString是未知类型的,char *指向一个ANSI字符串,BSTR指向一个Unicode字符串但是大小以字节分配,谁知道什么。

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

如果您回到为您制作另一个dll的人,并要求该人添加您需要的功能,那将是最好的。还要提到他们你将从VB调用dll,所以你需要他们的dll来处理Unicode字符串。