FormatMessage는 WINDOWS에서 제공하는 API로, Windows API 호출 시 반환되는 오류 코드에 해당하는 텍스트 정보를 가져오는 데 사용되었습니다. 이전에는 C#에서는 아직 사용해 본 적이 없습니다. 주로 C#에서 Windows API를 호출하는 몇 가지 규칙을 잘 모르기 때문입니다.
최근 갑자기 VC++ WIN32를 사용하여 휴대폰 프로그램을 개발하는 데 관심이 생겼습니다. 오랫동안 사용하지 않았던 C++를 선택했습니다. 물론 Windows API를 자주 다루어야 합니다. C#을 많이 작성하고 다시 VB를 사용하는데 익숙하지 않아서 C#에서 이 메서드를 호출했습니다. C++에서 직접 사용하면 어떨까요? 글쎄, 모바일에서 디버깅하는 것은 약간 번거롭고 너무 많은 코드를 작성하고 싶지 않습니다. C#이 훨씬 더 편리하고 사용하기 빠릅니다.
DWORD WINAPI FormatMessage( in DWORD dwFlags, in LPCVOID lpSource, in DWORD dwMessageId, in DWORD dwLanguageId, out LPTSTR lpBuffer, in DWORD nSize, in va_list* Arguments );
const int FORMAT_MESSAGE_FROM_SYSTEM = 0x1000; const int FORMAT_MESSAGE_IGNORE_INSERTS = 0x200; [DllImport("Kernel32.dll")] private static extern int FormatMessage(uint dwFlags, IntPtr lpSource, uint dwMessageId, uint dwLanguageId, [Out]StringBuilder lpBuffer, uint nSize, IntPtr arguments);
C#의 FormatMessage API 프로토타입 및 정의입니다. 두 번째 및 마지막 매개변수는 사용되지 않으므로 IntPtr 또는 int로 정의할 수 있습니다. For 호출 시 0이 전달됩니다. IntPtr, IntPtr.Zero를 전달합니다.
더 짜증나는 것은 반환된 텍스트 정보를 받는 데 사용되는 lpBuffer 매개 변수입니다. VB에서는 이러한 유형의 매개 변수를 ByVal String으로 정의한 다음 Space(길이)로 초기화합니다(String 은 지정된 길이의 공백으로 초기화되므로 호출 시 nSize에 길이 값을 지정하면 됩니다.
ref 또는 out으로 변경하려고 하면 작동하지 않습니다. Ref는 포인터 오류를 직접 보고하는 반면 out은 함수 호출이 실패함을 의미합니다. 나중에 C#의 문자열 처리가 C의 처리와 유사하다는 것을 기억했습니다. 문자열 값을 수정한다는 것은 실제로 문자열을 버리고 선언하는 것을 의미합니다. . 새 문자열입니다. 분명히 여기서는 출력 매개변수를 문자열로 정의할 수 없습니다.마지막으로 StringBuilder로 변경하고 [Out]속성
으로 수정합니다. 호출 시:uint dwFlags= FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS ; string lpBuffer=new string(' ',260); int count=FormatMessage(dwFlags,IntPtr.Zero,1439,0,lpBuffer,260,IntPtr.Zero);성공!
위 내용은 C#에서 FormatMessage API 호출에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!