用C语言编程能实现开机自动执行的程序吗?

liudan003 2003-05-13 09:52:23
请教各位高手?
用C语言能编出开机自动执行的程序吗?
能用C语言修改注册表吗?
C++ 呢?
...全文
138 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
limd 2003-08-14
  • 打赏
  • 举报
回复
C语言当然能写WINDOWS啊,只是麻烦呀
xboxjacky 2003-08-08
  • 打赏
  • 举报
回复
up
xboxjacky 2003-07-13
  • 打赏
  • 举报
回复
来点回音呀!
Ecoresoft 2003-07-13
  • 打赏
  • 举报
回复
C语言可以写出Windows 可以写出Linux/Unix 你说能不能写出你要的程序。

xboxjacky 2003-07-13
  • 打赏
  • 举报
回复
c语言能写出windows么?我不知道。
blackmouse2002 2003-07-12
  • 打赏
  • 举报
回复
里面有很多不是对注册表有用的呀:
有用的只有
//Windows NT/2000下用户名称及组织名称在系统注册表中的路径
subkey = "Software\\Microsoft\\Windows NT\\CurrentVersion";
//如果是Windows 9x/Me,则为"Software\\Microsoft\\Windows\\CurrentVersion"

//数据类型
type = REG_SZ;

//数据长度
cbData = 80;
//打开与路径subkey相关的 hKEY,KEY_READ表示以查询的方式访问注册表,
//hKEY保存此函数所打开的键的句柄。
long ret0 = (::RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey, 0, KEY_READ, &hKEY));
if(ret0 != ERROR_SUCCESS)
{//如果无法打开hKEY,则终止程序的执行
MessageBox("错误: 无法打开指定的键!");
return;
}

//查询用户名称
LPBYTE Username_Get = new BYTE[80];

//hKEY为刚才RegOpenKeyEx()函数所打开的键的句柄,"RegisteredOwner"
//表示要查询的键值名,Username_Get保存所查询的数据。
long ret1 = ::RegQueryValueEx(hKEY, "RegisteredOwner", NULL, &type, Username_Get, &cbData);

if(ret1 != ERROR_SUCCESS)
{
MessageBox("错误: 无法查询有关注册表信息!");
return;
}

// 查询组织名称
LPBYTE Organization_Get = new BYTE [80];

long ret2 =:: RegQueryValueEx(hKEY, "RegisteredOrganization", NULL,&type,Organization_Get, &cbData);

if(ret2 != ERROR_SUCCESS)
{
MessageBox("错误: 无法查询有关注册表信息!");
return;
}

// 将 Username_Get 和 Organizaiont_Get 转换为 CString 字符串, 以便显示输出。
M_username.SetWindowText(CString(Username_Get));
M_organization.SetWindowText(CString(Organization_Get));

//释放内存空间
delete[] Username_Get;
delete[] Organization_Get;

//关闭注册表
::RegCloseKey(hKEY);
////////
//打开与路径subkey相关的hKEY,KEY_WRITE表示以写的方式打开。
long ret0 = (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, subkey, 0, KEY_WRITE, &hKEY));
if(ret0 != ERROR_SUCCESS)
{
MessageBox("错误: 无法打开有关的hKEY!");
return;
}

//修改用户名称
CString m_user;
M_username.GetWindowText(m_user);

LPBYTE Username_Set = Ctochar(m_user);

cbData = m_user.GetLength()+1;
long ret1 = ::RegSetValueEx(hKEY, "RegisteredOwner", NULL, type, Username_Set, cbData);

//无法修改注册表,关闭后直接返回
if(ret1 != ERROR_SUCCESS)
{
MessageBox("错误: 无法修改有关注册表信息!");

//关闭注册表
::RegCloseKey(hKEY);

return;
}

//修改组织名称
CString m_organ;
M_organization.GetWindowText(m_organ);

LPBYTE Organization_Set = Ctochar(m_organ);

cbData = m_organ.GetLength()+1;
long ret2 = ::RegSetValueEx(hKEY, "RegisteredOrganization", NULL,type, Organization_Set, cbData);

//无法修改注册表,关闭后直接返回
if(ret2 != ERROR_SUCCESS)
{
MessageBox("错误: 无法修改有关注册表信息!");

//关闭注册表
::RegCloseKey(hKEY);

return;
}

::RegCloseKey(hKEY);
visualcdotnet 2003-07-09
  • 打赏
  • 举报
回复
这么长
blackmouse2002 2003-06-27
  • 打赏
  • 举报
回复
以前做过这样的改注册表的小程序,很简单,用API就成
你要做C程序,去掉下面多余的,用到你的代码中,就可以了
至于让程序自动运行,我想你会改的,把下面的注册键名改到RUN下就成了
多不就不多说,自己看看,
// modifyregDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "modifyreg.h"
#include "modifyregDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialog
{
public:
CAboutDlg();

// 对话框数据
enum { IDD = IDD_ABOUTBOX };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

// 实现
protected:
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CmodifyregDlg 对话框



CmodifyregDlg::CmodifyregDlg(CWnd* pParent /*=NULL*/)
: CDialog(CmodifyregDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

//Windows NT/2000下用户名称及组织名称在系统注册表中的路径
subkey = "Software\\Microsoft\\Windows NT\\CurrentVersion";
//如果是Windows 9x/Me,则为"Software\\Microsoft\\Windows\\CurrentVersion"

//数据类型
type = REG_SZ;

//数据长度
cbData = 80;

}

void CmodifyregDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_USERNAME, M_username);
DDX_Control(pDX, IDC_ORGANIZATION, M_organization);
}

BEGIN_MESSAGE_MAP(CmodifyregDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_QUERY, OnBnClickedQuery)
ON_BN_CLICKED(IDC_MODIFY, OnBnClickedModify)
END_MESSAGE_MAP()


// CmodifyregDlg 消息处理程序

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

// 将\“关于...\”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

// TODO:在此添加额外的初始化代码

return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}

void CmodifyregDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。

void CmodifyregDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CmodifyregDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}

void CmodifyregDlg::OnBnClickedQuery()
{
// TODO: 在此添加控件通知处理程序代码
//打开与路径subkey相关的 hKEY,KEY_READ表示以查询的方式访问注册表,
//hKEY保存此函数所打开的键的句柄。
long ret0 = (::RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey, 0, KEY_READ, &hKEY));
if(ret0 != ERROR_SUCCESS)
{//如果无法打开hKEY,则终止程序的执行
MessageBox("错误: 无法打开指定的键!");
return;
}

//查询用户名称
LPBYTE Username_Get = new BYTE[80];

//hKEY为刚才RegOpenKeyEx()函数所打开的键的句柄,"RegisteredOwner"
//表示要查询的键值名,Username_Get保存所查询的数据。
long ret1 = ::RegQueryValueEx(hKEY, "RegisteredOwner", NULL, &type, Username_Get, &cbData);

if(ret1 != ERROR_SUCCESS)
{
MessageBox("错误: 无法查询有关注册表信息!");
return;
}

// 查询组织名称
LPBYTE Organization_Get = new BYTE [80];

long ret2 =:: RegQueryValueEx(hKEY, "RegisteredOrganization", NULL,&type,Organization_Get, &cbData);

if(ret2 != ERROR_SUCCESS)
{
MessageBox("错误: 无法查询有关注册表信息!");
return;
}

// 将 Username_Get 和 Organizaiont_Get 转换为 CString 字符串, 以便显示输出。
M_username.SetWindowText(CString(Username_Get));
M_organization.SetWindowText(CString(Organization_Get));

//释放内存空间
delete[] Username_Get;
delete[] Organization_Get;

//关闭注册表
::RegCloseKey(hKEY);

}

//Cstring转换为char的函数
LPBYTE Ctochar(CString str)
{
LPBYTE lpb = new BYTE[str.GetLength()+1];

for(int i = 0; i < lpb[str.GetLength()]; i++)
lpb[i] = str.GetAt(i);
return lpb;
}


void CmodifyregDlg::OnBnClickedModify()
{
// TODO: 在此添加控件通知处理程序代码
//打开与路径subkey相关的hKEY,KEY_WRITE表示以写的方式打开。
long ret0 = (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, subkey, 0, KEY_WRITE, &hKEY));
if(ret0 != ERROR_SUCCESS)
{
MessageBox("错误: 无法打开有关的hKEY!");
return;
}

//修改用户名称
CString m_user;
M_username.GetWindowText(m_user);

LPBYTE Username_Set = Ctochar(m_user);

cbData = m_user.GetLength()+1;
long ret1 = ::RegSetValueEx(hKEY, "RegisteredOwner", NULL, type, Username_Set, cbData);

//无法修改注册表,关闭后直接返回
if(ret1 != ERROR_SUCCESS)
{
MessageBox("错误: 无法修改有关注册表信息!");

//关闭注册表
::RegCloseKey(hKEY);

return;
}

//修改组织名称
CString m_organ;
M_organization.GetWindowText(m_organ);

LPBYTE Organization_Set = Ctochar(m_organ);

cbData = m_organ.GetLength()+1;
long ret2 = ::RegSetValueEx(hKEY, "RegisteredOrganization", NULL,type, Organization_Set, cbData);

//无法修改注册表,关闭后直接返回
if(ret2 != ERROR_SUCCESS)
{
MessageBox("错误: 无法修改有关注册表信息!");

//关闭注册表
::RegCloseKey(hKEY);

return;
}

::RegCloseKey(hKEY);
}
liudan003 2003-06-02
  • 打赏
  • 举报
回复
thank you!
winthegame2 2003-05-16
  • 打赏
  • 举报
回复
开机自动执行无非就是修改注册表, 即使不能使用RegOpenKey等API, 也可以使用直接读写文本文件的方式修改注册表啊...
liudan003 2003-05-16
  • 打赏
  • 举报
回复
谢谢各位,
能不能把代码写一下, 不好意思,有劳了!
十分感谢!
hope1998 2003-05-16
  • 打赏
  • 举报
回复
开机自动执行就是将程序路径写入registry
安装platform SDK, 查询下面的函数RegOpenKeyEx 你就能找到很多相关函数。
修改registry 如下地址
LOCAL_MACHINE\SOFTWARE\microsoft\Windows\CurrentVersion\Run
9x 跟 NT有所不同
symbol68688 2003-05-14
  • 打赏
  • 举报
回复
都能,调用API函数

256

社区成员

发帖
与我相关
我的任务
社区描述
其他产品/厂家
社区管理员
  • 其他
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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