对于dll封装了发送消息的API,调用程序中对应定义此消息处理的函数,再调用dll就可以了有没有如何实现的例程阿,在VB里面做过没有问题,现在不知道在DELPHI里如何实现Option Explicit Public hwd As Long Private Const GWL_WNDPROC = -4 Public Const GWL_USERDATA = (-21) Public Const WM_SIZE = &H5 Public Const WM_USER = &H400 Public Const WM_COMM_INVENTORY = WM_USER + 10 Public Const WM_COMM_DATA = WM_USER + 9 Public Inventorying As Boolean '将消息信息传送给指定的窗口过程 Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long '获得有关指定窗口的信息 Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long '改变指定窗口的属性 Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long '将一块内存的数据从一个位置复制到另一个位置 Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)Public Function Hook(ByVal hwnd As Long) As Long Dim pOld As Long ' 指定自定义的窗口过程 pOld = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc) ' 保存原来默认的窗口过程指针 SetWindowLong hwnd, GWL_USERDATA, pOld Hook = pOld End FunctionPublic Sub Unhook(ByVal hwnd As Long, ByVal lpWndProc As Long) Dim temp As Long 'Cease subclassing. temp = SetWindowLong(hwnd, GWL_WNDPROC, lpWndProc) End SubPublic Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Select Case uMsg Case WM_COMM_DATA '所有的消息
Case WM_COMM_INVENTORY 'Inventory消息 End Select Dim lpPrevWndProc As Long ' 查询原来默认的窗口过程指针 lpPrevWndProc = GetWindowLong(hw, GWL_USERDATA) ' 调用原来的窗口过程 WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam) End Function
http://topic.csdn.net/t/20030924/20/2296523.html
把你dll里的api导入进来就可以了。。
比如静态导入dll中api,
在
interface 里
声明:
procedure ex_Encipher(array [0..15] of char); stdcall; initialization 里导入dll对应函数
procedure ex_Encipher; external 'Encipher.dll' name 'Encipher'; delphi程序里使用ex_Encipher就可以了 对于dll封装了发送消息的API,调用程序中对应定义此消息处理的函数,再调用dll就可以了
Public hwd As Long
Private Const GWL_WNDPROC = -4
Public Const GWL_USERDATA = (-21)
Public Const WM_SIZE = &H5
Public Const WM_USER = &H400
Public Const WM_COMM_INVENTORY = WM_USER + 10
Public Const WM_COMM_DATA = WM_USER + 9
Public Inventorying As Boolean '将消息信息传送给指定的窗口过程
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'获得有关指定窗口的信息
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
'改变指定窗口的属性
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long '将一块内存的数据从一个位置复制到另一个位置
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)Public Function Hook(ByVal hwnd As Long) As Long
Dim pOld As Long
' 指定自定义的窗口过程
pOld = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
' 保存原来默认的窗口过程指针
SetWindowLong hwnd, GWL_USERDATA, pOld
Hook = pOld
End FunctionPublic Sub Unhook(ByVal hwnd As Long, ByVal lpWndProc As Long)
Dim temp As Long
'Cease subclassing.
temp = SetWindowLong(hwnd, GWL_WNDPROC, lpWndProc)
End SubPublic Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case uMsg
Case WM_COMM_DATA '所有的消息
Case WM_COMM_INVENTORY 'Inventory消息 End Select
Dim lpPrevWndProc As Long
' 查询原来默认的窗口过程指针
lpPrevWndProc = GetWindowLong(hw, GWL_USERDATA)
' 调用原来的窗口过程
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Function
procedure WndProc(var Message: TMessage); override;var MyMsg: UINT;
MyMsg := RegisterWindowMessageprocedure TForm.WndProc(var Message: TMessage);
begin
if Message.Msg = MyMsg then
begin
...
end
else
inherited;
end;