在启动时创建我的应用程序的快捷方式

时间:2014-02-06 11:35:07

标签: c++ winapi

我想在启动时创建应用程序的快捷方式。我使用了visual c ++ 2010和windows 7.

HRESULT CreateLink(LPCWSTR lpszPathObj, LPCSTR lpszPathLink, LPCWSTR lpszDesc){ 
HRESULT hres; 
IShellLink* psl; 

hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl); 

if (SUCCEEDED(hres)) 
{ 
    IPersistFile* ppf; 

    psl->SetPath(lpszPathObj); 
    psl->SetDescription(lpszDesc); 

    hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf); 

    if (SUCCEEDED(hres)) 
    { 
        WCHAR wsz[MAX_PATH]; 

        MultiByteToWideChar(CP_ACP, 0, lpszPathLink, -1, wsz, MAX_PATH); 


        hres = ppf->Save(wsz, TRUE); 
        ppf->Release(); 
    } 
    psl->Release(); 
} 
return hres; 

}

但是,当我表演时没有创作。在线:

hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl); 

得到错误。并且不执行保持我的程序。

2 个答案:

答案 0 :(得分:1)

返回的HRESULT不仅表示成功和失败。如果失败,HRESULT会告诉您呼叫失败的原因。当您遇到故障时,您需要解码HRESULT以找出呼叫失败的原因。

在这种情况下,调用非常简单,只有一种明显的故障模式。您没有初始化COM。概率非常接近1,调用CoCreateInstance返回的值为CO_E_FIRST,值为0x800401f0,表示COM尚未初始化。

您需要在启动时添加对CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)的调用,并在完成COM后将其与CoUninitialize()的调用相匹配。

对于它的价值,我认为如果它的所有参数都是宽字符串,那么你的函数会更好。这样的功能不应该让这种转换感到担忧。如果您需要进行此类转换,请在代码中包含一些帮助程序方法来执行这些转换。您可以添加一个功能,以便从std::string转换为std::wstring,这应该就是您所需要的。

答案 1 :(得分:0)

您需要在执行任务之前初始化COM:

HRESULT CreateLink(LPCSTR lpszPathObj, LPCSTR lpszPathLink, LPCSTR lpszDesc){ 
  HRESULT hres; 
  IShellLink* psl; 

  hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl); 

  if (SUCCEEDED(hres)) 
  { 
    IPersistFile* ppf; 

    psl->SetPath(lpszPathObj); 
    psl->SetDescription(lpszDesc); 

    hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf); 

    if (SUCCEEDED(hres)) 
    { 
      WCHAR wsz[MAX_PATH]; 

      MultiByteToWideChar(CP_ACP, 0, lpszPathLink, -1, wsz, MAX_PATH); 


      hres = ppf->Save(wsz, TRUE); 
      ppf->Release(); 
    } 
    psl->Release(); 
  } 
  return hres; 
}

int main()
{
  CoInitialize(0); // Initialize COM

  CreateLink("C:\\hello.lnk", "C:\\hello.obj", "hello");

  CoUninitialize();

  return 0;
}

另外:注意LPCSTR / LPCWSTR(广泛)转换。如果您想知道代码有什么问题,那么hres参数包含其他信息。