我正在尝试使用kernel32.dll的lstrcpy从C#中的指针获取字符串,但它无效。 lstrlenA IS正在工作,它给了我字符串的长度,所以我至少要点击kernel32.dll。 lstrcpy正在我正在转换的VB6应用程序中工作,所以我知道它可以工作,但我不知道为什么它不在这里。
字符串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 :(得分:1)
我怀疑它可能与托管字符串不可变有关,所以每当你认为你正在改变它时,你实际上是在创建一个新字符串并改变引用来查看新字符串。 / p>
我不确定当你使用Windows API函数时它是如何工作的,但是在调用lstrcpy
期间可能会创建一个包含指针指向的文本的新字符串,但因为{{1可能不知道lstrcpy
,它没有正确处理它,所以它不会改变System.String
来引用新字符串。
我认为您想要使用的是s
,因为这不是一成不变的。