>  기사  >  백엔드 개발  >  C#에서 FormatMessage API 호출에 대한 자세한 소개

C#에서 FormatMessage API 호출에 대한 자세한 소개

黄舟
黄舟원래의
2017-03-15 10:10:041750검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.