如何让我的程序不在系统下注册,也就是用热启动调出的系统框不列出来

koma 2000-03-11 06:57:00
加精
...全文
272 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyzegg 2000-12-02
  • 打赏
  • 举报
回复
调用kernel32.dll中的函数RegisterServiceProcess但只能在98下用.
Monk 2000-03-11
  • 打赏
  • 举报
回复
已答问题有n个这个问题?什么意思?
事实上,将你的程序写入注册表中的 RunServices 下后,热启动的系统框中
肯定看不见你的程序在上面!!!不过,用 PVIEW95.exe (也就是 Process
Viewer)是可见的---因为你的程序不可避免的是一个进程。
如果你的意思是不将程序写入注册表,那将是另一个问题,不过这太简单,似乎不是你所要问的。

kxy 2000-03-11
  • 打赏
  • 举报
回复
已答问题有n个这个问题
csdn2000 2000-03-11
  • 打赏
  • 举报
回复
不过用MSINFO32.EXE应该还能查看到。
Monk 2000-03-11
  • 打赏
  • 举报
回复
这很简单,让程序作为后台进程运行即可。具体作法是将你的程序的全路径写入
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices
中。
示范代码如下:
// service.h
#ifndef _SERVICE_H_
#define _SERVICE_H_

#define REGISTER_SERVICE 1
#define UNREGISTER_SERVICE 0

typedef DWORD (__stdcall * REGPROC)(DWORD,DWORD);

#ifdef __cplusplus
extern "C" {
#endif

BOOL SV_ServiceRegister(DWORD dwType);
BOOL SV_StartService(DWORD dwType);

#ifdef __cplusplus
}
#endif

#endif



// service.cpp
BOOL SV_ServiceRegister( DWORD dwType )
{
// Function address defination
REGPROC hookServiceProc;

HMODULE hModule;
LPCSTR lpProcName;

hModule = GetModuleHandle("KERNEL32");
lpProcName = TEXT("RegisterServiceProcess");

// Get address of function
hookServiceProc =(REGPROC)GetProcAddress( hModule,lpProcName);

// Register the my service
return (hookServiceProc(NULL,dwType)==0) ? FALSE : TRUE;
}



BOOL SV_StartService( DWORD dwType )
{
TCHAR lpszStr[MAX_PATH]="Software\\Microsoft\\Windows\\CurrentVersion\\RunServices";
LPTSTR lpszName;
HKEY hKey;
LONG lValue;
DWORD dwDataType;
DWORD dwSize = sizeof(lpszStr);

// Get service name currently
lpszName = GetCommandLine();

for( int i = _tcslen(lpszName)-1; i>=0; i-- ){
if( lpszName[i] != '"' && lpszName[i]!=' ' ) break;
else if( lpszName[i] == '"' ) lpszName[i] = '\0';
}

if( lpszName[0] == '"' ) lpszName++;

// Registe as start up service
lValue = RegOpenKeyEx ( HKEY_LOCAL_MACHINE,
lpszStr,
0,
KEY_QUERY_VALUE and KEY_SET_VALUE,
&hKey );

if( lValue != ERROR_SUCCESS ) {
if( RegCreateKey( HKEY_LOCAL_MACHINE, lpszStr, &hKey ) != ERROR_SUCCESS )
return FALSE;
}

if( RegQueryValueEx(hKey,
"OurService", // Your service name
NULL,
&dwDataType,
(LPBYTE)lpszStr,
&dwSize ) == ERROR_SUCCESS ){

// Find this key value
if( _tcscmp( lpszStr, lpszName )==0 ){
// Remove the service
if( dwType == UNREGISTER_SERVICE ) {

if( RegDeleteValue( hKey, "OurService" ) == ERROR_SUCCESS ){
RegCloseKey ( hKey );
return TRUE;
}

RegCloseKey( hKey );
return FALSE;
}

// Already exist service
if( dwType == REGISTER_SERVICE ) {
RegCloseKey( hKey );
return TRUE;
}
}
}


if( dwType == UNREGISTER_SERVICE ) {
RegCloseKey( hKey );
return TRUE;
}

if( dwType == REGISTER_SERVICE )
{

if( RegSetValueEx(hKey,
"OurService",
0,
REG_SZ,
(BYTE *)lpszName,
dwSize ) != ERROR_SUCCESS ) {
RegCloseKey( hKey );
return FALSE;
}

RegCloseKey( hKey );
return TRUE;
}

RegCloseKey( hKey );
return FALSE;
}


// 调用范例
#include "stdafx.h"
#include "service.h"

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{

if( SV_ServiceRegister( REGISTER_SERVICE ) ) {
SV_StartService( REGISTER_SERVICE );
}

// 你的处理主过程
SV_StartDaemon(); // 后台守护进程主处理过程

UNREFERENCED_PARAMETER( hInstance );
UNREFERENCED_PARAMETER( hPrevInstance );
UNREFERENCED_PARAMETER( lpCmdLine );
UNREFERENCED_PARAMETER( nCmdShow );

return 0;
}

附注: 这样做以后,你的程序会随 Win 9x 的启动而自动启动.


16,466

社区成员

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

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

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