高分求救!!!程序报错:必需的资源无法得到!!

nickzwd 2005-01-07 10:56:29
多谢关注!

本人的程序在一台机器上完成调试没有任何问题之后,拿到另外一个没有安装VC的机器上使用,程序出

错,提示:必需的资源无法得到

1.有人说:是需要包含VC的动态库,将MFC42D.DLL MSVCIRTD.DLL MSVCRTD.DLL等提示所需要的DLL文件拷贝到执行文件目录下,就可以了。
我将所有需要的dll文件都考过去了,不行。然后,甚至还拷贝一份全部的dll到VC的BIN目录下
重新编译后还是不行。


2.有人说:需要 ReleaseDC(&dc);

试过之后,还是失败。


3.有人说:2000下编的程序在98下使用或者是那个机子中毒了

不是的,两台机器都是2000server的,也肯定不是病毒的原因。唯一区别就是出错那台没有安装VC.


4有人说:建成Realease的版本

还是不行。任何版本都不行的。我都试过了/也用了动态或者静态链接重复试了很多次。





没办法,我就在那台机器上安装了VC,重新调试。发现运行到这里时:

CDataBackupDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();// 调试到这一行弹出了“必需的资源无法得到”

跟进之后是VC自带的东西了。



然后查这个类 CDataBackupDlg 似乎有点问题。

void CDataBackupDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialog::OnShowWindow(bShow, nStatus);

CCommService::Instance()->m_Log.LogInit( "c:\\e-FAXbr" );
CCommService::Instance()->m_Log.SetDebugLevel( LEVEL_DEBUG_DETAIL );

CWnd *pWnd = GetDlgItem(IDC_EDIT_EFAXSERVERIP);

if( PathFileExists("c:\\faxserver") )
{
m_bIsLocal = TRUE;
if( pWnd )
pWnd->EnableWindow( FALSE );
}
else
{
m_bIsLocal = FALSE;
if( pWnd )
pWnd->EnableWindow( TRUE );
}

UpdateData( FALSE );
}


我把代码注销掉,然后一行一行的查。调试到了这一行时开始报错“必需的资源无法得到”
CCommService::Instance()->m_Log.LogInit( "c:\\e-FAXbr" );

...全文
408 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
red-fly 2005-01-11
  • 打赏
  • 举报
回复
分三步:
1. 那个变量不用静态的
2. 在delete之后,记住付值为NULL
3. 这样,就不需要像CCommService::Instance()->m_Log.LogInit( "c:\\e-FAXbr" );写了,即CCommService不再需要Instance函数了。
A.不过,实现的话,要分开写了:
CCommService cs;
cs.m_Log.LogInit( "c:\\e-FAXbr" );
B.这样也许也是可以的吧:
CCommService::m_Log.LogInit( "c:\\e-FAXbr" );
这样,也就不需要指针,也就不用再检查指针是否有效了
nickzwd 2005-01-10
  • 打赏
  • 举报
回复
我确实是新手,刚从jsp转过来,c++的语法和调试工具都不是很懂。让大家见笑了。
bobob 2005-01-10
  • 打赏
  • 举报
回复
我给他的代码IsBadWritePtr(m_pInstance,sizeof(m_pInstance));
就是检测指针是否有效的~~
问题一定是出在这里,我感觉楼主应该是个新手~
red-fly 2005-01-10
  • 打赏
  • 举报
回复

否则,在Instance函数中检查返回的指针是否真实有效
red-fly 2005-01-10
  • 打赏
  • 举报
回复

static CCommService *m_pInstance;
最好不用static,这样我想不好。但无论如何,你在CCommService的析构函数中在
delete m_pInstance之后,要再
m_pInstance = NULL; 一下
在CCommService的构造函数中,对m_pInstance付值为NULL

我想你的问题有可能出在没有付值为NULL,然后第二次的时候,就会发现它不为NULL(但是,你在析构函数中已经delete了),于是Instance函数直接返回m_pInstance而实际上是不能用的,所以会出现错误
hushuangyan74 2005-01-10
  • 打赏
  • 举报
回复
程序好像没有问题,不知道什么问题?
nickzwd 2005-01-10
  • 打赏
  • 举报
回复
没有作用的。。。。
yanry 2005-01-10
  • 打赏
  • 举报
回复
控件没有注册吧
nickzwd 2005-01-10
  • 打赏
  • 举报
回复
to: jszj(老板说mis部不是赚钱的部门...)

按照您的方法改了。还是出错。不过方法确实不错。现在自己的机器有点问题。


其实我现在经过大量测试之后发现,跟有没有安装VC关系也不是很大。我有一台测试机,开始没有安VC它出错,后来安装了VC,还是出错!吐血~~经过6台左右没有装VC的机器测试,发现中有三台运行正常,有三台不能运行。有VC的机器4台,运行都正常。
现在我也不知道是哪里出问题了。
bobob 2005-01-07
  • 打赏
  • 举报
回复
吃饭了,一会再帮你看
bobob 2005-01-07
  • 打赏
  • 举报
回复
CCommService的构造函数怎么写的
nickzwd 2005-01-07
  • 打赏
  • 举报
回复
设断点之后,先弹出“必需的资源无法得到”
到这一行出错“Unhandled exception in DataBackup.exe:0xC0000005:Access Violation.”
这一行-> m_LastTime.GetCurrentTime( );
bobob 2005-01-07
  • 打赏
  • 举报
回复
CCommService *CCommService::Instance( )
{
if( !m_pInstance )
m_pInstance = new CCommService;

return m_pInstance;
}
====》
CCommService *CCommService::Instance( )
{
if(IsBadWriterPtr(m_pInstance))
m_pInstance = new CCommService;

return m_pInstance;
}

nickzwd 2005-01-07
  • 打赏
  • 举报
回复
不行。在这里下断点没有用。运行不到这一步就出错了。


现在我一共找了4台没有安装VC的机器进行了测试,两台是可以运行的。两台不行。

又找了四台安装过VC的,都可以运行.

bobob 2005-01-07
  • 打赏
  • 举报
回复
CCommService *CCommService::Instance( )
{
if(IsBadWriterPtr(m_pInstance))
m_pInstance = new CCommService;

return m_pInstance;
}

CCommService::~CCommService( )
{
delete m_pInstance;
m_pInstance = NULL;
m_Log.Log( "DBProxy Ends running.\r\n\r\n" );
m_Log.LogEnd( );
}

在CLog::LogInit( const char *pFile )里面下个断点,看具体在那里出错

huakai8866 2005-01-07
  • 打赏
  • 举报
回复
gz
nickzwd 2005-01-07
  • 打赏
  • 举报
回复
顺便把 Instance 也贴出来了

CCommService *CCommService::Instance( )
{
if( !m_pInstance )
m_pInstance = new CCommService;

return m_pInstance;
}

CCommService::~CCommService( )
{
delete m_pInstance;

m_Log.Log( "DBProxy Ends running.\r\n\r\n" );
m_Log.LogEnd( );
}
nickzwd 2005-01-07
  • 打赏
  • 举报
回复
void CLog::LogInit( const char *pFile )
{
char szFileName[256];

m_LastTime.GetCurrentTime( );
strcpy( m_szFileName, pFile );

switch( m_nLogType )
{
case LOG_DAILY:
strcpy( szFileName, m_szFileName );
strcat( szFileName, ".log" );
break;
case LOG_WEEKLY:
sprintf( szFileName, "%s%d.log", m_szFileName, m_LastTime.GetDayOfWeek() );
break;
case LOG_MONTHLY:
sprintf( szFileName, "%s%02d.log", m_szFileName, m_LastTime.GetDay() );
break;
case LOG_YEARLY:
sprintf( szFileName, "%s%02d%02d.log", m_szFileName, m_LastTime.GetMonth(), m_LastTime.GetDay() );
break;
default:
sprintf( szFileName, "%s%02d.log", m_szFileName, m_LastTime.GetDay() );
break;
}

CSingleLock lfLock( &m_LogFileMutex );

lfLock.Lock( );
if( m_pLogFile )
{
fclose( m_pLogFile );
}

m_pLogFile = fopen( szFileName, "a" );
if( !m_pLogFile )
{
lfLock.Unlock( );
return ;
}
lfLock.Unlock( );

Log( "LogInit :[", m_LastTime.ToBuf(), "]\r\n" );
}
bobob 2005-01-07
  • 打赏
  • 举报
回复
LogInit代码帖出来看看
nickzwd 2005-01-07
  • 打赏
  • 举报
回复
并不仅仅是这一行CCommService::Instance()->m_Log.LogInit( "c:\\e-FAXbr" );
下边的只要不注释掉,都会出现这个问题的。
加载更多回复(19)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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