'VC 头文件的声明
#define  CCLIENT_API extern"C" __declspec(dllimport)
CCLIENT_API void  __stdcall ClientReadMessage(char *m_sIP,char *m_sCommand,WORD *m_wLen);
CCLIENT_API BOOL  __stdcall ClientStartup(UINT nMessage,HWND hWnd);函数MP4_ClientReadLastMessage是VC生成的client.dll里面的一个函数
第一个参数表示消息来自哪一个IP地址,
第二个参数表示消息的具体内容,
第三个参数表示消息的长度函数ClientStartup是VC生成的client.dll里面的一个函数
第一个参数表示对应接收程序的消息,
第二个参数表示应用程序窗口句柄'VB 声明Public Declare Function ClientReadMessage Lib "client.dll" (ByVal m_sIP As String, ByVal m_scommand As String, ByRef m_wLen As Long)
Public Declare Function ClientStartup Lib "client.dll" (ByVal nMessage As Long, ByVal hWnd As Long) As Boolean 
'代码实现部分
'frmMain为主窗口Const WM_USER = &H400
Const WM_MYCOMMAND = WM_USER + 100Private Sub Form_Load()
 
   StartGetMsg
   ClientStartup(WM_MYCOMMAND, Me.hWnd)  '第一个参数表示对应接收程序的消息,第二个参数表示应用程序窗口句柄End Sub
Public Sub StartGetMsg()
    Load frmMain
    prevWndProc = GetWindowLong(frmMain.hWnd, GWL_WNDPROC)
    SetWindowLong frmMain.hWnd, GWL_WNDPROC, AddressOf WndProc
End SubPublic Sub EndGetMsg()
   SetWindowLong frmMain.hWnd, GWL_WNDPROC, prevWndProc
    Unload frmMain
End Sub
Public Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim sMsg As String
    Dim ctemp As String
    Dim Length As Long
    Dim m_scommand As String
  
    If Msg = WM_MYCOMMAND Then
      If wParam = 10 Then '10对应于客户端接受到的是字符串,接下来调用函数ClientReadMessage来读取
      Call ClientReadMessage(ctemp, m_scommand, Length) '程序调用了这个函数之后就崩溃了
      MsgBox m_scommand
      WndProc = 1
      Exit Function
      End If
    Else
      WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
   End If
      
End Function应用程序调用了函数ClientReadMessage之后,程序就崩溃了....我曾经跟踪进入client.dll的函数ClientReadMessage,发现函数里面都是正常的,应该是VB这边的问题。有谁可以帮助我一下吗,非常感谢!!

解决方案 »

  1.   

    Call ClientReadMessage(ctemp, m_scommand, Length) '程序调用了这个函数之后就崩溃了ctemp和m_scommand参数是用来传入值的还是传出的?如果是传出,你需要首先设定一下这两个字符串的长度,例如:ctemp = String(256)
      

  2.   

    又是vb凋vc的问题,我的也一样的问题,经常崩溃,帮up
      

  3.   

    谢谢楼上几位的帮助。我在声明的时候,采用如下方法也试了,还是不行。
    Dim ctemp As String * 1000
    m Length As Long
    Dim m_scommand As String * 1000如下方法也不行
    Dim ctemp As String 
    Dim Length As Long
    Dim m_scommand As String ctemp = String(1000, Chr(0))
    m_scommand = String(1000, Chr(0))当客户端接受到消息,调用函数ClientReadMessage 读取时,VB程序都是崩溃的....有谁可以帮助一下吗,这个问题已经整整困惑我2天了....茶不思,饭不香啊....
      

  4.   

    是不是因为
    MsgBox m_scommand
    的原因阿.这种回调函数里面加msgbox很容易就崩溃阿
      

  5.   

    仔细看了一下,发现声明应该是这样:
    Public Declare Sub ClientReadMessage Lib "client.dll" (ByVal m_sIP As String, ByVal m_scommand As String, ByRef m_wLen As Integer)
    Public Declare Function ClientStartup Lib "client.dll" (ByVal nMessage As Long, ByVal hWnd As Long) As Long
      

  6.   

    小弟叩谢楼上几位大哥的帮助....感受到了集体的温暖,感受到伟大祖国的怀抱,问题已经得到了解决!结合TechnoFantasy(冰儿马甲www.applevb.com) 和supergreenbean(超级绿豆 - 要准备发芽了) 的
    好建议,问题已经得到了圆满解决。看来,以后从DLL里面声明函数的时候,得千万注意函数有没有返回值啊....再次感谢楼上几位的恢复。Have a good Day !!