vc++6.0控制台程序调用dll出错

[复制链接]
查看11 | 回复10 | 2021-1-27 06:09:32 | 显示全部楼层 |阅读模式
最近用vc++6.0写了一个标准的控制台程序,里面要调用dll(该dll是VC所写),
初始化是成功的,关键是在调用dll里的函数时,程序崩溃,出现提示"程序已停止工作",点击"调试",后,跳出
MicrosoftVisualStudioDebugger对话框,里面显示"Anexceptionoccurred.Processwillbeterminated.
(Exceptionaddressis004206E9)".
后来我用VC++写了一个窗口程序,在窗口程序里调用该dll能成功.
有没有大侠知道为什么,是不是该dll不能用控制台程序调用,还是需要做什么配置工作.

分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:09:32 | 显示全部楼层
你是动态调用的吧/?
你设个断点看看函数指针是否为NULL,如果不为空看参数对不对,如果参数也对了就有可能和窗口有关系。
你可以用非控制台程序试试,如果调用还是错了,那就是DLL的问题。
控制台应用程序调用DLL应该是没有问题的。
回复

使用道具 举报

千问 | 2021-1-27 06:09:32 | 显示全部楼层
贴代码,看看是怎样调用dll的
回复

使用道具 举报

千问 | 2021-1-27 06:09:32 | 显示全部楼层
可能这个是个MFCDLL,而且没处理好,记得MFCDLL是需要注意些规则的。
回复

使用道具 举报

千问 | 2021-1-27 06:09:32 | 显示全部楼层
没代码没真相。。。。
仔细检查每个步骤,LoadLibrary,GetProcAddress是否都成功,函数声明的调用约定是否和导出函数一致等等
回复

使用道具 举报

千问 | 2021-1-27 06:09:32 | 显示全部楼层
有可能这个dll有其他的库依赖
回复

使用道具 举报

千问 | 2021-1-27 06:09:32 | 显示全部楼层
引用3楼mengfeihong的回复:可能这个是个MFCDLL,而且没处理好,记得MFCDLL是需要注意些规则的。\
很可能是MFCdll,它有其他的一些依赖库,所以winconsole无法调用
你可以重新生成一个控制台下的DLL
回复

使用道具 举报

千问 | 2021-1-27 06:09:32 | 显示全部楼层
控制台应该也可以用DLL的啊,可能是你的DLL并不是独立的吧
回复

使用道具 举报

千问 | 2021-1-27 06:09:32 | 显示全部楼层
我也怀疑该DLL为MFCDLL,所以我写了一个支持MFC的控制台程序进行测试,但是结果依旧,测试代码如下:
LPCTSTRsPath="TelphoneOpen.dll";
HINSTANCEhDll=NULL;
intret;
hDll=::LoadLibrary(sPath);
if(hDll==NULL)
{
cout<<"初始化出错"<<endl;
}
else
{
typedefint(__stdcall*pUserLogin)(LPCSTREnterpriseID,
LPCTSTRUser,LPCTSTRPassword,LPCTSTRServiceNo,boolUseProxy,
LPCTSTRProxyServer,LPCTSTRProxyUser,
LPCTSTRProxyPwd,intProxyPort,
LPCTSTRPreserve1);
pUserLoginUserLogint=NULL;//函数别名
UserLogint=(pUserLogin)GetProcAddress(hDll,"UserLogin");
//在DLL中声明的函数名
if(UserLogint)
{
chara1[20],a2[20],a3[20],a4[20],a5[20],a6[20],a7[20],a8[20];
memset(a1,0,sizeof(a1));
memset(a2,0,sizeof(a2));
memset(a3,0,sizeof(a3));
memset(a4,0,sizeof(a4));
memset(a5,0,sizeof(a5));
memset(a6,0,sizeof(a6));
memset(a7,0,sizeof(a7));
memset(a8,0,sizeof(a8));
strcpy(a1,"1200");
strcpy(a2,"mdc");
strcpy(a3,"name");
strcpy(a4,"password");
strcpy(a5,"");
strcpy(a6,"");
strcpy(a7,"");
strcpy(a8,"");

if((ret=UserLogint(a1,a2,a3,a4,0,a5,a6,a7,0,a8))!=0)
{
cout<<"连接数据库出错"<<endl;
}
else
{
cout<<"连接数据库成功"<<endl;
}
}
else
{
cout<<"取函数地址出错"<<endl;
}
FreeLibrary(hDll);

说明:该段代码放到有界面的程序里执行是不报错的,函数能成功返回值,但是在控制台程序里均在UserLogint(a1,a2,a3,a4,0,a5,a6,a7,0,a8)会出错,用debuger跟踪显示函数地址能取得,初始化都是成功的.
回复

使用道具 举报

千问 | 2021-1-27 06:09:32 | 显示全部楼层
用debuger跟踪后,执行到调用函数进行登陆时出现MicrosoftVisualC++提示框,里面显示:
"Unhandledexceptionintestsms.exe(VERSION.DLL):0xC0000005:AcessViolation."
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行