100分 求 dll中实现 调用dll调用者的函数指针

redsleaf001 2010-07-14 11:28:36
我准备些一个 dll

在dll中实现一个功能:如下

函数 excaddr(int addr) 返回数据类型为 VARIANT

函数中实现对 addr 指针的调用 并传递参数类型为 DISPPARAMS *pDispParams 返回调用参数的数据 VARIANT类型
...全文
130 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
redsleaf001 2010-07-15
  • 打赏
  • 举报
回复
*pVarResult = pFun(&disp);
已经确定是返回信息的的错误,如果我换成 pFun(&disp) 不返回信息 就没错!

郁闷
redsleaf001 2010-07-15
  • 打赏
  • 举报
回复
里边没多少代码啊!哪里有错啊!郁闷!
redsleaf001 2010-07-15
  • 打赏
  • 举报
回复
出现问题,我是用E语言调用的 调用是成功了,可是调用过后就马上退出了!

typedef VARIANT (__cdecl CallInFunc)(DISPPARAMS *);

virtual /* [local] */ HRESULT STDMETHODCALLTYPE Invoke(

/* [in] */ DISPID dispIdMember,

/* [in] */ REFIID riid,

/* [in] */ LCID lcid,

/* [in] */ WORD wFlags,

/* [out][in] */ DISPPARAMS *pDispParams,

/* [out] */ VARIANT *pVarResult,

/* [out] */ EXCEPINFO *pExcepInfo,

/* [out] */ UINT *puArgErr){

if(dispIdMember!=0){
TCHAR printbuf[80];
wsprintf(printbuf,_T("错误码: %u\r\n 错误:%u"),dispIdMember,ddsaddr);
::MessageBox(NULL, printbuf , _T("错误信息") ,MB_OK | MB_ICONSTOP);


CallInFunc* pFun = (CallInFunc*)ddsaddr;//函数地址,都没错,我调试错
DISPPARAMS disp;
*pVarResult = pFun(&disp);
}


return S_OK;

}
cpp2017 2010-07-15
  • 打赏
  • 举报
回复
1.你在哪里声明?哪里用?

2.

还有救是 short 类型转换到 int 用转化吗?
==>
如果是普通数字类型则没问题,如果是函数地址肯定是不行,short不够用.


fishion 2010-07-15
  • 打赏
  • 举报
回复
全局变量参考:
在stdafx.cpp中加入:
int myInt;
然后在stdafx.h中加入:
extern int myInt
redsleaf001 2010-07-15
  • 打赏
  • 举报
回复
我在class中引用的
redsleaf001 2010-07-15
  • 打赏
  • 举报
回复
是我想到的,能运行,但是还有个小问题,就是,为什么我声明的全局变量不管用??提示错误is not a member of '`global namespace'不是全局变量。

还有救是 short 类型转换到 int 用转化吗?



多谢老大
cpp2017 2010-07-15
  • 打赏
  • 举报
回复
代码运行肯定没问题,
不过不知道是不是你想要的.
redsleaf001 2010-07-15
  • 打赏
  • 举报
回复
第一个得到的答案如果通过,100分全部献上 :))
cpp2017 2010-07-14
  • 打赏
  • 举报
回复
dll


typedef VARIANT (__cdecl CallInFunc)(DISPPARAMS *);
extern "C" __declspec(dllexport) VARIANT __cdecl excaddr(int* addr)
{
CallInFunc* pFun = (CallInFunc*)addr;
//return
DISPPARAMS disp;
return pFun(&disp);
}




//调用的程序

typedef VARIANT (__cdecl excaddr)(int *);
void CBankNoticeDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码

HINSTANCE hInstance= LoadLibrary("dll.dll");
excaddr* proc =(excaddr*) GetProcAddress(hInstance,"excaddr");

VARIANT v = proc((int*)CallInFunc);
CString str;
str.Format("%d",v.intVal);
AfxMessageBox(str);

}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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