高分求解:关于DLL中调用DLL的问题

zhilunchen 2009-03-28 10:17:15
由于要做短信,买了一台GSM Modem,提一个C++的DLL开发接口,DLL文件名:sms.dll,这个dll用VC编译应用程序测试完全正常。
由于需要在Java里面调用,则要用VC按jni规范重新封装sms.dll成dll才能被java调用。在用VC重新封装sms.dll的dll中可以加载sms.dll,但用GetProcAddress取不到sms.dll函数中的入口地址,返回错误代码(126:找不到指定模块),用depends查看函数书写正确,就是找不到。

问题要点:1.sms.dll用VC程序测试调用正常;
2.sms.dll再封装成dll,在新dll中就找到调用函数的入口地址。

真是奇了怪了,请高人帮忙。

我的QQ:999975
...全文
364 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
mabaoqiu 2009-09-26
  • 打赏
  • 举报
回复
关注,看答案。
jhony_lee 2009-04-10
  • 打赏
  • 举报
回复
你的LoadLibrary()应该是失败的,而且错误码是126
jhony_lee 2009-04-10
  • 打赏
  • 举报
回复
你的LoadLibrary()应该是失败的,而且错误码是126
AlexChan1981 2009-04-10
  • 打赏
  • 举报
回复
注意调用DLL时的参数传递。
声明入口函数的时候加上Extern C
zhilunchen 2009-04-01
  • 打赏
  • 举报
回复
问题解决了,谢谢cnzdgs兄!

解决办法:用VC6编译,hinstDLL全局变量没有问题
zhilunchen 2009-03-31
  • 打赏
  • 举报
回复
上去看看~
andrew361 2009-03-30
  • 打赏
  • 举报
回复
别人就是不想用全局函数!!友情帮顶!~!!
zhilunchen 2009-03-29
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 cnzdgs 的回复:]
这样试一下,在GetProcAddress之前再通过LoadLibrary重新获取HMODULE,调用完Proc之后再FreeLibrary。
[/Quote]

这样是可以的,谢谢兄弟!

但如果不用全程变量,哪么LoadLibrary只能放在函数里面,则每调用一次函数就要加载DLL,这样效率会很低,兄弟有没有其他解决办法?
cnzdgs 2009-03-29
  • 打赏
  • 举报
回复
这样试一下,在GetProcAddress之前再通过LoadLibrary重新获取HMODULE,调用完Proc之后再FreeLibrary。
zhilunchen 2009-03-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 cnzdgs 的回复:]
执行到DWORD abc=GetLastError()得到了126是吗?看看中间有没有FreeLibrary。
[/Quote]

是126,意思是找不到模块。我用depends看过,函数名称书写正确,况且在VC应用程序里面调用sms.dll是可以的,在DLL里面就出问题
zhilunchen 2009-03-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 cnzdgs 的回复:]
执行到DWORD abc=GetLastError()得到了126是吗?看看中间有没有FreeLibrary。
[/Quote]

中间肯定没有FreeLibrary
java调用代码如下:

int value=sms_LoadSmsDll("");
System.out.println("DLLHandle="+value);
if(value!=0)
{
String rtnValue=Sms_Connection("Hello,world!",5,9600);
if(rtnValue.length()<=1)
{
System.out.println("Connection failed!");
}
else
{
System.out.println("Connection success!Mobile_Type="+rtnValue.substring(0));
}
}
else
{
System.out.println("Open sms.dll failed!");
}
value=sms_UnloadSmsDll();
if(value==1)
System.out.println("close sms.dll success!");
else
System.out.println("close sms.dll failed!");
return 0;
zhilunchen 2009-03-29
  • 打赏
  • 举报
回复
可以确认一点,DLL是成功被加载了的
cnzdgs 2009-03-29
  • 打赏
  • 举报
回复
执行到DWORD abc=GetLastError()得到了126是吗?看看中间有没有FreeLibrary。
zhilunchen 2009-03-29
  • 打赏
  • 举报
回复
被这个问题搞死了,昨天还熬了一个通宵
an_bachelor 2009-03-29
  • 打赏
  • 举报
回复
这个就能肯定是HMODULE被Free了
  • 打赏
  • 举报
回复
关注一下
biweilun 2009-03-29
  • 打赏
  • 举报
回复
放心,Java再搓也不会一GetProcAddress就FreeLibrary的。
biweilun 2009-03-29
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 zhilunchen 的回复:]
引用 15 楼 cnzdgs 的回复:
这样试一下,在GetProcAddress之前再通过LoadLibrary重新获取HMODULE,调用完Proc之后再FreeLibrary。


这样是可以的,谢谢兄弟!

但如果不用全程变量,哪么LoadLibrary只能放在函数里面,则每调用一次函数就要加载DLL,这样效率会很低,兄弟有没有其他解决办法?
[/Quote]

每调用一次函数就要加载DLL?这样啊?哪有这么囧的?不妨把所有要调用的函数设为全局成员变量,LoadLibrary后都GetProcAddress掉。建议可以弄个结构体数组,数组元素由函数名和函数地址2个元素组成,这样很方便
野男孩 2009-03-29
  • 打赏
  • 举报
回复
java就是混乱。不像c++,自己管理资源,多好。实在不行就每次LoadLibrary吧。
cnzdgs 2009-03-29
  • 打赏
  • 举报
回复
这个DLL肯定是不知在什么时候被Free了,我不了解java调DLL的原理,有可能它是每次调用时Load,调用后立即Free的。其实这种做法只要不是频繁调用,是不会影响效率的。
你可以试试在sms.dll的DllMain中的DLL_PROCESS_DETACH分支中加个断点,当执行到断点时,根据调用堆栈来看是哪里调用的FreeLibrary。
加载更多回复(9)

15,471

社区成员

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

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