执行两次写入文件功能
do writefile function twice
bool sendMessageToGraphics(char* msg)
{
//char ea[] = "SSS";
char* chRequest = msg; // Client -> Server
DWORD cbBytesWritten, cbRequestBytes;
// Send one message to the pipe.
cbRequestBytes = sizeof(TCHAR) * (lstrlen(chRequest) + 1);
if (*msg - '8' == 0)
{
char new_msg[1024] = { 0 };
string answer = "0" + ' ';
copy(answer.begin(), answer.end(), new_msg);
char *request = new_msg;
WriteFile(hPipe, request, cbRequestBytes, &cbRequestBytes, NULL);
}
BOOL bResult = WriteFile( // Write to the pipe.
hPipe, // Handle of the pipe
chRequest, // Message to be written
cbRequestBytes, // Number of bytes to writ
&cbBytesWritten, // Number of bytes written
NULL); // Not overlapped
if (!bResult/*Failed*/ || cbRequestBytes != cbBytesWritten/*Failed*/)
{
_tprintf(_T("WriteFile failed w/err 0x%08lxn"), GetLastError());
return false;
}
_tprintf(_T("Sends %ld bytes; Message: "%s"n"),
cbBytesWritten, chRequest);
return true;
}
在运行的第一个写文件之后(在"8"的情况下(,另一个写文件函数无法正常工作,有人能理解为什么吗?函数发送消息到图形需要发送移动到棋盘
代码中有 2 个问题:
首先,有一个(小(问题,即在条件语句中初始化字符串。您可以按如下方式初始化它:
string answer = "0" + ' ';
这不会做你认为它做的事情。它将使用 const char*
和 char
作为其参数类型调用operator+
。这将执行指针添加,将 ' '
的值添加到常量的存储位置。由于' '
将被转换为整数值0
,它不会向常量添加任何东西。但是您的字符串最终没有' '
终止符。您可以通过将语句更改为:
string answer = std::string("0") + ' ';
但真正的问题在于你使用大小变量的方式。首先将 size 变量初始化为输入变量的字符串长度(包括终止' '
字符(。然后在条件语句中创建一个传递给WriteFile
的新字符串,但仍然使用原始大小。这可能会导致缓冲区溢出,这是未定义的行为。您还可以将 size 变量设置为写入文件的字节数。然后稍后在下一次调用中再次使用相同的值。您从未实际检查过此值,因此这可能会导致问题。
更改此设置的最简单方法是确保正确设置尺寸。例如,您可以执行以下操作,而不是第一次调用:
WriteFile(hPipe, request, answer.size(), &cbBytesWritten, NULL);
然后在下一次调用 WriteFile
之前检查返回值 WriteFile
和 cbBytesWritten
的值,这样您就知道您的第一次调用也成功了。
另外,不要忘记在尺寸计算中移除sizeof(TCHAR)
零件。您永远不会在代码中使用TCHAR
。您的输入是常规char*
您在条件中使用的字符串也是如此。我还建议用WriteFileA
替换WriteFile
,以表明您正在使用此类字符。
最后,确保您的服务器实际上正在从您写入的句柄中读取字节。如果服务器未从句柄读取,则WriteFile
函数将冻结,直到它可以再次写入句柄。
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 两个文件使用彼此的功能-如何解决
- 文件系统:复制功能的速度秘诀是什么
- C++读取功能改进,使读取多个文件
- 如何继续读取不同功能中的文件,而不是从头开始再次读取文件?
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- "configure"脚本如何检测我的系统是否支持某些头文件或 cpp 功能?
- Linux 源代码中普通磁盘文件的"轮询"功能在哪里实现?
- 如何从主.cpp中的cpp文件中获取功能结果?
- 如果在VC6中使用打开功能,如何选择文件夹?
- 如何在cmake工具链文件中设置编译功能,以便已知的自定义编译器使用target_compile_features
- 是否有一个Windows驱动程序函数可以执行Windows文件api SeFileAttributes的等效功能
- 如何使用C++在sqlite3数据库中执行写文件功能
- 打开文件并输出功能
- 用户使用C++中的删除功能删除文件
- C 从文件功能读取循环时无法退出
- 使用创建文件功能创建文件会导致写保护文件
- 执行两次写入文件功能
- QT复制文件功能错误
- winbio.h头文件功能被禁用