我有一个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;
}
崩溃似乎是完全随机发生的。
有什么建议吗?
由于
答案 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字符串。