C++中LoadLibrary加载dll出错

bubble_baby 2010-10-20 02:54:58
我的C++加载dll代码如下:

typedef void* (*CreateInstance)(char *ClassName);
CreateInstance pFunCreateInstance = NULL;
HMODULE hm = LoadLibrary(L"D:\\WorkSpace\\C2000\\TestC2KCode\\Debug\\DMS_C2000.dll");
pFunCreateInstance = (CreateInstance)GetProcAddress(hm,MAKEINTRESOURCEA(11));

if(pFunCreateInstance == 0x00000000)
{
DWORD s = NULL;
s = GetLastError();
s = GetLastError();
}

IC2000 *CC2000COMObj;
CC2000COMObj = (IC2000*)((*pFunCreateInstance)("IC2kProgram"));

调试时,hm是有值的,但是pFunCreateInstance值为0x00000000,应该是dll没有加载上的问题吧,GetLastError第一个执行时出错,s值还为0,第二个GetLastError执行过后返回值为182:The operating system cannot run %1,执行后最后一句时因为pFunCreateInstance没有赋值就出错了。
本人不太了解dll加载,希望大家指点一下啊
...全文
781 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐鹦鹉 2010-10-20
  • 打赏
  • 举报
回复
bubble_baby 2010-10-20
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 happyparrot 的回复:]
敢问兄弟师承何处,师尊是哪位?
[/Quote]
不敢当,偶是师妹
快乐鹦鹉 2010-10-20
  • 打赏
  • 举报
回复
敢问兄弟师承何处,师尊是哪位?
bubble_baby 2010-10-20
  • 打赏
  • 举报
回复
给大家答一下疑,问了一下我们大师兄,说那个函数是被重载了的,写函数名字可以,写函数入口地址也可以,但是我们那个封装不是标准形式的封装,所以写函数名不行
bubble_baby 2010-10-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 happyparrot 的回复:]
学习了。
直接加载动态库的方法和引入lib的方法在调试时能一样么?不敢乱说了。
[/Quote]
师兄之前在做小例子测试时是这样加载调试的,说是可以跟进去的,只要在一个解决方案下,不过他出国了不在这边,我之前也没学习下,惭愧啊
Sou2012 2010-10-20
  • 打赏
  • 举报
回复
恭喜楼主解决了问题。
快乐鹦鹉 2010-10-20
  • 打赏
  • 举报
回复
学习了。
直接加载动态库的方法和引入lib的方法在调试时能一样么?不敢乱说了。
bubble_baby 2010-10-20
  • 打赏
  • 举报
回复
dll加载的问题解决了,谢谢大家。
因为我的项目源码改变,dll重新生成后加载的MAKEINTRESOURCEA(11)中函数序号变成了10,改为10就加载上了。函数名和MAKEINTRESOURCEA()都是可以的。
但是还有一个问题,我在后面
IC2000 *CC2000COMObj;
CC2000COMObj = (IC2000*)((*pFunCreateInstance)("IC2kProgram"));
DMS::C2K_TYPE_VAL res;
CC2000COMObj->expr_exec("write_to_station(\"IO.数据采集.Channal.KG001\",\"Break_Status\",0,6)", &res);

调试时想在最后一句跟进去,项目已经添加到解决方案,.exe和dll是在一个目录下,但是跟不进去,想请教一下是什么问题?
jhayumu 2010-10-20
  • 打赏
  • 举报
回复
不要用函数编号,函数名来掉 GetProcAddress
快乐鹦鹉 2010-10-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bubble_baby 的回复:]
MAKEINTRESOURCEA(11)是通过DLL查看器查看到的CreateInstance在dll中的序号,这个dll我有一次是加载上的,后来我把项目添加到解决方案里面,想要调试dll里面的代码,就加载不上了
[/Quote]
必须用函数名称......不是什么序号......
孤客天涯 2010-10-20
  • 打赏
  • 举报
回复
pFunCreateInstance = (CreateInstance)GetProcAddress(hm,MAKEINTRESOURCEA(11));这个11对应你什么东西?
GetProcAddres是从DLL中获取函数地址,如果返回是NULL,表明获取函数地址失败,
GetProcAddres的第二个参数是函数名,确认一下MAKEINTRESOURCEA(11)是你要的函数名?
bubble_baby 2010-10-20
  • 打赏
  • 举报
回复
MAKEINTRESOURCEA(11)是通过DLL查看器查看到的CreateInstance在dll中的序号,这个dll我有一次是加载上的,后来我把项目添加到解决方案里面,想要调试dll里面的代码,就加载不上了
Eleven 2010-10-20
  • 打赏
  • 举报
回复
pFunCreateInstance = (CreateInstance)GetProcAddress(hm,"函数名");
Eleven 2010-10-20
  • 打赏
  • 举报
回复
MAKEINTRESOURCEA(11)数据对吗?
快乐鹦鹉 2010-10-20
  • 打赏
  • 举报
回复
MAKEINTRESOURCEA(11)是什么东东?这里应该是你需要导出的函数名称啊。

15,471

社区成员

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

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