c语言 - 当我使用 gcc 时,函数有效,但当我使用 Visual Studio 的编译器时Microsoft它什么都不做



当我使用 code:blocks 与gcc一起运行它时,它会在 F 上创建注册.txt如果它不存在并写入密码和用户名,但是当我使用 Visual Studio 的编译器在我的项目中使用它时Microsoft它什么也不做。

例如,如果我调用这个函数,例如:Write("JohnDoe", "password123"), 在文件注册中.txt应出现在一行中:JohnDoe, password123

const char *FILEPATH = "F:\registration.txt";
int Write(char *username, char *password) {
if (username == NULL || password == NULL) {
return -1;
}
BOOL error = TRUE;
size_t lengthUsername = strlen(username);
size_t lengthPassword = strlen(password);
LPDWORD bytesUsernameWritten = 0;
char comma[2] = ",";
char newLine[3] = "rn";
LPDWORD bytesPasswordWritten = 0;
LPDWORD bytesWrittenComma = 0;
//if the file doesn't exist, we create it
HANDLE file = CreateFile((LPCWSTR)FILEPATH, FILE_APPEND_DATA, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
if (file == INVALID_HANDLE_VALUE) {
if (GetLastError() != ERROR_FILE_EXISTS) {
printf("0x%x", GetLastError());
CloseHandle(file);
return -1;
}  //the file exist, we try to create it
file = CreateFile((LPCWSTR)FILEPATH, FILE_APPEND_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (file == INVALID_HANDLE_VALUE) {
printf("Couldn't open the file. Error : 0x%x", GetLastError());
CloseHandle(file);
return -1;
}
}
//We try to write the username and the password in file, each combination on each line, in this format: username, password
error = WriteFile(file, username, (DWORD)lengthUsername, bytesUsernameWritten, NULL);
if (error == FALSE) {
printf("The username couldn't have been written. Error 0x%xn", GetLastError());
CloseHandle(file);
return -1;
}
error = WriteFile(file, comma, 1, bytesWrittenComma, NULL);
if (error == FALSE) {
printf("The comma couldn't have been written. Error 0x%xn", GetLastError());
CloseHandle(file);
return -1;
}
error = WriteFile(file, password, (DWORD)lengthPassword, bytesPasswordWritten, NULL);
if (error == FALSE) {
printf("The password couldn't have been written. Error 0x%xn", GetLastError());
CloseHandle(file);
return -1;
}
error = WriteFile(file, newLine, 2, bytesPasswordWritten, NULL);
if (error == FALSE) {
printf("The endline couldn't have been written. Error 0x%xn", GetLastError());
CloseHandle(file);
return -1;
}
CloseHandle(file);
return 0;
}

你的主要问题是使用Unicode和ASCII之间的混淆。

所有采用字符串参数的窗口 API 函数都有两个版本: 一个适用于LPCSTR,另一个适用于LPCWSTR

您可以将char *转换为LPCSTR并使用 ASCII 版本CreateFileA,但不能将其转换为LPCWSTR并使用CreateFileW-CreateFile的 Unicode 版本,因为它需要 UCS-16 编码的字符串,其中每个字符占用 2 个字节。

调用哪个版本的函数取决于编译器标志。对于 Windows 上的 CodeBlocks,默认是使用 ASCII 版本,因此您的函数可以正常工作。 对于 VS,默认值为 Unicode,因此文件路径字符串会弄乱并且不会创建文件。

此外,您还有另外两个错误:

  1. 您不正确地使用WriteFile
    第 4 个参数是一个指针,其中WriteFile存储写入的字节数。

    您传递的 NULL 指针,因为您将bytesUsernameWritten等变量设置为 0。但是根据 MS 文档,如果最后一个参数lpOverlapped不是 NULL,则只能在那里使用 NULL。

    您应该做的是将bytesUsernameWritten声明为 DWORD 并使用运算符传递其地址&
    否则,即使函数成功创建文件,也不会获得写入的字节数。

  2. 您正在尝试关闭INVALID_HANDLE_VALUE
    这是不必要的,但幸运的是它不应该使您的程序崩溃。

最后,没有理由尝试两次CreateFile。 只需使用带有OPEN_ALWAYS参数的调用即可。 这将打开一个现有文件,但如果该文件不存在,它将自动创建它,而不是失败。

相关内容

  • 没有找到相关文章

最新更新