2011-04-28 28 views
3

C#(マネージコード)からWin32関数CreateProfile()を正しく呼び出すにはどうすればいいですか?私は役に立たずに私自身で解決策を考案しようとしました。C#のマネージコードからwin32 CreateProfile()を呼び出す

CreateProfileの構文は()です:


HRESULT WINAPI CreateProfile(
    __in LPCWSTR pszUserSid, 
    __in LPCWSTR pszUserName, 
    __out LPWSTR pszProfilePath, 
    __in DWORD cchProfilePath 
);

書類がMSDN libraryで見つけることができます。

私がこれまでに持っていたコードは以下の通りです。

DLLインポート:関数を呼び出す


[DllImport("userenv.dll", CharSet = CharSet.Auto, SetLastError = true)] 
private static extern int CreateProfile(
         [MarshalAs(UnmanagedType.LPWStr)] string pszUserSid, 
         [MarshalAs(UnmanagedType.LPWStr)] string pszUserName, 
         [Out][MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszProfilePath, 
         uint cchProfilePath); 


/* Assume that a user has been created using: net user TestUser password /ADD */ 

// Get the SID for the user TestUser 
NTAccount acct = new NTAccount("TestUser"); 
SecurityIdentifier si = (SecurityIdentifier)acct.Translate(typeof(SecurityIdentifier)); 
String sidString = si.ToString(); 

// Create string buffer 
StringBuilder pathBuf = new StringBuilder(260); 
uint pathLen = (uint)pathBuf.Capacity; 

// Invoke function 
int result = CreateProfile(sidString, "TestUser", pathBuf, pathLen); 


問題は、ユーザープロファイルが今まで作成されないことであり、CreateProfile()のエラーコードを返します:0x800706f7。この問題に関する有益な情報は、歓迎する以上のものです。

おかげで、
-Sean


更新: を解決! pszProfilePathため 文字列バッファが260

+0

エラーcodfeの0x800706f7の意味:スタブは不正なデータを受信しました。それが役立つかどうかはわかりません。 – PVitt

+0

@PVittはい、知っておきたいことですが、間違って入力していることはわかりません。 – Sean

+0

デフォルトを繰り返すだけなので、MarshalAs属性は必要ありません。 –

答えて

3

outパラメータの場合、マーシャリングを設定する必要があります。さらに重要なのは、StringBuilderを渡すことによって、すでに暗黙的に出力パラメータがあることです。したがって、それはなるはず:

[DllImport("userenv.dll", CharSet = CharSet.Auto)] 
private static extern int CreateProfile(
        [MarshalAs(UnmanagedType.LPWStr)] string pszUserSid, 
        [MarshalAs(UnmanagedType.LPWStr)] string pszUserName, 
        [Out][MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszProfilePath, 
        uint cchProfilePath); 

このメソッドを呼び出す:

int MAX_PATH = 260; 
StringBuilder pathBuf = new StringBuilder(MAX_PATH); 
uint pathLen = (uint)pathBuf.Capacity; 

int result = CreateProfile(sidString, "TestUser", pathBuf, pathLen); 
+0

pszUserSidとpszUserNameをLPWStrとしてマーシャリングする必要がありますか?それらはLPCWSTRとして定義され、pszProfilePathはLPWSTRとして定義されます。 – Sean

+0

はい。 LPCWSTRはconst LPWSTRです。つまり、呼び出し先(CreateProfile)は渡された文字列を変更しません。 –

+0

さて、私は[Out]パラメータをマーシャリングして動作するかどうかを確認します。 – Sean

1

以上の長さを持つことができないことが唯一の問題ではないかもしれないが、あなたはあなたのDLLのインポート宣言でpszProfilePathパラメータに[Out]属性を追加する必要があります。

+0

[Out]属性を追加しましたが、それでも機能しませんでした。私は次に何をしようとするのか分からない。 – Sean

関連する問題