很长时间以来,我一直在使用函数在Windows中创建链接。源代码为纯C语言:
void CreateLink(TCHAR *PathObj, TCHAR *PathLink, TCHAR *ArgV)
{
IShellLink *psl;
IPersistFile *ppf;
if (SUCCEEDED(CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLink, (void**)&psl))) {
psl->lpVtbl->SetPath(psl, PathObj);
psl->lpVtbl->SetArguments(psl, ArgV);
if (SUCCEEDED(psl->lpVtbl->QueryInterface(psl, &IID_IPersistFile, (void**)&ppf))) {
ppf->lpVtbl->Save(ppf, PathLink, TRUE);
ppf->lpVtbl->Release(ppf);
}
psl->lpVtbl->Release(psl);
}
}
该功能可以正常工作,但是我注意到在MinGW 4.7.4中,我的可执行文件大约只有10KB,因为该功能。
我现在已经将MinGW更新到5.3.0版本,现在此功能将可执行文件的大小增加了约20KB。
代码针对大小(-O)进行了优化,并且去除了符号。实际上,此膨胀是由链接程序解析“ IID_IShellLink”时引起的。
所以,我的问题是:有没有办法避免这样的膨胀?
最佳答案
最后,我找到了解决该问题的方法。我们只需要直接在函数中定义GUID。这样,链接器就不再需要uuid库了,可执行文件越小越好,并且可以完美地工作。
可以在objidl.h(MinGW 6.2.0)中找到这两个GUID。
void CreateLink(TCHAR *PathObj, TCHAR *PathLink, TCHAR *ArgV)
{
GUID IID_IShellLinkW = {0x000214f9, 0, 0, {0xc0, 0, 0, 0, 0, 0, 0, 0x46}};
GUID IID_IPersistFile = {0x0000010b, 0, 0, {0xc0, 0, 0, 0, 0, 0, 0, 0x46}};
IShellLink *psl;
IPersistFile *ppf;
if (SUCCEEDED(CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLinkW, (void**)&psl))) {
psl->lpVtbl->SetPath(psl, PathObj);
psl->lpVtbl->SetArguments(psl, ArgV);
if (SUCCEEDED(psl->lpVtbl->QueryInterface(psl, &IID_IPersistFile, (void**)&ppf))) {
ppf->lpVtbl->Save(ppf, PathLink, TRUE);
ppf->lpVtbl->Release(ppf);
}
psl->lpVtbl->Release(psl);
}
}
这没有解释链接器包含的数据的含义,但是至少可以回答这个问题。
关于c - 使用IShellLink将我的可执行文件膨胀到20KB,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35112942/