能否在DLL中调用调用者的函数?

ashamwolf 2016-07-12 04:22:17
如标题。具体说明如下。
DLL中:
typedef int (*pfProc)(char *s);
pfProc gpf;

SetProc(pfProc pf) //调用者调用该函数来设置给DLL调用的函数。
{
gpf = pf;
}
DLL在其他函数中调用gpf(s);

调用者:
int Proc(char *s)
{
...
}

SetProc(Proc);


这样做会有什么问题吗?

现在测试的时候发现很奇怪的问题,在一个工程中没出现问题,但是在另一个工程中就会异常退出,而且如果调用者不调用SetProc就不会异常退出。
...全文
652 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
encoderlee 2016-07-21
  • 打赏
  • 举报
回复
可能是内存分配和释放问题,如果EXE和DLL不是同一个编译器编译出来的,且没有采用/MD编译,
则内存的分配和释放要遵循“谁分配谁释放”原则,即一块内存在EXE中分配(malloc new等),则只能在EXE中释放,
不能在EXE中分配(malloc new),在DLL中释放(free delete)
另外也不能在EXE和DLL间直接传递std::string std:vector等高级类型
sevancheng 2016-07-19
  • 打赏
  • 举报
回复
没有问题,使用过,内存尽量不要跨模块分配和释放,另外修改工程编译选项为 MTD 试试
oyljerry 2016-07-17
  • 打赏
  • 举报
回复
主要就是传递函数指针等要注意dll跟exe调用者之间的各种各样mfc vc运行时环境等都一致
zgl7903 2016-07-12
  • 打赏
  • 举报
回复
明确调用方式, 回调时捕捉SEH异常,避免奔溃, 另外推荐回调函数中传入调用者指针,方便处理 举例

//Dll端 

//回调函数声明
typedef  int (CALLBACK *CallBackFun)(VOID *pUser, int iParam);

//回调函数用户
VOID *pCallBackUser = NULL;
//回调函数指针
CallBackFun pCallBackFun = NULL;

//设置回调函数
DLLExport BOOL SetCallBackFun(VOID *pUser, CallBackFun pFun)
{
  pCallBackUser = pUser;
  pCallBackFun = pFun;
  return TRUE;
}

//带SEH异常捕捉的回调
int doCallBack(int i)
{
  __try
  {
    if(pCallBackFun)
    {
      return pCallBackFun(pCallBackUser, i);
    }
  }
  __except(EXCEPTION_EXECUTE_HANDLER )
  {
    ASSERT(FALES); //回调异常
    return -1;
  }

  return 0;
}


//App端
//T1Dlg.h
class CT1Dlg : public CDialog
{
  static int CALLBACK CallbackProc(VOID *pUser, int i);
  ……

//T1Dlg.CPP
CT1Dlg::CT1Dlg(CWnd* pParent /*=NULL*/) : CDialog(CT1Dlg::IDD, pParent)
{
  m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

  //设置回调函数指针
  SetCallBackFun(this, CallbackProc);
}

//回调处理函数
int CALLBACK CT1Dlg::CallbackProc(VOID *pUser, int i)
{
  CT1Dlg *pThis = (CT1Dlg*)pUser;
  ASSERT(pThis->IsKindOf( RUNTIME_CLASS(CT1Dlg)) );

  //处理数据
  pThis->SetDlgItemInt(IDC_EDIT1, i);

  //返回某些值
  return i+1;
}


15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧