2010-04-30 4 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

+0

Marshal.PtrToStringAnsi가 작동합니다! 대답하면 받아 들일만한 대답으로 표시 할 것입니다. –

답변

1

나는 당신이 당신이 그것을 바꿀 수있을 거라고 생각 할 때마다, 당신이 실제로 새 문자열을 만들 수 있도록, 관리되는 문자열을 변경할 수있는 함께 할 수있는 뭔가하고 새로운보고 기준이 변경 될 수 있습니다 의심 문자열 대신.

Windows API 함수를 사용할 때 어떻게 작동하는지 잘 모르겠지만 lstrcpy을 호출하는 동안 포인터가 가리키는 텍스트가 포함되어 있지만 lstrcpy을 인식하지 못할 수 있으므로 새 문자열이 만들어 질 수 있습니다 System.String, 올바르게 처리하지 못하므로 새 문자열을 참조하도록 s을 변경하지 않습니다.

나는 당신이 사용하고자하는 것이 Text.StringBuilder이기 때문에 그 것이 변경 가능하지 않다고 생각합니다.