lstrcpy не обновляется, передается в строке - PullRequest
1 голос
/ 30 апреля 2010

Я пытаюсь использовать lstrcpy для kernel32.dll, чтобы получить строку из указателя в 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;
}

1 Ответ

1 голос
/ 01 мая 2010

Я подозреваю, что это может быть связано с тем, что управляемые строки являются неизменяемыми, поэтому всякий раз, когда вы думаете, что изменяете ее, вы фактически создаете новую строку и изменяете ссылку, чтобы вместо этого посмотреть на новую строку.

Я не уверен, как это работает, когда вы используете функции Windows API, но возможно, что во время вызова lstrcpy будет создана новая строка, содержащая текст, на который указывает указатель, а потому что lstrcpy может не помните о System.String, он не обрабатывает его должным образом и поэтому не меняет s на ссылку на новую строку.

Я думаю, что вы хотите использовать Text.StringBuilder, поскольку это не является неизменным.

...