1

我正在尝试使用 kernel32.dll 的 lstrcpy 从 C# 中的指针获取字符串,但它不起作用。lstrlenA 正在工作,它给了我字符串的长度,所以我至少打了 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;
}
4

1 回答 1

1

我怀疑这可能与托管字符串不可变有关,因此每当您认为要更改它时,实际上是在创建一个新字符串并更改引用以查看新字符串。

我不确定当您使用 Windows API 函数时它是如何工作的,但有可能在调用过程中lstrcpy创建了一个包含指针指向的文本的新字符串,但因为lstrcpy可能不知道System.String,它不处理它正确,因此它不会更改s为引用新字符串。

我认为你想要使用的是 aText.StringBuilder因为它不是一成不变的。

于 2010-05-01T19:04:57.877 回答