我有一个应用程序,它可以在CodeBlocks调试器下正常运行,也可以在项目的bin子目录下运行。如果将版本复制到其他任何位置,则无法识别或打开系统上的串行端口。看起来我必须遗漏一些简单的东西或者它没有链接到.lib
文件。
我在程序启动时使用函数从com1到com20检查系统上的现有端口。在项目目录下,它可以连接到微控制器设备,通信工作正常。我使用此函数检查每个端口号是否存在。
//determine if a serial port does or does not exist
bool getComPortList(std::string portName)
{
bool test;
char* portNumber = new char[portName.length() + 1];
for (unsigned int n = 0; n < portName.length(); n++)
{
portNumber[n] = portName[n];
}
HANDLE testSerial;
testSerial = CreateFile(portNumber, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, NULL, NULL);
if (testSerial == INVALID_HANDLE_VALUE)
{
test = false;
}
else
{
test = true;
}
CloseHandle(testSerial);
delete[] portNumber;
return test;
}
答案 0 :(得分:1)
CreateFile
。我建议使用portName.c_str()
代替自己滚动的字符串portNumber
。
为什么呢?
生成portNumber
的循环复制字符串中的字符,但省略了终止NULL。赔率非常好,调试模式在portNumber
时礼貌地归零new
,因此portNumber
预先终止。发布模式将针对速度进行编译,并且不会执行未明确请求的内容,因此不会出现归零,也不会出现免费虚假。
为什么这个工作在一个文件夹中,而不是另一个文件夹可能只是愚蠢的愚蠢(不幸运,因为直接崩溃将更容易检测)或者它可能是更邪恶的东西。无论如何,未终止的字符串需要修复。
答案 1 :(得分:0)
这听起来像是一个部署问题 - 即在构建环境中运行此问题似乎没问题,但是当您将其移到“环境之外”时,它“无法独立运行”。
您可以使用免费工具,例如:dependencywalker。在您的可执行文件上运行它,它将告诉您需要与程序一起复制哪些dll /库以使其独立运行。
可能有点粗糙,但如果没有看到整个项目环境,很难说出问题所在。
在某些构建环境(如MS visual studio)中,您可以告诉它在可执行文件中包含所有依赖项(使其非常大)。