在xp下用vc6作了一个小程序,通过注册表注册为开机自动运行,程序本身基本上没有问题,但是却遇到了一些意料之外的问题,所以想请大家讨论一下:程序中用到了一个皮肤控件,是在初始化函数里加载皮肤的:
BOOL CMyApp::InitInstance()
{      
AfxEnableControlContainer();
#ifdef _AFXDLL
Enable3dControls();
#else
Enable3dControlsStatic();
#endif        //设置皮肤
if(!SetSkin(_T("xp_corona.ssk")))
{
  MessageBox(NULL,"找不到文件 'xp_corona.ssk',请确认该文件是否存在!","程序启动错误",
                             MB_OK|MB_ICONERROR);  
  return -1;
}
    
int checkfile;
        ……
}问题是,正常通过手动运行该程序没有任何问题,皮肤能正常加载;但是如果是开机自动运行的话,该程序就会在
 SetSkin(_T("xp_corona.ssk"))处失败,提示找不到文件"xp_corona.ssk",但经过检查,该文件是存在的。为什么会出现这种问题?我思考了很久,猜测可能是系统把文件"xp_corona.ssk"当成一个资源,在系统的某个地方
给它“注册”了,程序在使用它的时候通过这个“注册”来访问资源。当开机自动运行时,该资源可能并没有“注册”,
所以就会找不到该文件。
因此,我想知道,程序自动启动时,到底干了些吗?它和我们一般的手动启动有什么不同吗?
上面是我个人的猜测,不知道是否正确,请各位发表一下自己的理解,谢了。

解决方案 »

  1.   

    if(!SetSkin(_T( "X:\\...\\xp_corona.ssk "))) //使用绝对路径应该可以
      

  2.   

    把xp_corona.ssk 放到 ...\windows\system32\ 下试试
      

  3.   

    如果实在不行就在加载皮肤前Sleep(30* 1000),过了30秒系统该初始化的差不多了吧
      

  4.   

    luohongming 的看法是对的
    不过,还是有个问题:为什么手动运行就不存这个问题,而开机自动运行就会这样呢?他们之间有什么不同?恐怕暂时还找不出答案,不过倒是学会了以后能用绝对路径的地方就尽量用绝对路径,这对程序大概是只好不坏的。
    谢了各位。