当前位置:编程学习 > VB >>

VB调用DLL中的回调函数

DLL中的函数:
CPLAYER_APIIMPORT BOOL __stdcall VS_MP4_ClientGetServerFileList(char *m_lAddrIP,char m_cChannel,char m_cType,PTIME_PARA m_pStartTime,PTIME_PARA m_pStopTime,void(WINAPI *FileListCallBack)(char m_cFilename[]),WORD dserverport = 8000);

回调函数:
void WINAPI FileListPlayBack(char filename[])
{
if(strcmp(filename ,"") == 0)
{
AfxMessageBox("获取文件列表结束,文件已经全部列出");
}
else if(strcmp(filename," ") == 0)
AfxMessageBox("由于服务器忙,或网络故障,获取文件列表异常终止");
else
{
RemotePlayDlg.m_filelist.AddString(filename);
}
}


VB调用:
模块:
Type PTIME_PARA
    dwYear As Long
    dwMonth As Long
    dwDay As Long
    dwHour As Long
    dwMinute As Long
    dwSecond As Long
End Type

'CPLAYER_APIIMPORT BOOL  __stdcall VS_MP4_ClientGetServerFileList(char *m_lAddrIP,char m_cChannel,char m_cType,PTIME_PARA m_pStartTime,PTIME_PARA m_pStopTime,void(WINAPI *FileListCallBack)(char m_cFilename[]),WORD dserverport = 8000);
Public Declare Function VS_MP4_ClientGetServerFileList Lib "HikMP4Net.dll" (ByVal m_lAddrIP As String, ByVal m_cChannel As String, ByVal m_cType As String, ByRef m_pStartTime As PTIME_PARA, ByRef m_pStopTime As PTIME_PARA, ByVal FileListCallBack As Long, ByVal dserverport As Long) As Boolean


Public Sub FileListPlayBack(ByRef FileName() As String)
  
    Form1.Text1.Text = "1"     '这里无论写什么都没有反应,应该不是这里的问题
End Sub


窗体form1:
Dim HaiKangTimeStart As PTIME_PARA        '时间,赋值过程就不写了
Dim HaiKangTimeEnd As PTIME_PARA


Private Sub Command1_Click()


    Dim ret As Long
    
    ret = VS_MP4_ClientGetServerFileList("IP地址", "1", "4", HaiKangTimeStart, HaiKangTimeEnd, AddressOf FileListPlayBack, 8000)
  
    
End Sub

单击command1程序运行没有出错,ret的返回值是0(没有问题),但FileListPlayBack中的程序没有运行,为什么????
我在FileListPlayBack中打了个断点,结果程序就没有运行到这里!



--------------------编程问答-------------------- 把你的FileListPlayBack函数放到模块中看看 --------------------编程问答-------------------- FileListPlayBack函数就是在模块中啊,
要是在窗体里,根本就不能执行,报错! --------------------编程问答-------------------- ByRef FileName() As String

这里应该是 Byte 类型的数据
在C(C++)中 char 类型其实就是 byte 类型数据


还有一点,试试把函数写成带返回类型的试试(Sub 改 Function) --------------------编程问答-------------------- 楼上说的试过了,还是不行 --------------------编程问答-------------------- 帮顶 --------------------编程问答-------------------- 'CPLAYER_APIIMPORT BOOL  __stdcall VS_MP4_ClientGetServerFileList(char *m_lAddrIP,char m_cChannel,char m_cType,PTIME_PARA m_pStartTime,PTIME_PARA m_pStopTime,void(WINAPI *FileListCallBack)(char m_cFilename[]),WORD dserverport = 8000); 
Public Declare Function VS_MP4_ClientGetServerFileList Lib "HikMP4Net.dll" (ByVal m_lAddrIP As String, ByVal m_cChannel As Byte, ByVal m_cType As Byte, m_pStartTime As PTIME_PARA, m_pStopTime As PTIME_PARA, ByVal FileListCallBack As Long, ByVal dserverport As Integer) As Long


Public Sub FileListPlayBack(ByVal FileName As String) 
 
...

End Sub 
--------------------编程问答-------------------- 楼上的方法还是不行 --------------------编程问答-------------------- 是哪里不行呢,根据你的C函数声明,VB的声明就是这样了 --------------------编程问答-------------------- DLL确认没问题么?
补充:VB ,  API
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,