LoadLibrary执行DLL函数,出现错误

gmyhbio 2012-01-13 12:53:02
void calldll(CString cmdline)
{
HINSTANCE hDllInst = LoadLibrary("linkdll.dll");
if(hDllInst)
{
typedef int (WINAPI *MYFUNC)(CString);//这个没错 dll里是int linkjoin(CString a);
MYFUNC Myfunc = NULL;
Myfunc = (MYFUNC)GetProcAddress(hDllInst,"linkjoin");
// youFuntionName 在DLL中声明的函数名
if(Myfunc)
{
Myfunc(cmdline);//注释掉这句就没问题。
}
FreeLibrary(hDllInst);
}
}

link.exe 中的 0x7862fbaa 处未处理的异常: 0xC0000005: 写入位置 0x004010dd 时发生访问冲突
...全文
418 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
paradise300 2012-10-15
  • 打赏
  • 举报
回复

typedef int(__stdcall * pGetLunar)(double t,int &nyear,int & nmonth, int & ndays,bool &daxiaoyue,int & tiangan,int & dizhi,int & jieqi);
pGetLunar MyLunar=(pGetLunar)GetProcAddress(hDll,"GetLunar");
if (!MyLunar)
{
MessageBox(_T("初始化dll失败。"),_T("错误"),MB_OK|MB_ICONEXCLAMATION);
return;
}
int leep,nian=0,yue=0,ri=0,tg,dz,jq;
bool dx;
GetJ2000(nDay);
leep=MyLunar(nDay,nian,yue,ri,dx,tg,dz,jq);

我使用以上代码来使用DLL中的函数。
paradise300 2012-10-15
  • 打赏
  • 举报
回复
其实用“typedef int (__stdcall *MYFUNC)(CString a);”
定义的时候缺少形参"a".
gmyhbio 2012-01-16
  • 打赏
  • 举报
回复
哦。还有5楼也是。没注意,sorry.
gmyhbio 2012-01-15
  • 打赏
  • 举报
回复
11楼才是一针见血。

typedef int (WINAPI *MYFUNC)(CString);
DLL没用stdcall.这里却定义成了stdcall
把WINAPI去掉就没问题了。
Eleven 2012-01-14
  • 打赏
  • 举报
回复
把你函数的参数最好换成LPCTSTR/TCHAR*,不用使用CString
stonexing5 2012-01-14
  • 打赏
  • 举报
回复
参数最好用8个基本数据类型
不要用类
gg606 2012-01-14
  • 打赏
  • 举报
回复
你的linkdll.dll是什么类型的?MFC Regular吗?如果是,肯定会有问题,因为规则DLL不支持传递MFC对象和指针,但是在DLL工程里却不会报错。
Saleayas 2012-01-13
  • 打赏
  • 举报
回复

typedef int (WINAPI *MYFUNC)(CString);//这个没错 dll里是int linkjoin(CString a);

不对应。

typedef int (*MYFUNC)(CString);//这个没错 dll里是int linkjoin(CString a);
typedef int (WINAPI *MYFUNC)(CString);//这个没错 dll里是int WINAPI linkjoin(CString a);


还有就是这个dll和你的程序必须使用同样的 ATLMFC 库,因为导出了 CString。
Kaile 2012-01-13
  • 打赏
  • 举报
回复
导出函数参数用char* 试下
youngwolf 2012-01-13
  • 打赏
  • 举报
回复
没见过这样的导出函数:
int linkjoin(CString a);

注意其中的CString
alexander_david 2012-01-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fly4free 的回复:]
突然发现,你的错误……

你的链接程序崩溃了啊?!
[/Quote]

是啊?到底是链接,还是运行时报这个错啊?
fly4free 2012-01-13
  • 打赏
  • 举报
回复
突然发现,你的错误……

你的链接程序崩溃了啊?!
buyong 2012-01-13
  • 打赏
  • 举报
回复
Myfunc 取得地址了没有
stjay 2012-01-13
  • 打赏
  • 举报
回复
调用约定是否一致?
typedef的是WINAPI(stdcall),dll里是cdecl
用户 昵称 2012-01-13
  • 打赏
  • 举报
回复
同3楼问,标准的dll,俺没用过CString。
fly4free 2012-01-13
  • 打赏
  • 举报
回复
带有类对象的导出能够用 动态加载方式 使用吗?
calm_keep 2012-01-13
  • 打赏
  • 举报
回复
把你的程序和你的DLL放到同一个工程下DEBUG,你看看你传递的参数和你DLL中的是否一致~~~
战在春秋 2012-01-13
  • 打赏
  • 举报
回复
[Quote]Myfunc(cmdline);//注释掉这句就没问题[/Quote]

可能是参数错误,改成Myfunc("Sample String");用实际字符串试试。


龙行天下之Sky 2012-01-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 gmyhbio 的回复:]
void calldll(CString cmdline)
{
HINSTANCE hDllInst = LoadLibrary("linkdll.dll");
if(hDllInst)
{
typedef int (WINAPI *MYFUNC)(CString);//这个没错 dll里是int linkjoin(CString a);
MYFUNC Myfunc = NULL;
……
[/Quote]

编译没有错,也没有到运行期
错误处在链接
肯定是dll导出函数出了问题
你仔细检查检查你的调用约定,如果调用约定正确,exe和dll都是vc的话,理论上不会有任何问题
LiuYinChina 2012-01-13
  • 打赏
  • 举报
回复
大半是 int linkjoin(CString a);的问题,
你用的 CString和 dll 里的CString 的定义不一定是一样的,比如 VC6 的 CString和VC2005 的CString内部实现肯定 不一样,这是 两个不同的 CString 了,只不过名字一样而已,
就算是同一个版本的也可能有内存方面的问题,

15,471

社区成员

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

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