c++プログラムを起動して自動的に起動する方法
3669 ワード
Windowsの下で自分のプログラムを書く時、自分の書いたプログラムをパソコンの電源を入れる時に自動的に実行させることもできます.これは主にwindowsのレジストリ情報を修正し、すべての電源を入れて自動的に起動したプログラムのいくつかの情報はレジストリの中のフォルダの下に置いています.特定のフォルダにプログラム情報を書き込むだけでいいです.
レジストリについてはキーボードでwin+rキーを同時に押して、シリアルポートでregeditに負けて車に戻るとレジストリが見えます(大きな木と理解でき、システムの情報が記録されています)、左のフォルダをクリックして、クリック順は:Software\Microsoft\Windows\CurrentVersion\Run、このフォルダに格納されているのは、ランダムに起動したプログラムの情報です.例を挙げると、あるコンピュータ最適化ソフトウェアを使用してコンピュータ最適化を行うと、起動最適化が必要なプロジェクトが検出されます.つまり、起動する必要がないソフトウェアがあります.修正したのはこのファイルの情報です.
まず、使用する関数の意味を説明します.
RegOpenKeyEx()
関数機能の説明:指定したレジストリ・キーのプロトタイプを開く
LONG RegOpenKeyEx(HKEY hKey,//開く必要があるプライマリ・キーの名前LPCTSTR lpSubKey,//開く必要があるサブキーの名前DWORD ulOptions,//保留、0 REGSAM samDesired,//セキュリティ・アクセス・マーク、すなわち権限PHKEY phkResult//が得る開くキーのハンドル)Parametersパラメータ:hKeyパラメータRegCreateKeyExまたはRegOpenKeyExによって現在開かれているレジストリキーを識別するハンドル、または以下の事前定義されたハンドルHKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS
lpSubKeyは、開くレジストリ名を保存するために使用される文字列を指すパラメータです.このパラメータが空の場合、または空の列を指すポインタの場合、関数はhKeyによって定義されたキーを開きます.この場合、関数は舷壁が開いているハンドルを閉じません.
ulOptionsパラメータ、保存、0 samDesiredパラメータに設定します.レジストリを開く権限を識別します.パラメータのセキュリティ記述子が現在のプロセスがレジストリにアクセスできない場合、関数は失敗を返します.このプログラムでは、書き込みパラメータであるKEY_を使用します.WRITE (0x20006). phkResultは、レジストリキーを開いたハンドルを保存するための変数のポインタを指します.戻るハンドルが使用されなくなった場合は、RegCloseKeyを呼び出して閉じます.戻り値:ERROR_SUCCESSは、関数の実行に成功したことを示し、ゼロ以外の値は、関数の実行に失敗したことを示します.エラー記述を取得するには、FormatMessage関数を呼び出し、FORMAT_に転送します.MESSAGE_FROM_SYSTEMパラメータ.
二:GetModuleFileName(NULL,pFileName,MAX_PATH);関数プロトタイプは、現在のプロセスによってロードされているモジュールのファイルの完全なパスを取得します.)DWORDGetModuleFileName( HMODULE hModule, LPTSTR lpFilename, DWORD nSize ); HMODULE hModule:プログラムインスタンスのハンドルをロードします.パラメータがNULLの場合、関数は現在のアプリケーションのフルパスを返します.lpFileName:返された名前のメモリブロックを格納するポインタで、出力パラメータです.DWORDnSize:バッファlpFileNameにロードされる最大値.
注意:実行中のEXEまたはDLLのフルパスを取得するには、GetModuleFileName Ex(hProcess,hInst,lpFile,MAX_PATH)と書くことができます.//バッファに注意すればいいです.
3:
RegSetValueEx():設定するレジストリ・アイテムの下にデフォルト値ではなく、名前値のデータとタイプがある場合は、レジストリ・アイテムの下に指定した値のデータとタイプを設定するRegSetValueEx関数を呼び出すことができます.LONG RegSetValueEx( HKEY hKey, LPCTSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE *lpData, DWORD cbData ); hKey:開いているアイテムのハンドルlpValueName:値を設定する名前を含む文字列へのポインタ.この値名を持つ値が指定したレジストリ・アイテムに存在しない場合、この関数はアイテムに追加されます.Reserved:値を保持するには、0 dwType:格納されるデータ型lpDataを指定する必要があります.指定した値名に格納するデータを含むバッファを指します.cbData:lpDataパラメータが指すデータのサイズをバイト単位で指定します.
以下のコードの場合、本プログラムを起動する方法を実現する.ダイアログ・プログラムを作成し、ダイアログ・ボックスにbuttonを配置し、メッセージ応答関数に次のコードを書きます.
実行をクリックすると、「起動成功」ダイアログ・ボックスが表示され、コンピュータを再起動すると、ソフトウェアが起動します(プログラムを実行すると、レジストリの変更を警告するウイルス対策ソフトウェアがあるかもしれません.それは私たちのプログラムがレジストリを変更しているのです).
レジストリについてはキーボードでwin+rキーを同時に押して、シリアルポートでregeditに負けて車に戻るとレジストリが見えます(大きな木と理解でき、システムの情報が記録されています)、左のフォルダをクリックして、クリック順は:Software\Microsoft\Windows\CurrentVersion\Run、このフォルダに格納されているのは、ランダムに起動したプログラムの情報です.例を挙げると、あるコンピュータ最適化ソフトウェアを使用してコンピュータ最適化を行うと、起動最適化が必要なプロジェクトが検出されます.つまり、起動する必要がないソフトウェアがあります.修正したのはこのファイルの情報です.
まず、使用する関数の意味を説明します.
RegOpenKeyEx()
関数機能の説明:指定したレジストリ・キーのプロトタイプを開く
LONG RegOpenKeyEx(HKEY hKey,//開く必要があるプライマリ・キーの名前LPCTSTR lpSubKey,//開く必要があるサブキーの名前DWORD ulOptions,//保留、0 REGSAM samDesired,//セキュリティ・アクセス・マーク、すなわち権限PHKEY phkResult//が得る開くキーのハンドル)Parametersパラメータ:hKeyパラメータRegCreateKeyExまたはRegOpenKeyExによって現在開かれているレジストリキーを識別するハンドル、または以下の事前定義されたハンドルHKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS
lpSubKeyは、開くレジストリ名を保存するために使用される文字列を指すパラメータです.このパラメータが空の場合、または空の列を指すポインタの場合、関数はhKeyによって定義されたキーを開きます.この場合、関数は舷壁が開いているハンドルを閉じません.
ulOptionsパラメータ、保存、0 samDesiredパラメータに設定します.レジストリを開く権限を識別します.パラメータのセキュリティ記述子が現在のプロセスがレジストリにアクセスできない場合、関数は失敗を返します.このプログラムでは、書き込みパラメータであるKEY_を使用します.WRITE (0x20006). phkResultは、レジストリキーを開いたハンドルを保存するための変数のポインタを指します.戻るハンドルが使用されなくなった場合は、RegCloseKeyを呼び出して閉じます.戻り値:ERROR_SUCCESSは、関数の実行に成功したことを示し、ゼロ以外の値は、関数の実行に失敗したことを示します.エラー記述を取得するには、FormatMessage関数を呼び出し、FORMAT_に転送します.MESSAGE_FROM_SYSTEMパラメータ.
二:GetModuleFileName(NULL,pFileName,MAX_PATH);関数プロトタイプは、現在のプロセスによってロードされているモジュールのファイルの完全なパスを取得します.)DWORDGetModuleFileName( HMODULE hModule, LPTSTR lpFilename, DWORD nSize ); HMODULE hModule:プログラムインスタンスのハンドルをロードします.パラメータがNULLの場合、関数は現在のアプリケーションのフルパスを返します.lpFileName:返された名前のメモリブロックを格納するポインタで、出力パラメータです.DWORDnSize:バッファlpFileNameにロードされる最大値.
注意:実行中のEXEまたはDLLのフルパスを取得するには、GetModuleFileName Ex(hProcess,hInst,lpFile,MAX_PATH)と書くことができます.//バッファに注意すればいいです.
3:
RegSetValueEx():設定するレジストリ・アイテムの下にデフォルト値ではなく、名前値のデータとタイプがある場合は、レジストリ・アイテムの下に指定した値のデータとタイプを設定するRegSetValueEx関数を呼び出すことができます.LONG RegSetValueEx( HKEY hKey, LPCTSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE *lpData, DWORD cbData ); hKey:開いているアイテムのハンドルlpValueName:値を設定する名前を含む文字列へのポインタ.この値名を持つ値が指定したレジストリ・アイテムに存在しない場合、この関数はアイテムに追加されます.Reserved:値を保持するには、0 dwType:格納されるデータ型lpDataを指定する必要があります.指定した値名に格納するデータを含むバッファを指します.cbData:lpDataパラメータが指すデータのサイズをバイト単位で指定します.
以下のコードの場合、本プログラムを起動する方法を実現する.ダイアログ・プログラムを作成し、ダイアログ・ボックスにbuttonを配置し、メッセージ応答関数に次のコードを書きます.
void CSetAutoRunDlg::OnBnClickedButton1()
{
// TODO:
HKEY hKey; //
// , const char *
LPCTSTR lpRun = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";
// Key
long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);
if(lRet == ERROR_SUCCESS) //
{
char pFileName[MAX_PATH] = {0}; //
//
DWORD dwRet = GetModuleFileName(NULL, pFileName, MAX_PATH);
// Key, // "test" ( .exe)
lRet = RegSetValueEx(hKey, "SetAutoRun", 0, REG_SZ, (BYTE *)pFileName, dwRet);
//
RegCloseKey(hKey);
if(lRet != ERROR_SUCCESS)
{
MessageBox(" , ");
}
else
{
MessageBox(" ");
}
// isrun = 1;
}
}
実行をクリックすると、「起動成功」ダイアログ・ボックスが表示され、コンピュータを再起動すると、ソフトウェアが起動します(プログラムを実行すると、レジストリの変更を警告するウイルス対策ソフトウェアがあるかもしれません.それは私たちのプログラムがレジストリを変更しているのです).