LoadMenu 与 MAKEINTRESOURCE

LoadMenu:
HMENU LoadMenu(
  HINSTANCE hInstance,  // handle to module
  LPCTSTR lpMenuName    // menu name or resource identifier
);
其中参数 lpMenuName是用MAKEINTRESOURCE产生的,而
#define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i)))
#define MAKEINTRESOURCEW(i) (LPWSTR)((DWORD)((WORD)(i)))
#ifdef UNICODE
#define MAKEINTRESOURCE  MAKEINTRESOURCEW
#else
#define MAKEINTRESOURCE  MAKEINTRESOURCEA
#endif // !UNICODE
vc中就是这么做的,那么在vb中呢,关键是要翻译宏MAKEINTRESOURCE,一些api的声明工具会这样声明LoadMenu
Private Declare Function LoadMenu Lib "user32.dll" Alias "LoadMenuA" (ByVal hInstance As Long, ByVal lpString As String) As Long

最后一个参数是string,然后,由宏MAKEINTRESOURCE的写法可知,这个宏虽然是将WORD转为了LPSTR(LPWSTR),但实质数据并没有变,所以在vb中,第二个参数用Long其实是一样的,所以应该这样改,
Private Declare Function LoadMenu Lib "user32.dll" Alias "LoadMenuA" (ByVal hInstance As Long, ByVal lpString As Long) As Long
一切问题解决,(可能还有些问题吧,不然不会有宏MAKEINTRESOURCE)
vb例子:
Option Explicit
Private Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function LoadMenu Lib "user32.dll" Alias "LoadMenuA" (ByVal hInstance As Long, ByVal lpString As Long) As Long
Private Declare Function SetMenu Lib "user32.dll" (ByVal hwnd As Long, ByVal hMenu As Long) As Long
Private Sub Command1_Click()
Dim tMenu&
tMenu = LoadMenuVB2(24641, "SHDOCLC.DLL")
SetMenu Me.hwnd, tMenu
End Sub

Public Function LoadMenuVB2(id&, slib$) As Long
Dim hinstSHDOCLC&
Dim hMenu&
hinstSHDOCLC = LoadLibrary(slib)
LoadMenuVB2 = LoadMenu(hinstSHDOCLC, ByVal id)
End Function

(好像还要FreeLibrary,呵呵)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值