高手帮忙:将这段代码改写成VB的,分不够再加,谢谢!
我是个小虾米,对C++不太熟悉,别笑我啊!呵呵
问题点数:100、回复次数:19Top
1 楼Snnywf888(AAA)回复于 2005-01-13 11:10:29 得分 0
C++代码如下:
//==============================================================================
// E:\work\SubclassingThunk\1. Tlb\SubclassingSink.idl
//
// Subclassing Thunk (SuperClass V2) Project
// Portions copyright (c) 2002 by Paul Caton <Paul_Caton@hotmail.com>
// Portions copyright (c) 2002 by Vlad Vissoultchev <wqweto@myrealbox.com>
//
// The Subclassing Sink interface definition
//
// Modifications:
//
// 2002-09-28 WQW Initial implementation based on the original
// iSuperClass.cls
//
//==============================================================================
[
uuid(63441E51-0F47-4888-B620-88BAC83A4C1F),
version(1.0),
helpstring("Subclassing/Hooking sink interfaces 1.0")
]
library SubclassingSink
{
importlib("stdole2.tlb");
interface ISubclassingSink;
interface IHookingSink;
typedef enum {
WH_MSGFILTER = (-1),
WH_JOURNALRECORD = 0,
WH_JOURNALPLAYBACK = 1,
WH_KEYBOARD = 2,
WH_GETMESSAGE = 3,
WH_CALLWNDPROC = 4,
WH_CBT = 5,
WH_SYSMSGFILTER = 6,
WH_MOUSE = 7,
WH_HARDWARE = 8,
WH_DEBUG = 9,
WH_SHELL = 10,
WH_FOREGROUNDIDLE = 11,
WH_CALLWNDPROCRET = 12,
WH_KEYBOARD_LL = 13,
WH_MOUSE_LL = 14
} HookType;
typedef enum {
HCBT_MOVESIZE = 0,
HCBT_MINMAX = 1,
HCBT_QS = 2,
HCBT_CREATEWND = 3,
HCBT_DESTROYWND = 4,
HCBT_ACTIVATE = 5,
HCBT_CLICKSKIPPED = 6,
HCBT_KEYSKIPPED = 7,
HCBT_SYSCOMMAND = 8,
HCBT_SETFOCUS = 9,
PM_NOREMOVE = 0x0000,
PM_REMOVE = 0x0001,
PM_NOYIELD = 0x0002,
HC_ACTION = 0,
HC_GETNEXT = 1,
HC_SKIP = 2,
HC_NOREMOVE = 3,
HC_NOREM = 3,
HC_SYSMODALON = 4,
HC_SYSMODALOFF = 5,
MSGF_DIALOGBOX = 0,
MSGF_MESSAGEBOX = 1,
MSGF_MENU = 2,
MSGF_SCROLLBAR = 5,
MSGF_NEXTWINDOW = 6,
MSGF_MAX = 8,
MSGF_USER = 4096,
MSGF_DDEMGR = 0x8001,
HSHELL_WINDOWCREATED = 1,
HSHELL_WINDOWDESTROYED = 2,
HSHELL_ACTIVATESHELLWINDOW = 3,
HSHELL_WINDOWACTIVATED = 4,
HSHELL_GETMINRECT = 5,
HSHELL_REDRAW = 6,
HSHELL_TASKMAN = 7,
HSHELL_LANGUAGE = 8
} HookCode;
typedef long LPARAM;
typedef long WPARAM;
typedef long LRESULT;
typedef long UINT;
typedef long HWND;
typedef long BOOL;
typedef long LPVOID;
typedef long HINSTANCE;
typedef long HMENU;
typedef LPSTR LPCTSTR;
typedef long DWORD;
typedef long ULONG_PTR;
typedef struct tagPOINTAPI {
LONG x;
LONG y;
} POINTAPI;
typedef struct _RECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT;
typedef struct tagCWPSTRUCT {
LPARAM lParam;
WPARAM wParam;
UINT message;
HWND hwnd;
} CWPSTRUCT;
typedef struct tagCWPRETSTRUCT {
LRESULT lResult;
LPARAM lParam;
WPARAM wParam;
UINT message;
HWND hwnd;
} CWPRETSTRUCT;
typedef struct tagCBTACTIVATESTRUCT {
BOOL fMouse;
HWND hWndActive;
} CBTACTIVATESTRUCT;
typedef struct tagCREATESTRUCT {
LPVOID lpCreateParams;
HINSTANCE hInstance;
HMENU hMenu;
HWND hwndParent;
int cy;
int cx;
int y;
int x;
LONG style;
long lpszName;
long lpszClass;
DWORD dwExStyle;
} CREATESTRUCT;
typedef struct tagCBT_CREATEWND {
long lpcs;
HWND hwndInsertAfter;
} CBT_CREATEWND;
typedef struct tagMOUSEHOOKSTRUCT {
POINTAPI pt;
HWND hwnd;
UINT wHitTestCode;
ULONG_PTR dwExtraInfo;
} MOUSEHOOKSTRUCT;
typedef struct tagDEBUGHOOKINFO {
DWORD idThread;
DWORD idThreadInstaller;
LPARAM lParam;
WPARAM wParam;
int code;
} DEBUGHOOKINFO;
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINTAPI pt;
} MSG;
typedef struct tagEVENTMSG {
UINT message;
UINT paramL;
UINT paramH;
DWORD time;
HWND hwnd;
} EVENTMSG;
typedef struct tagKBDLLHOOKSTRUCT {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT;
typedef struct tagMSLLHOOKSTRUCT {
POINTAPI pt;
DWORD mouseData;
DWORD flags;
DWORD time;
ULONG_PTR dwExtraInfo;
} MSLLHOOKSTRUCT;
typedef enum {
GWL_WNDPROC = (-4),
GWL_HINSTANCE = (-6),
GWL_HWNDPARENT = (-8),
GWL_STYLE = (-16),
GWL_EXSTYLE = (-20),
GWL_USERDATA = (-21),
GWL_ID = (-12)
} GWLIndex;
Top
2 楼BluntBlade(信仰迷离·重构之道,在于Redo/Undo之间)回复于 2005-01-13 11:11:14 得分 0
发错版面了吧?Top
3 楼Snnywf888(AAA)回复于 2005-01-13 11:12:26 得分 0
[
odl,
uuid(012A34BE-6FB0-418A-A94F-93B74050A680),
version(1.0),
dual,
nonextensible,
oleautomation
]
interface ISubclassingSink : IDispatch {
[id(1)] HRESULT After(
[in, out] long* lReturn,
[in] long hWnd,
[in] long uMsg,
[in] long wParam,
[in] long lParam);
[id(2)] HRESULT Before(
[in, out] boolean* bHandled,
[in, out] long* lReturn,
[in, out] long* hWnd,
[in, out] long* uMsg,
[in, out] long* wParam,
[in, out] long* lParam);
};
[
odl,
uuid(012A34BF-6FB0-418A-A94F-93B74050A680),
version(1.0),
dual,
nonextensible,
oleautomation
]
interface IHookingSink : IDispatch {
[id(1)] HRESULT After(
[in, out] long* lReturn,
[in] HookCode nCode,
[in] long wParam,
[in] long lParam);
[id(2)] HRESULT Before(
[in, out] boolean* bHandled,
[in, out] long* lReturn,
[in, out] HookCode* nCode,
[in, out] long* wParam,
[in, out] long* lParam);
}
/*
[dllname("kernel32")]
module Kernel32 {
[entry("GetModuleHandleA")]
long _stdcall GetModuleHandle ([in] LPSTR lpModuleName);
[entry("GetProcAddress")]
long _stdcall GetProcAddress (
[in] long hModule,
[in] LPSTR lpProcName);
[entry("RtlMoveMemory")]
long _stdcall CopyMemory (
[in] long Destination,
[in] long Source,
[in] long Length);
[entry("lstrlenA")]
long _stdcall lstrlen ([in] long lpsz);
[entry("lstrcpyA")]
long _stdcall lstrcpy (
[in] LPSTR lpDest,
[in] long lpSou);
}
[dllname("user32")]
module User32 {
[entry("SetWindowsHookExA")]
long _stdcall SetWindowsHookEx (
[in] HookType idHook,
[in] long lpfn,
[in] long hMod,
[in] long dwThreadId);
[entry("UnhookWindowsHookEx")]
long _stdcall UnhookWindowsHookEx ([in] long hHook);
[entry("GetWindowLongA")]
long _stdcall GetWindowLong (
[in] long hWnd,
[in] GWLIndex nIndex);
[entry("SetWindowLongA")]
long _stdcall SetWindowLong (
[in] long hWnd,
[in] GWLIndex nIndex,
[in] long dwNewLong);
[entry("CallWindowProcA")]
long _stdcall CallWindowProc (
[in] long lpPrevWndFunc,
[in] long hWnd,
[in] long uMsg,
[in] long wParam,
[in] long lParam);
}
*/
};Top
4 楼xuzheng318(忧郁王子)回复于 2005-01-13 11:29:11 得分 5
请问楼主,这是什么代码?
感觉应该到vc里面看看!Top
5 楼Snnywf888(AAA)回复于 2005-01-14 09:02:33 得分 0
是VC的代码,有会的吗?Top
6 楼goodluckyxl(被人遗忘的狗)回复于 2005-01-14 09:06:02 得分 5
vb 是启蒙语言
支持点人气 ^_^Top
7 楼beyondtkl(大龙驹<*好久没来了,兄弟们好吧。*>)回复于 2005-01-14 09:20:19 得分 5
都是一些類型定義而已呀。。。
樓主 是不是想hook api之類得??Top
8 楼Snnywf888(AAA)回复于 2005-01-14 09:44:29 得分 0
是,快帮帮我呀Top
9 楼sandrowjw(我的小猫照片给弄坏了,心都碎了)回复于 2005-01-14 09:48:45 得分 5
IDL文法转成VB干什么?Top
10 楼Flood1984(峰子)回复于 2005-01-14 09:49:20 得分 5
IDE开发工具中的语句并不是顺便就能互换的,
每种工具都有自己的函数库,
想互换哪儿那么容易,重新写来的更快。
Top
11 楼sandrowjw(我的小猫照片给弄坏了,心都碎了)回复于 2005-01-14 09:52:17 得分 70
IDL:
typedef enum {
WH_MSGFILTER = (-1),
WH_JOURNALRECORD = 0,
WH_JOURNALPLAYBACK = 1,
WH_KEYBOARD = 2,
WH_GETMESSAGE = 3,
WH_CALLWNDPROC = 4,
WH_CBT = 5,
WH_SYSMSGFILTER = 6,
WH_MOUSE = 7,
WH_HARDWARE = 8,
WH_DEBUG = 9,
WH_SHELL = 10,
WH_FOREGROUNDIDLE = 11,
WH_CALLWNDPROCRET = 12,
WH_KEYBOARD_LL = 13,
WH_MOUSE_LL = 14
} HookType;
-->
VB:
public const WH_MSGFILTER = (-1),
public const WH_JOURNALRECORD = 0,
public const WH_JOURNALPLAYBACK = 1,
public const WH_KEYBOARD = 2,
public const WH_GETMESSAGE = 3,
public const WH_CALLWNDPROC = 4,
public const WH_CBT = 5,
public const WH_SYSMSGFILTER = 6,
public const WH_MOUSE = 7,
public const WH_HARDWARE = 8,
public const WH_DEBUG = 9,
public const WH_SHELL = 10,
public const WH_FOREGROUNDIDLE = 11,
public const WH_CALLWNDPROCRET = 12,
public const WH_KEYBOARD_LL = 13,
public const WH_MOUSE_LL = 14
Top
12 楼r_swordsman(取什么样的昵称才有个性又能显示出来而且不能太长?)回复于 2005-01-14 09:55:57 得分 0
转成汇编就容易~~~~换VB难啊~~~~
有些特性VB没啊~~~~~Top
13 楼Snnywf888(AAA)回复于 2005-01-14 09:57:30 得分 0
它是枚举类型里的元素,不能提出来吧,应该是这样的吧?
Public Enum HookType
WH_MSGFILTER = (-1)
WH_JOURNALRECORD = 0
WH_JOURNALPLAYBACK = 1
WH_KEYBOARD = 2
WH_GETMESSAGE = 3
WH_CALLWNDPROC = 4
WH_CBT = 5
WH_SYSMSGFILTER = 6
WH_MOUSE = 7
WH_HARDWARE = 8
WH_DEBUG = 9
WH_SHELL = 10
WH_FOREGROUNDIDLE = 11
WH_CALLWNDPROCRET = 12
WH_KEYBOARD_LL = 13
WH_MOUSE_LL = 14
End Enum
Top
14 楼Snnywf888(AAA)回复于 2005-01-14 10:01:51 得分 0
再问一个可笑的问题:TLB类库文件是用什么工具写出来的?还有IDL文件和它是什么关系?Top
15 楼Snnywf888(AAA)回复于 2005-01-14 10:02:24 得分 0
还有IDL文件是干什么用的?Top
16 楼sandrowjw(我的小猫照片给弄坏了,心都碎了)回复于 2005-01-14 10:07:26 得分 0
typedef struct tagCBTACTIVATESTRUCT {
BOOL fMouse;
HWND hWndActive;
} CBTACTIVATESTRUCT
--〉
PUBLIC TYPE CBTACTIVATESTRUCT
fMouse as BOOL
hWndActive as HWND
end type
都是举个例子,其他楼主自己做了,没法全做
还有typedef好像不能翻Top
17 楼sandrowjw(我的小猫照片给弄坏了,心都碎了)回复于 2005-01-14 10:16:10 得分 0
IDL可以通过使用工具(MIDL?)翻译成接口头文件tlh和库定义文件tlb,好像还能够生成stub和proxy的代码(这个我不太确定,因为米有深究过)。
Top
18 楼sandrowjw(我的小猫照片给弄坏了,心都碎了)回复于 2005-01-14 10:18:29 得分 0
写错了,有些类型不能直接用,要用等价的原类型
PUBLIC TYPE CBTACTIVATESTRUCT
fMouse as boolean
hWndActive as long
end type
Top
19 楼yjh1982(血精灵)回复于 2005-01-14 10:21:35 得分 5
VB有枚举么?Top




