0

我是 C++ 的菜鸟,但想学习。\etc\hosts我有一个小程序,可以在 Windows 中将一些信息写入我的;我通过 获取%WINDIR%变量GetEnvironmentVariable(),如果我手动输入完整路径一切正常,但是当我用WINDIR变量替换时,我的代码没有编译。我知道我做的不对。

#include <windows.h>
#include <ios>
#include <fstream>

char buffer[1000];
int main() {
    GetEnvironmentVariable("WINDIR",(char*)&buffer,sizeof(buffer));
    std::ofstream log;
    log.open("%s\\system32\\drivers\\etc\\hosts", buffer);
    log << "127.0.0.1   domain.com\n" << std::endl;
    return 0;
}

我得到了非常丑陋的错误,例如:

C:\Documents and Settings\xtmtrx\Desktop\coding\windir.cpp 没有匹配函数调用 ` std::basic_ofstream<char, std::char_traits<char> >::open(const char[30], char[1000])'

4

3 回答 3

2

ofstream无法为您格式化路径。您需要单独执行此操作,例如:

#include <windows.h>
#include <ios>
#include <fstream>

char buffer[1000] = {0};
int main() {
    GetEnvironmentVariable("WINDIR",buffer,sizeof(buffer));
    strcat(buffer, "\\system32\\drivers\\etc\\hosts");
    std::ofstream log;
    log.open(buffer, ios_base::ate);
    log << "127.0.0.1   domain.com\n" << std::endl;
    return 0;
}

仅供参考,您应该使用GetWindowsDirectory(),或代替. 并且您应该在将路径连接在一起时使用,这样可以确保斜线是正确的。GetSystemDirectory()SHGetSpecialFolderPath()SHGetKnownFolderPath()GetEnvironmentVariable()PathCombine()

于 2012-12-29T18:25:28.603 回答
1

您需要像这样将字符串连接在一起:

LPTSTR windir[MAX_PATH];
LPTSTR fullpath[MAX_PATH];
GetWindowsDirectory(windir, MAX_PATH);
if(PathCombine(fullpath, windir, _T("system32\\drivers\\etc\\hosts")) != NULL) {
    std::ofstream log;
    log.open(buffer, ios_base::ate);
    log << "127.0.0.1   domain.com\n" << std::endl;
}

首先,您需要使用 PathCombine 连接目录和文件部分。然后您可以打开文件并写入内容。您还应该注意,您需要管理员权限才能更改此文件,并且某些防病毒程序可能会拒绝访问 hosts 文件。

于 2012-12-29T18:20:49.843 回答
1

open("%s\\system32\\drivers\\etc\\hosts", buffer); open 不理解格式字符串..您使用%s的没有意义。在这里学习

试试这样:

GetEnvironmentVariable("WINDIR",buffer,sizeof(buffer));
strcat(buffer, "\\system32\\drivers\\etc\\hosts");
std::ofstream log;
log.open(buffer.str().c_str(), ios_base::ate);   
于 2012-12-29T18:23:04.970 回答