0

私は C++ の初心者ですが、学びたいと思っています。\etc\hostsWindows で情報を書き込む小さなプログラムがあります。%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で連結する必要があります。次に、ファイルを開いてコンテンツを書き込むことができます。また、このファイルを変更するには管理者権限が必要であり、ウイルス対策プログラムによってはホスト ファイルへのアクセスが拒否される場合があることにも注意してください。

于 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 に答える