2010-04-30 45 views
1

我想使用kernel32.dll的lstrcpy从C#中的指针获取字符串,但它不工作。 lstrlenA正在工作,它给了我字符串的长度,所以我至少碰到了kernel32.dll。 lstrcpy正在我转换的VB6应用程序中工作,所以我知道它可以工作,但我不知道它为什么不在这里。lstrcpy没有更新传递字符串

字符串s永远不会被实际字符串填充,它只是返回初始填充字符串。

[DllImport("kernel32.dll", EntryPoint = "lstrlenA", CharSet = CharSet.Ansi)] 
private static extern int lstrlen(int StringPointer); 

[DllImport("kernel32.dll",EntryPoint = "lstrcpyA", CharSet = CharSet.Ansi)] 
private static extern int lstrcpy(string lpString1, int StringPointer); 

private static string StringFromPointer(int pointer) 
{ 
    //.....Get the length of the LPSTR 
    int strLen = lstrlen(pointer); 

    //.....Allocate the NewString to the right size 
    string s = ""; 
    for (int i = 0; i < strLen; i++) 
     s += " "; 

    //.....Copy the LPSTR to the VB string 
    lstrcpy(s, pointer); 
    return s; 
} 
+0

为什么你不使用Marshal.PtrToStringAnsi? http://msdn.microsoft.com/en-us/library/7b620dhe(v=VS.100).aspx – dtb 2010-04-30 17:06:58

+0

Marshal.PtrToStringAnsi的作品!如果你回答它,我会将其标记为接受的答案。 – 2010-05-04 15:01:01

回答

1

我怀疑它可能是做管理的字符串是不变的,所以,只要你觉得你改变它,你实际上是在创建一个新的字符串并更改参考看看新字符串。

我不确定在使用Windows API函数时工作原理如何,但可能在调用lstrcpy期间创建一个包含指针指向的文本的新字符串,但由于lstrcpy可能不知道System.String,它没有正确处理它,因此它不会更改s以引用新字符串。

我认为你想要使用的是Text.StringBuilder,因为这不是不可变的。