今日、私が開発していたいくつかのソフトウェアに必要だったので、この問題を解決しました。
上記の人々が言ったように; ディレクトリを特定のファイルにハードコーディングできますが、それは、ロードする必要のある構成ファイルをそこに配置する必要があることを意味します。
私にとって、このサービスは 50,000 台以上のコンピューターにインストールされていました。サービス実行可能ファイルが実行されているディレクトリからロードするように設計されています。
これで、非システム プロセスとして簡単にセットアップして実行できます (私はほとんどのテストを非システム プロセスとして行いました)。しかし、問題は、あなたが使用した (そして私も使用した) システムラッパーは Unicode フォーマットを使用する (そしてそれに依存する) ため、従来の方法ではうまく機能しないということです。
コードのコメント部分でこれを説明する必要があります。いくつかの冗長性があることはわかっていますが、これを書いたときに動作するバージョンが欲しかっただけです。幸いなことに、GetModuleFileNameA を使用して ASCII 形式で処理できます。
私が使用したコードは次のとおりです。
char buffer[MAX_PATH]; // create buffer
DWORD size = GetModuleFileNameA(NULL, buffer, MAX_PATH); // Get file path in ASCII
std::string configLoc; // make string
for (int i = 0; i < strlen(buffer); i++) // iterate through characters of buffer
{
if (buffer[i] == '\\') // if buffer has a '\' in it, replace with doubles
{
configLoc = configLoc + "\\\\"; // doubles needed for parsing. 4 = 2(str)
}
else
{
configLoc = configLoc + buffer[i]; // else just add char as normal
}
}
// Complete location
configLoc = configLoc.substr(0, configLoc.length() - 17); //cut the .exe off the end
//(change this to fit needs)
configLoc += "\\\\login.cfg"; // add config file to end of string
ここからは、単純に configLoc を新しい ifsteam に解析して、コンテンツを処理できます。