2017-03-27 1 views
1

J'ai donc essayé de lire et d'écrire à partir du fichier .ini de mon service Windows. Je stocke temporairement le fichier ini dans 'C: \ test \ CppWindowsService.ini'. Le programme lit l'ini juste bien, mais a du mal à définir la valeur dans le fichier ini. Il semble mettre à jour la valeur, mais en réalité ne fait rien. J'utilise SimpleIni de brofield disponible à github, quelque chose que j'ai vu de nombreuses personnes en ligne utilisant pour leurs besoins d'analyse ini. Vous pouvez le trouver here.Écrire au fichier .ini - SimpleIni SetValue ne fait rien, malgré l'apparence de succès

choses que j'ai essayé/vérifié jusqu'ici:

  • Paramètres de sécurité: les Administrateurs, Admins du domaine, système et je tous les accès en lecture/écriture. Cette section de code est en cours d'exécution en tant que mon administrateur de domaine.

Toute aide est grandement appréciée, et merci d'avance!

bool readini() 
{ 
    // Load .ini file and retrieve ClientGuid ** 
    CSimpleIniA ini; 
    ini.SetUnicode(); 
    ini.LoadFile("C:\\test\\CppWindowsService.ini"); 
    const char * pVal = ini.GetValue("GUID", "Clientguid", NULL); 

    std::cout << "pVal:" << pVal << std::endl; 
    std::string test(pVal); // Had to convert pVal to string for unknow reason: 
    if (test == "noguid") // const char * "noguid" != const char[7] "noguid" ??? 
    {      // Aren't these the exact same thing?... Compiler wasn't 
     // generate guid ** // throwing the error, but the if statement wouldn't pass 
     GUID initguid;  // the condition until I did this. 
     HRESULT hCreateGuid = CoCreateGuid(&initguid); 

     // generate bstr from guid ** 
     wchar_t* bstrGuid; 
     StringFromCLSID(initguid, &bstrGuid); 
     std::wcout << bstrGuid << std::endl; 

     // transform bstr to str ** 
     std::stringstream ss; 
     ss << bstrGuid; 
     std::string guid = ss.str(); 

     // set .ini clientguid with generated guid ** 
     SI_Error rc = ini.SetValue("GUID", "Clientguid", guid.c_str()); 
     if (rc < 0) 
     { 
      return false; 
     } 
     printf("key: %s\n", rc == SI_INSERTED ? 
      "inserted" : "updated"); 

     ::CoTaskMemFree(bstrGuid); 
    } 
} 

La sortie des trois différents Cout/wcout/déclarations d'impression:

pval: noguid 
{D002CD3F-6434-47E9-8246-06884FDE1FEA} 
key: updated 

Format Ini:

[GUID] 
Clientguid = noguid 

Je n'ai inclus le fichier SimpleIni.h, comme d'autres ont l'air de ne pas être vraiment utiles pour moi. Cela semble aller, et pour autant que je sache, ce n'est pas le problème ... mais s'il vous plaît faites le moi savoir si je me trompe!

Répondre

1

Vous devez enregistrer le fichier INI en utilisant la commande:

ini.SaveFile("C:\\test\\CppWindowsService.ini");