2013-04-09 1 views
0

Я пытаюсь добавить «О» кнопки в меню System моего приложения, но код, который я нашел бросает ошибку -Как вы правильно добавляете кнопку «О» в системное меню?

Не удается найти точку входа с именем «AppendMenu» в DLL ' user32.

Интересно, может ли кто-нибудь взглянуть на код и сообщить, как мне нужно будет его исправить? Благодарю.

Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As IntPtr, ByVal bRevert As Boolean) As IntPtr 
Private Declare Function AppendMenu Lib "user32" (ByVal hMenu As IntPtr, ByVal uFlags As Int32, ByVal uIDNewItem As IntPtr, ByVal lpNewItem As String) As Boolean 

Private Const MF_STRING As Integer = &H0 
Private Const MF_SEPARATOR As Integer = &H800 

Private Sub AddSysMenuItems() 

    'Get the System Menus Handle. 
    Dim hSysMenu As IntPtr = GetSystemMenu(Me.Handle, False) 

    'Add a standard Separator Item. 
    AppendMenu(hSysMenu, MF_SEPARATOR, 1000, Nothing) 
    'Add an About Menu Item. 
    AppendMenu(hSysMenu, MF_STRING, 1001, "About") 


End Sub 

ответ

5

Ну, сообщение точное, в user32.dll нет точки входа с именем «AppendMenu». На самом деле у него две версии. Один из них называется AppendMenuA, A означает Ansi. Унаследованная версия, которая использует 8-битные кодированные строки, обычно используемые в старых программах на C. И AppendMenuW, W означает Wide. Он берет строку Unicode, как и все функции winapi, в современных версиях Windows.

В заявлении декларации старого стиля используется устаревшая функция. Вы должны использовать ключевое слово Alias, чтобы дать правильное имя Entrypoint:

Private Declare Function AppendMenu Lib "user32.dll" Alias "AppendMenuA" (ByVal hMenu As IntPtr, ByVal uFlags As Int32, ByVal uIDNewItem As IntPtr, ByVal lpNewItem As String) As Boolean 

или просто назвать его AppendMenuA. Использование устаревшей функции не очень красиво, хотя у него не будет проблемы с преобразованием «О» в Юникод. Но благоприятствуют современный способ заявить о PInvoke функции, он имеет много преимуществ, помимо автоматического отображения на A или W версии:

Imports System.Runtime.InteropServices 
Imports System.ComponentModel 
... 
    <DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _ 
    Private Shared Function AppendMenu(ByVal hMenu As IntPtr, ByVal uFlags As Int32, ByVal uIDNewItem As IntPtr, ByVal lpNewItem As String) As Boolean 
    End Function 
... 
     If Not AppendMenu(hSysMenu, MF_STRING, IntPtr.Zero, "About") Then 
      Throw New Win32Exception() 
     End If 
+0

Большое спасибо за то, что это очень полезно. Из-за вашей помощи я собрал ответ и вскоре обновлю свой вопрос. –