COM 编写DLL 回调函数
dll 代码:
test.h文件部分关键代码
IControlClientPtr s_CtrlClientPtr;
typedef int (*completecbfn)(int channum,char * filename,void *flag);
test.cpp文件部分关键代码
static completecbfn m_compfn;
CTestApp theApp;
构造函数中已经 compfn=NULL;
#define NET_API extern "C"__declspec(dllexport)
NET_API int _stdcall record(void *handle, unsigned int channum, short time, char* filename, void* flag, completecbfn pcbfn)
{
m_compfn = pcbfn;
//test.dll调用下层另外一个dll文件
int rtn = theApp.s_CtrlClientPtr->record((long)handle, channum, time, filename);
return rtn;
}
STDMETHODIMP CTestApp::XEventSink::Invoke(DISPID dispid, REFIID, LCID, unsigned short wFlags
, DISPPARAMS* pDispParams, VARIANT* pvarResult, EXCEPINFO* pExcepInfo
, unsigned int* puArgError)
{
if (m_compfn!=NULL)
{
AfxMessageBox("Not NULL");
}else{
AfxMessageBox("NULL");
}
if(dispid == 2)
{
int channum = 0;//pDispParams->rgvarg[1].intVal;
CString temp = pDispParams->rgvarg[0].bstrVal;
char filename[256];
channum = atoi(temp.Mid(3,3));
wsprintf(filename,"%s",temp.Mid(13,255));
AfxMessageBox(filename);
int flag = 1;
int i1=0;
if (m_compfn!=NULL)
i1=m_compfn(channum,filename,&flag);//步骤A
}
return S_OK;
}
用户点击主界面录制按钮响应record事件,录制文件成功,但是当事件自动分发执行invoke中时,录制的dispid=2,所以执行if体,当运行到步骤A时,出现错误显示(Debug Assertion Failed!).想知道为什么这里回调机制会出现问题
test.h文件部分关键代码
IControlClientPtr s_CtrlClientPtr;
typedef int (*completecbfn)(int channum,char * filename,void *flag);
test.cpp文件部分关键代码
static completecbfn m_compfn;
CTestApp theApp;
构造函数中已经 compfn=NULL;
#define NET_API extern "C"__declspec(dllexport)
NET_API int _stdcall record(void *handle, unsigned int channum, short time, char* filename, void* flag, completecbfn pcbfn)
{
m_compfn = pcbfn;
//test.dll调用下层另外一个dll文件
int rtn = theApp.s_CtrlClientPtr->record((long)handle, channum, time, filename);
return rtn;
}
STDMETHODIMP CTestApp::XEventSink::Invoke(DISPID dispid, REFIID, LCID, unsigned short wFlags
, DISPPARAMS* pDispParams, VARIANT* pvarResult, EXCEPINFO* pExcepInfo
, unsigned int* puArgError)
{
if (m_compfn!=NULL)
{
AfxMessageBox("Not NULL");
}else{
AfxMessageBox("NULL");
}
if(dispid == 2)
{
int channum = 0;//pDispParams->rgvarg[1].intVal;
CString temp = pDispParams->rgvarg[0].bstrVal;
char filename[256];
channum = atoi(temp.Mid(3,3));
wsprintf(filename,"%s",temp.Mid(13,255));
AfxMessageBox(filename);
int flag = 1;
int i1=0;
if (m_compfn!=NULL)
i1=m_compfn(channum,filename,&flag);//步骤A
}
return S_OK;
}
用户点击主界面录制按钮响应record事件,录制文件成功,但是当事件自动分发执行invoke中时,录制的dispid=2,所以执行if体,当运行到步骤A时,出现错误显示(Debug Assertion Failed!).想知道为什么这里回调机制会出现问题
...全文
相关推荐
C# 回调CV++ DLL 三种方法 和 多类之间共享一个回调函数
在C#中调用C++(也称为CLI/C++或者托管C++)编写的动态链接库(DLL)并实现回调功能是一项常见的跨语言交互任务。
comport封装dll
在本项目中,Delphi可能被用来编写DLL和相关的回调函数。2. DLL封装:将特定功能封装在DLL中,可以提高代码重用性,减少内存占用,因为代码只需加载一次,多个进程可以共享。
Vc++编写ocx异步调用dll
本文将详细讲解如何使用VC++编写一个OCX控件,以实现异步调用DLL,并通过回调函数来防止网页卡死。首先,我们需要了解OCX和DLL的基本概念。
MT4 Dll请求http源码
在DLL中,我们导入libcurl的头文件,并编写HTTP请求的实现代码。
COM in plain C
#### 示例代码在接下来的部分中,我们将逐步介绍如何实现一个简单的COM组件,包括如何编写C/C++头文件、定义DLL的导出符号、安装和注册DLL以及编写使用该组件的示例程序。


