1. 程式人生 > >無法定位程式輸入點RegSetKeyValueA 於動態連結庫 ADVAPI32.dll上 解決方案

無法定位程式輸入點RegSetKeyValueA 於動態連結庫 ADVAPI32.dll上 解決方案

寫了一個登錄檔的程式,在win7下可正常執行,拿到XP系統下執行,爆出如下錯誤:

接下來試著把win7下的ADVAPI32.DLL拷貝到目錄下,結果還是不行。

拿出IDA看下xp下面的ADVAPI32.DLL的匯出函式,發現原來xp下的該dll沒有匯出該函式。

檢視MSDN,發現RegSetKeyValue只支援Vista以上的作業系統。看來是使用了高版本系統才支援的API導致出錯。

摸索了一下,改用RegSetValueExA函式,就可以了。

順便總結一下注冊表程式設計:

①先開啟登錄檔

②操作子項

示例程式碼:

        LSTATUS r;
	HKEY hk;
	ST st = GetSystemType();
	if (st==WINDOWS_XP)
	{
		//XP
		r = RegOpenKeyExA(HKEY_LOCAL_MACHINE, 
			"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows", //登錄檔路徑
			0, KEY_WRITE, &hk);

		if (r!=ERROR_SUCCESS)
		{
			MessageBoxA("寫登錄檔失敗!", "Warn", MB_OK);
			return;
		}

		r = RegSetValueExA(hk, //登錄檔控制代碼
			"AppInit_DLLs", //子項名稱
			0, REG_SZ, (BYTE*)filename, strlen(filename));

		if (r!=ERROR_SUCCESS)
		{
			MessageBoxA("寫登錄檔失敗!", "Warn", MB_OK);
			return;
		}
	} 
注意不能直接調RegSetValueExA,傳入絕對路徑,這樣操作是不能成功的。 得意