2014-12-08 34 views
0

我有下面的代码给系统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\\ 

代码有什么问题?

+0

你在哪个用户帐户下运行服务?显然,它不是'logpoint';可能是'SYSTEM'。每个账户的“一条真实路径”是不同的。 – 2014-12-09 02:19:58

+0

我遇到过使用LoadUserProfile(),ImpersonateLoggedOnUser()等函数模拟HKCU的信息。关于如何模拟当前用户并获取登录用户的LocalAppData路径,您有任何参考吗? – Pant 2014-12-09 16:44:34

+0

哪位用户是“当前用户”?在任何时候,可以有零个,一个或多个交互式用户登录到正在运行服务的计算机上。为什么你想要你的服务写文件到用户的配置文件?这是一件不寻常的事情想要做。 – 2014-12-09 17:53:48

回答

0

感谢您对Igor给出的见解。我在编写wix安装程序时通过在注册表中编写LocalAppDataFolder路径来解决此问题。为此,我使用:

<Component Id="registry_values" Guid="{11FB6C4C-3C90-4F46-B0D2-BB95150F60E6}"> 
     <RegistryKey Root="HKLM" 
        Key="Software\Logpoint" 
       Action="createAndRemoveOnUninstall"> 
      <RegistryValue Type="string" Name="path" Value="[LocalAppDataFolder]"/> 
     </RegistryKey> 
</Component> 

由于注册表写入路径两个64和和32位Windows不同,我下面的代码就知道它:

bool DetectWindowsVersionBit() 
{ 
#if defined(WIN64) 
    return true; // 64-bit process running on 64-bit windows 
#endif 

    BOOL bIsWow64 = false; // must default to FALSE 
    typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); 
    LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
    GetModuleHandle("kernel32"), "IsWow64Process"); 

    if (NULL != fnIsWow64Process) 
    { 
    if (!fnIsWow64Process(GetCurrentProcess(), &bIsWow64)) 
    { 
     //ASSERT(FALSE); // something went majorly wrong 
    } 
    } 
    return bIsWow64; 
} 

因此,我做了我自己的代码,用于访问路径。我现在没有使用SHGetFolderPath。这里是:

std::string GetLocalAppDataPath() 
    { 
     HKEY hKey; 
     char buf[255]; 
     DWORD dwType; 
     DWORD dwBufSize = sizeof(buf); 
     std::string ss=""; 
     const char *subKey; 
     bool is64bit = DetectWindowsVersionBit(); 
     if(is64bit) 
     { 
      subKey = "Software\\\\Wow6432Node\\\\Logpoint"; 
     } 
     else 
     { 
      subKey = "Software\\\\Logpoint"; 
     } 
     WriteToLog(" Inside GetLocalAppDataPath") ; 
     if(RegOpenKey(HKEY_LOCAL_MACHINE,subKey,&hKey) == ERROR_SUCCESS) 
     { 
      WriteToLog("Opened the Registry Key"); 
     dwType = REG_SZ; 
     if(RegQueryValueEx(hKey,"path",0, &dwType, (BYTE*)buf, &dwBufSize) == ERROR_SUCCESS) 
     { 
     ss = buf;  
     WriteToLog(ss.c_str()); 
     } 
     else 
     { 
     WriteToLog(" Cound not find the value"); 

     }   
     RegCloseKey(hKey); 
     } 
     else 
     { 
      WriteToLog(" Cannot Open the Local App Data Path"); 

     } 

     return ss; 
    } 
+0

你在为微软工作吗?如果你不这样做,你可能不应该在'Software \ Microsoft'键下写字。它有点让我怀疑你的动机。 – 2014-12-10 18:41:32

+0

对不起,我只是检查方法是否有效。我将用我自己的路径更新注册表。 – Pant 2014-12-11 02:25:13

相关问题