C++ VB 崩溃问题中的 DLL
C++ DLL in VB crashing issue
我有一个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 字符串。
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- 发生此错误:在0x0F2BFB7C(基于.dll)时引发异常 尝试更改大小是问题吗?
- 系统错误:程序无法启动,因为您的计算机中缺少MSVCP140D.DLL。尝试重新安装该程序以解决此问题
- C++ DLL 堆内存分配问题
- C++ DLL 运行时错误"abc.dll is not a valid WIN32 application" 。请帮助解决这个问题
- DLL 导出导致唯一指针出现问题
- 如何解决python35的问题.dll'没有找到?
- C++ API-MS-WIN-SERVICE-PRIVATE-L1-1-1.DLL依赖项问题
- 问题在具有依赖性时从其他路径上加载DLL的DLL
- 我的自定义 C++ DLL 的 C# 项目中的 DLL 端口有什么问题?
- 潜在 DLL 兼容性问题的摘要?
- 从C++调用 Delphi DLL IStream 参数的问题
- 清理跨越Windows DLL模块边界的堆分配资源时出现问题
- 在Windows Server 2003中注册dll时出现问题
- DLL和EXE中具有相同名称和父级但实现不同的类中的问题
- 在C 中的DLL中解决模板的问题
- 多个DLL的问题
- USB继电器DLL问题-继续
- pImpl是否从根本上解决了c++ DLL问题?
- 共享对象(DLL)问题