我有下面的代碼給系統32文件夾內的本地應用程序數據文件夾。我附上了以下代碼:SHGetFolderPath返回本地路徑,但不是當與服務相同時運行
int WriteToLog(const char* str)
{
FILE* log;
log = fopen("C:\\lpa\\sample.txt", "a+");
if (log == NULL)
return -1;
fprintf(log, "%s\n", str);
fclose(log);
return 0;
}
std::string GetLocalAppDataPath()
{
HANDLE hfile;
TCHAR szPath[MAX_PATH];
if(SUCCEEDED(SHGetFolderPath(NULL,CSIDL_LOCAL_APPDATA,NULL,0, szPath)))
{
std::string path = boost::lexical_cast<std::string>(szPath);
boost::replace_all(path, "\\", "\\\\");
return path;
}
}
void LoggingInit()
{
log4cplus::initialize();
helpers::LogLog::getLogLog()->setInternalDebugging(false);
std::string app_data_path = GetLocalAppDataPath();
std::string log_folder_path = app_data_path + "\\\\lpa\\\\output\\\\";
std::string log_file = log_folder_path + "output.log";
WriteToLog(log_file.c_str());
SharedAppenderPtr append_1(new RollingFileAppender(LOG4CPLUS_TEXT(log_file), 10*1024*1024, 5));
append_1->setName(LOG4CPLUS_TEXT("LogpointAgentLog"));
PatternLayout *p = new PatternLayout(LOG4CPLUS_TEXT("[%D] <%-5p> [%F : %L] %m%n"));
append_1->setLayout(std::auto_ptr<Layout>(p));
Logger::getRoot().addAppender(append_1);
root = Logger::getRoot();
WriteToLog("Loging Init Successful");
//std::string path = GetRegistryPath();
//WriteToLog(path.c_str());
}
當我使用製作服務創建運行程序時,我沒有得到真正的本地應用程序數據路徑。
int main(int argc, char **argv)
{
WriteToLog("Logging Init");
LoggingInit();
LOG4CPLUS_INFO(root, "Running as service");
StartLpaService(); //Here I am creating a service.
return 0;
}
我得到以下數據中創建的文本文件通過WriteToLog功能
Logging Init
C:\\WINDOWS\\system32\\config\\systemprofile\\AppData\\Local\\lpa\\output\\output.log
Loging Init Successful
我得到的本地應用程序數據路徑如果可執行文件運行正常,而不是服務。
C:\\Users\\logpoint\\AppData\\Local\\
代碼有什麼問題?
你在哪個用戶帳戶下運行服務?顯然,它不是'logpoint';可能是'SYSTEM'。每個賬戶的「一條真實路徑」是不同的。 – 2014-12-09 02:19:58
我遇到過使用LoadUserProfile(),ImpersonateLoggedOnUser()等函數模擬HKCU的信息。關於如何模擬當前用戶並獲取登錄用戶的LocalAppData路徑,您有任何參考嗎? – Pant 2014-12-09 16:44:34
哪位用戶是「當前用戶」?在任何時候,可以有零個,一個或多個交互式用戶登錄到正在運行服務的計算機上。爲什麼你想要你的服務寫文件到用戶的配置文件?這是一件不尋常的事情想要做。 – 2014-12-09 17:53:48