2011-04-28 123 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 2011-04-28 12:26:23

+0

@PVitt,这是很好的知道,但我不知道我输入错误。 – Sean 2011-04-28 12:29:08

+0

您不需要任何MarshalAs属性,因为您只是重复默认设置。 – 2011-04-28 14:28:37

回答

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 2011-04-28 13:05:36

+0

是的。 LPCWSTR是一个const LPWSTR,即被调用者(CreateProfile)不会修改传入的字符串。 – 2011-04-28 13:09:04

+0

好吧,我会编组我的[Out]参数,看它是否有效。 – Sean 2011-04-28 13:13:19

1

它可能不是唯一的问题更大,但你需要的[Out]属性添加到pszProfilePath参数在DLL进口报关。

+0

我添加了[Out]属性,但它仍然无效。我迷失在接下来的尝试。 – Sean 2011-04-28 12:18:09