delphi做应用端调用DLL,然后DLL会返回一个自定义消息delphi不熟,是要用winapi做还是其他控件类的?有没有简单的例程学习下,谢谢

解决方案 »

  1.   


    http://topic.csdn.net/t/20030924/20/2296523.html
      

  2.   

    我是有form的,也是这样做吗?
      

  3.   


    把你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就可以了
      

  4.   

    对于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
      

  5.   

    注册全局消息,DLL广播消息,override Delphi窗口过程WndProc,在窗口过程中截获你自定义的全局消息.
      

  6.   

    protected
        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;
      

  7.   

    调用程序和dll定义一个相同的消息号,dll负责发消息,调用程序负责接收处理消息就可以了
      

  8.   

    dll和exe是一样的,定义的消息常量相同就可以了
      

  9.   

    为什么不用回调呢?发消息在DLL中你还得知道应用窗口的句柄.