1

C# で、kernel32.dll の lstrcpy を使用してポインターから文字列を取得しようとしていますが、うまくいきません。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されるため、新しい文字列を参照するように変更されません。

Text.StringBuilder不変ではないので、使いたいのは a だと思います。

于 2010-05-01T19:04:57.877 に答える