为什么同样的程序,加到注册表的自启动中就不行了?

GreenStuff 2000-05-05 12:32:00
加精
我有一个Win32的EXE,在这个EXE中调用了一个VxD,一运行这个EXE就会自动调用VxD, 因为我把用对VxD的调用加到了OnInitDialog() 里,在资源管理器中运行无误,我想让EXE在WINDOWS启动时自动运行,就把它加到了注册表里HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run,但是启动时出现VxD句柄返回值为INVALID_HANDLE_VALUE的错误,我百思不得其解,请高手指教.我已经在RUN里使我的程序在最后了,就是在SYSTRAY之后运行

BOOL CMessageDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here

//////打开VxD///////////////////////////////////

hVxD=CreateFile("\\\\.\\Protect.vxd",0,0,0,0,
0,0);
if(hVxD==INVALID_HANDLE_VALUE) //出现错误
{
AfxMessageBox("没有打开虚拟设备驱动程序");
return FALSE;
}
OnUpdateProtect(NULL,NULL); //立即更新数据

return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}

...全文
407 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wooyue 2000-05-05
  • 打赏
  • 举报
回复
如果不涉及(商业或其他)机密,你是否可以把(部分)源代码传给我(wooy@163.net),我具体看下是什么问题。我没有Protect.vxd。
(不管如何我对你参数用CREATE_NEW,FILE_FLAG_DELETE_ON_CLOSE感到很奇怪,感觉你好像是在乱用参数。)
GreenStuff 2000-05-05
  • 打赏
  • 举报
回复
JJONY兄,调用VxD时要用"\\\\.\\protect.vxd"这种格式,无法设路径.你说的肯定不对,我在"运行"里执行这个程序也没有问题.

wooyue兄,你说我在资源管理器中运行无误是因为VxD已经打开,我觉的不对,我用VxDView查看,在运行EXE前VxD没有在内存,说明并不是对文件对象的引用.
我将参数改成hVxD=CreateFile("\\\\.\\Protect.vxd",0,0,0,CREATE_NEW,FILE_FLAG_DELETE_ON_CLOSE,0);还是不行,出现同样的错误,另外,我如果把EXE加到开始菜单的启动中会出现蓝死.
wooyue 2000-05-05
  • 打赏
  • 举报
回复
我想问题出在CreateFile调用的参数上,你看第五个参数dwCreationDisposition的说明里有句:“This parameter must be one of the following values:”,注意这个must/必须,你传入的值为0,在资源管理器中运行无误是因为你vxd已被打开,而且还在Windows中存在,Windows对已存在的文件对象做了个引用,增加文件对象的引用计数,并没有去创建新的文件对象,dwCreationDisposition参数就没起作用了。而让EXE在WINDOWS启动时自动运行,那时Windows中不存在已打开的该vxd对象,Windows要去打开文件时,因为dwCreationDisposition参数不对,就给了个INVALID_HANDLE_VALUE的结果你。
参数随便设0的不良习惯因该改。
JJONY 2000-05-05
  • 打赏
  • 举报
回复
呵呵,不用说肯定是在Run里运行时的当前路径不对啦,以致找不用vxd文件。
GreenStuff 2000-05-05
  • 打赏
  • 举报
回复
我是在95下实现的,现在这个问题已经搞定了,我用了一个SetCurrentDirectory(),还是JJONY兄说的对!谢谢你的帮忙
wooyue 2000-05-05
  • 打赏
  • 举报
回复
你在NT上写你的程序吗?我在2000里,试用“\\\\.\\protect.vxd”为参数,就失败了,更别谈加到注册表的自启动了。确实就是在NT里,这样的写法也让我觉得奇怪(我没在nt里编程,我边上的NT是服务器,安全起见,我不能拿它来试程序)。
我开始对你的“非自启动情况下的运行无误”开始产生质疑了,原本我是以此为基础来讨论的。
打开虚拟设备驱动程序,你用的是CREATE_NEW及FILE_FLAG_DELETE_ON_CLOSE说明hdinfo.vxd在运行前是不存在的(若存在,CreateFile会返回INVALID_HANDLE_VALUE),并且在使用后自动删除。
你先让你描述的在我这重现把。
GreenStuff 2000-05-05
  • 打赏
  • 举报
回复
直接运行可以,但加到注册表的自启动中就不行了,请看我的程序:(这段程序就是运行后显示出BIOS出厂时期和硬盘序列号)

这是对话框中的调用VxD部分:
BOOL CHDInfoDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
OnButton1();

return TRUE; // return TRUE unless you set the focus to a control
}


void CHDInfoDlg::OnButton1()
{
// TODO: Add your control notification handler code here
HANDLE hVxD;
hVxD=CreateFile("\\\\.\\hdinfo.vxd",0,0,0,CREATE_NEW,
FILE_FLAG_DELETE_ON_CLOSE,0);
if(hVxD==INVALID_HANDLE_VALUE)
{
AfxMessageBox("没有打开虚拟设备驱动程序");
return;
}
BYTE buffer[512];
DeviceIoControl(hVxD,1,NULL,NULL,buffer,512,NULL,0);
BYTE buffer1[8];
DeviceIoControl(hVxD,2,NULL,NULL,buffer1,8,NULL,0);
CloseHandle(hVxD);

CString strBuf;
memcpy((PBYTE)strBuf.GetBufferSetLength(512),buffer,512);

m_Edit1.SetWindowText(strBuf.Mid(0x36,0x26));
m_Edit2.SetWindowText(strBuf.Mid(0x14,0x12));

memcpy((PBYTE)strBuf.GetBufferSetLength(8),buffer1,8);
m_Edit3.SetWindowText(strBuf);

}

这是VxD的cpp:

BOOL HdinfoDevice::OnSysDynamicDeviceInit()
{
return TRUE;
}

BOOL HdinfoDevice::OnSysDynamicDeviceExit()
{
return TRUE;
}

DWORD HdinfoDevice::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams)
{
PDIOCPARAMETERS pD;

pD=(PDIOCPARAMETERS)pDIOCParams;
if(pD->dwIoControlCode==DIOC_OPEN and and pD->dwIoControlCode==DIOC_CLOSEHANDLE)
return 0L;

switch(pD->dwIoControlCode)
{
case 1: //得到硬盘信息
{
int i;
do
{
i = _inp(0x01f7);
}while(i!= 0x50); /* Wait for controller not busy */
int loop=0;
_outp(0x01f6,(loop == 0 ? 0xa0 : 0xb0)); /* Get first/second drive */
_outp(0x01f7,0xec); /* Get drive info data */
while(_inp(0x1f7)!=0x58); /* Wait for data ready */
WORD* p;
p=(PWORD)pD->lpvOutBuffer;
for(i=0;i<256;i++)
p[i]=' ';
for (int offset = 0; offset<256; offset++)
{
p[offset]=_inpw(0x1f0);
}
BYTE *a;
a=new BYTE;
a=(PBYTE)p;
for(i=0;i<256;i+=2)
{
BYTE b;
b=a[i+1];
a[i+1]=a[i];
a[i]=b;
}
break;
}
case 2: //得到主板出厂日期
{
BYTE *p;
p = (PBYTE)pD->lpvOutBuffer;
memcpy(p,(VOID*)1048565,8);
break;
}
}

return 0;
}

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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