2011-08-15 6 views
0

レジストリキー "userpath"に 'REG_SZ'タイプの値を設定しようとしています。コードの簡略版は以下の通りです。RegQueryValueEx()XPで適切な設定値を提供していない

#include <stdio.h> 
#include <windows.h> 
#include <iostream> 

const static char* SrvKey= "System\\CurrentControlSet\\Services\\LanmanServer\\Parameters"; 
const static char* sVal = "I am probably \a good boy\0"; 
const static char* keyName = "userpath"; 

using namespace std; 

int main(int argc, char* argv[]){ 

    HKEY hkey; 
    LONG status; 
    DWORD wstatus; 
    DWORD dwCtype; 
    DWORD dwClen; 
    DWORD dwSetStatus; 
    status = RegCreateKeyEx(
       HKEY_LOCAL_MACHINE, 
       SrvKey, 
       (DWORD) 0, 
       NULL, 
       REG_OPTION_NON_VOLATILE, 
       (KEY_READ | KEY_WRITE), 
       NULL, 
       &hkey, 
       NULL 
      ); 

    if(status != ERROR_SUCCESS){ 
     printf("Error [%d] on creating key handle\n", status); 
     return status; 
    } 

    //RegFlushKey(hkey); 
    dwClen = strlen(sVal); 
    dwCtype = REG_SZ; 

    dwSetStatus = RegSetValueEx(hkey, 
        keyName, 
        0, 
        dwCtype, 
        (BYTE*)sVal, 
        dwClen); 

    if(dwSetStatus != 0){ 
        printf("\nError in setting value in registry. Error [%d]", dwSetStatus); 
        return dwSetStatus; 
    } 

    RegFlushKey(hkey); 

    DWORD dwCheckType = 0; 
    DWORD dwCheckLen = 0; 
    DWORD dwStatus; 
    dwStatus = RegQueryValueEx(hkey, 
           keyName, 
           NULL, 
           &dwCheckType, 
           NULL, 
           &dwCheckLen); 
    if(dwStatus != 0){ 
       printf("\nError in queering registry for length and type. Error [%d]", dwStatus); 
       return dwStatus; 
    } 

    LPBYTE lpbCheckValue = (LPBYTE) malloc(dwCheckLen); 

    //dwStatus not check at the moment. 
    dwStatus = RegQueryValueEx(hkey, 
           keyName, 
           NULL, 
           &dwCheckType, 
           lpbCheckValue, 
           &dwCheckLen); 
    if(dwStatus != 0){ 
       printf("\nError in queering registry for length and type. Error [%d]", dwStatus); 
       return dwStatus; 
    } 
    printf("queried calue is : [%s]", lpbCheckValue); 

    printf("\n\nEndofProgram\n"); 
    system("PAUSE"); 
    return 0; 
} 

2番目のRegQueryValueE winapiの後に 'lpbCheckValue'のジャンク値を取得しています。私が間違っていることを私に指摘してください?

答えて

0

sizeof(sVal)は何を提供しますか? 4?私はなぜsValがwchar_t *ではなくchar *なのでstrlenの代わりにwcslenを使用しているのか分かりません。

+0

あなたは正しいです。実際に私は同じissue.Inコードで苦しんでいる私の実際の問題のシンプルな形をプログラムしていたので、私は間違ってここでwcslenを使用したので、LPCWSTRとして値の名前を使用していた。あなたはsizeof(sVal)も観察しました。ポインタのサイズだけでなく、strlenでなければなりません。 – HokageSama

+0

あなたは正しいJamesだった...ここで見てきたように変更を加えた後、このサンプルコードではうまくいきます。私のメインプログラムを失うことはほとんどないようです。 btw、助けてくれてありがとう。 – HokageSama

0

RegQueryValueExARegSetValueExAを使用してください。プロジェクトがユニコードの場合、Visual Studioは自動的にRegQueryValueExWRegSetValueExWを使用します。期待値はwchar_tに基づいています。

+0

SrvKeyはコンパイルエラーの原因になります。 –

関連する問題