被调用的dll为sms.dll,被调用的函数为Sms_Connection,用depends.exe查看Sms_Connection的入口地址为:0X0009BF1C

zhilunchen 2009-03-31 11:26:19
被调用的dll为sms.dll,被调用的函数为Sms_Connection,用depends.exe查看Sms_Connection的入口地址为:0X0009BF1C

win32调用代码为:


void CTestDlg::OnConnectionButton()
{
UpdateData();
CString strText;
CString strtmp;
CString tmp[256];
strtmp="//上海迅赛信息技术有限公司,网址www.xunsai.com//";
typedef int(_stdcall *Sms_Connection)(CString CopyRight,int Com_Port,int Com_BaudRate,CString *Mobile_Type);
Sms_Connection Proc;
Proc = (Sms_Connection)GetProcAddress(hinstDLL,"Sms_Connection");
//********监视Proc地址:0x0103BF1C
CString aa="";
aa.Format(_T("%x"),Proc);
AfxMessageBox(aa);
int iValue = Proc(strtmp,5,19200,tmp);
//********Win32调用成功,即iValue=1
if (iValue == 1)
{
strText.Format("短信猫连接成功!(短信猫型号为:%s)",*tmp);
AfxMessageBox(strText);
} else if (iValue == 0) {
AfxMessageBox("短信猫连接失败!(请重新连接短信猫)");
}
}



DLL调用代码为:


JNIEXPORT jstring JNICALL Java_com_rhinofield_common_GsmModemInterface_Sms_1Connection
(JNIEnv *env, jclass cls, jstring copyRight, jint com_Port, jint com_BaudRate)
{
CString cp="//上海迅赛信息技术有限公司,网址www.xunsai.com//";
char *buffer2=NULL;

hinstDLL=LoadLibrary(_T("sms.dll"));
typedef int(_stdcall *Sms_Connection)(CString CopyRight,int Com_Port,int Com_BaudRate,CString *Mobile_Type);
Sms_Connection Proc=(Sms_Connection)GetProcAddress(hinstDLL,"Sms_Connection");
//*******监视Proc地址:0x0726BF1C
if(Proc==NULL)
{
DWORD abc=GetLastError();
cp.Format(_T("error code:%ld"),abc);
buffer2=CStringToChar(cp);
}
else
{
CString mobile_Type[256];
int rtnValue = Proc(cp,5,19200,mobile_Type);
//*******DLL调用失败,即rtnValue=0
if(rtnValue==0)
{
cp.Format(_T("com_Port=%d,com_BaudRate=%d,mobile_Type=%s"),com_Port,com_BaudRate,*mobile_Type);
cp="3:rtnValue=0||"+cp;
buffer2=CStringToChar(cp);
}
else
{
cp.Format(_T("%s"),*mobile_Type);
cp="4:GSM Modem Success!Type="+cp;
buffer2=CStringToChar(cp);
}
}
FreeLibrary(hinstDLL);
jstring result = env->NewStringUTF(buffer2);
free(buffer2);
return result;
}


Win32调用成功,即iValue=1
DLL调用失败,即rtnValue=0

调用参数一样,通过监视回调函数的入口地址好像也是一样的,就是结果不一样!
请高人帮我分析下,可能是什么原因导致这个问题,谢谢!
...全文
1251 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hujunli_007 2012-03-21
  • 打赏
  • 举报
回复
大哥,你的问题怎么解决的,我也是碰到这个问题了,和你差不多的代码,驱动什么的也装了,但是运行的时候报错“sss.exe 中的 0x014040e4 处未处理的异常: 0xC0000005: 读取位置 0x2af10963 时发生访问冲突”,提示出错的那行是在Proc(strtmp,5,19200,tmp)这一行。我QQ是794103400,谢谢大哥
zhilunchen 2009-04-01
  • 打赏
  • 举报
回复
问题已解决:用VC6编译!
zhilunchen 2009-03-31
  • 打赏
  • 举报
回复
函数声明是用java的工具生成的,所以看起来有点怪怪的
zhilunchen 2009-03-31
  • 打赏
  • 举报
回复
sms.dll是厂家提供的,由于需要在java中调用,需要按jni要求用VC再封装成dll(C风络DLL)给java调用

用VC Win32应用程序调用sms.dll没有任何问题,但在c风格dll中调用就有问题,即结果不一致.
cnzdgs 2009-03-31
  • 打赏
  • 举报
回复
那就先试用new分配数组。
这两个dll分别是什么类型?sms.dll是自己写的吗?如果是自己写的就调试看看出错原因。
zhilunchen 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cnzdgs 的回复:]
这样试试,创建一个MFC规则DLL项目,再在函数入口加上:
AFX_MANAGE_STATE(AFX_MODULE_STATE* pModuleState)

另外,CString mobile_Type[256]改成用new分配,最后再delete。
[/Quote]

MFC的DLL不行,因为这个DLL要被Java调用的
cnzdgs 2009-03-31
  • 打赏
  • 举报
回复
这样试试,创建一个MFC规则DLL项目,再在函数入口加上:
AFX_MANAGE_STATE(AFX_MODULE_STATE* pModuleState)

另外,CString mobile_Type[256]改成用new分配,最后再delete。

15,473

社区成员

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

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