선언:

C#

[DllImport("kernel32", CharSet = CharSet.Auto)]
public static extern Int32 FormatMessage(Int32 dwFlags, IntPtr lpSource, Int32 dwMessageId, Int32 dwLanguageId, out String lpBuffer, Int32 dwSize, IntPtr lpArguments);


VB.NET

<DllImport("kernel32", CharSet := CharSet.Auto)> _
Public Shared Function FormatMessage(ByVal dwFlags As Int32, ByVal lpSource As IntPtr, ByVal dwMessageId As Int32, ByVal dwLanguageId As Int32, ByRef lpBuffer As StringByVal dwSize As Int32, ByVal lpArguments As IntPtr) As Int32
End Function




사용 예제:

오류 코드를 메세지로 바꿔보자!




매개 변수 설명:

dwFlags - 메세지를 형식화할 때 사용될 옵션을 입력합니다.

lpSource - 메세지가 정의된 핸들을 입력합니다.

dwMessageId - 메세지 번호를 입력합니다.

dwLanguageId - 언어 번호를 입력합니다.

lpBuffer - 형식화된 메세지가 저장될 버퍼를 입력합니다.

dwSize - 버퍼의 크기를 입력합니다.

lpArguments - 매개 변수를 입력합니다.




API 설명:

메세지를 형식화합니다.




참고:

FormatMessage (MSDN)




비고:

이 API는 오류 코드에 해당하는 메세지를 가져올 때 유용하게 사용될 수 있습니다.

lpSource 매개변수의 경우, FORMAT_MESSAGE_FROM_HMODULE 또는 FORMAT_MESSAGE_FROM_STRING 옵션이 주어진 경우에만 유효합니다.

dwMessageId 의 경우 말 그대로 메세지 번호(=오류 코드 등)를 입력하면 되고, dwLanguageId 의 경우 시스템 기본 언어를 사용할 경우엔 0x400 을 넘겨주시면 됩니다.

C언어의 MAKELANGID 매크로의 C#, VB.NET 정의는 다음과 같습니다.


C#의 경우:

public static Int32 MAKELANGID(Int32 primary, Int32 sub) {
    return (((UInt16) sub << 10) | (UInt16) primary);
}


VB.NET의 경우:

Public Shared Function MAKELANGID(ByVal primary As Int32, ByVal [sub] As Int32) As Int32
    Return ((CUShort([sub]) << 10) Or CUShort(primary))
End Function


lpBuffer의 경우 형식화된 메세지가 저장될 버퍼로써, FORMAT_MESSAGE_ALLOCATE_BUFFER 옵션이 정의된 경우 버퍼가 저장될 변수를 초기화할 필요가 없습니다. (API 내부에서 메모리 할당 후 버퍼에 값을 넣습니다)


dwSize의 경우 FORMAT_MESSAGE_ALLOCATE_BUFFER 옵션이 정의된 경우, 버퍼를 dwSize 만큼 LocalAlloc 을 사용해 할당합니다.


lpArguments 의 경우 printf, scanf 등에서 사용하는 형식문자열 같은 개념인데 %1을 첫 번째 매개 변수로 바꾸고 %2를 두번째 매개변수로, %n을 n번째 매개변수로 바꿉니다.

'API Reference' 카테고리의 다른 글

19. LoadLibrary  (0) 2014.10.01
18. GetModuleHandle  (0) 2014.09.30
16. GetLastError  (0) 2014.09.27
15. GetAsyncKeyState  (0) 2014.09.26
14. SetCursorPos  (0) 2014.09.25

+ Recent posts