win32实现lnk文件创建

前言:win32实现lnk文件创建

参考文章:https://x.threatbook.com/v5/article?threatInfoID=42622

手动右键创建相关的启动路径和图标的时候,如果对应的启动路径和图标不存在那么就无法创建成功,用win32的话是可以的

#include <iostream>
#include <Windows.h>
#include <shlobj.h>
#include <locale>
using namespace std;


DWORD initCom()
{
	if (S_OK != CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE))  //初始化COM库失败
		return -1;
	return 0;
}

DWORD createLink(const wchar_t* targetPath, const wchar_t* arguments, const wchar_t* iconPath, const wchar_t* lnkPath)
{
	IShellLinkW* pShellLink = NULL;
	IPersistFile* ppf = NULL;
	if (SUCCEEDED(initCom()))
	{
		HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pShellLink));

		if (SUCCEEDED(hr))
		{
			arguments = arguments == L"" ? L"" : arguments;
			iconPath = iconPath == L"" ? L"" : iconPath;

			pShellLink->SetPath(targetPath);
			pShellLink->SetArguments(arguments);
			pShellLink->SetIconLocation(iconPath, 0);
			
			hr = pShellLink->QueryInterface(&ppf);
			if (SUCCEEDED(hr))
			{
				hr = ppf->Save(lnkPath, TRUE);
				if (!SUCCEEDED(hr))
				{
					ppf->Release();
					pShellLink->Release();
					CoUninitialize();
					return -1;
				}
			}
			else
			{
				pShellLink->Release();
				CoUninitialize();
				return -1;
			}
		}
		else
		{
			return -1;
		}
	}
	if (ppf != NULL)
	{
		ppf->Release();
	}

	if (pShellLink != NULL)
	{
		pShellLink->Release();
	}
	
	return 0;
}

DWORD createLink(const wchar_t* targetPath, const wchar_t* iconPath, const wchar_t* lnkPath)
{
	return createLink(targetPath, NULL, iconPath, lnkPath); // 无参数
}

DWORD createLink(const wchar_t* targetPath, const wchar_t* lnkPath)
{
	return createLink(targetPath, NULL, NULL, lnkPath);
}

int wmain(int argc, wchar_t* argv[])
{
	setlocale(LC_ALL, "");
	if (argc == 5)
	{
		if (!createLink(argv[1], argv[2], argv[3], argv[4]))
		{
			wprintf(L"save file: %s\n", argv[4]);
		}
	}
	else if (argc == 4)
	{
		if (!createLink(argv[1], argv[2], argv[3]))
		{
			wprintf(L"save file: %s\n", argv[3]);
		}
	}
	else
	{
		wprintf(L"for eaxample:\n\t%s 快捷程序路径 参数路径 图标路径 生成路径\n", argv[0], argv[0]);
		wprintf(L"\t%s C:\\Windows\\system32\\calc.exe --connect D:\\WinDDK\\7600.16385.1\\Debuggers\\windbg.exe C:\\ProgramData\\test.lnk\n", argv[0], argv[0]);
		wprintf(L"for eaxample:\n\t%s 快捷程序路径 图标路径 生成路径\n", argv[0], argv[0]);
		wprintf(L"\t%s C:\\Windows\\system32\\calc.exe D:\\WinDDK\\7600.16385.1\\Debuggers\\windbg.exe C:\\ProgramData\\test.lnk\n", argv[0], argv[0]);

	}

	return 0;
}

posted @ 2022-02-27 00:37  zpchcbd  阅读(369)  评论(0)    收藏  举报