2014-02-06 5 views
0

Я хочу создать ярлык для моего приложения в процессе запуска. Я использовал Visual C++ 2010 и окна 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; 

}

Но, когда я выступал не создавая. in line:

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

получить ошибку. и не выполняет. Остается моя программа.

+0

Вы должны указать конкретную ошибку, которую вы получите, иначе вряд ли вы получите ответы на ваши вопросы. –

ответ

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 содержит дополнительную информацию, если вы задавались вопросом, что не так с вашим кодом.

+0

Я выполнял, но не создал ярлык для моего запуска. char szPath [160]; CreateLink (GetStartupFolderPath(). C_str(), szPath, L "hello"); – user3223395

+2

Действительно, вы должны называть 'CoUninitialize()'. И стыдно, что вы не пытались объяснить, что возвращенный «HRESULT» несет информацию. Возможно, аскер продолжал, и в следующий раз, когда 'SUCCEEDED (hres)' false, будет столь же беспомощным. –

+0

Вы правы, я отредактировал свой ответ. Лучше не предполагать ничего. –

1

Возвращенный HRESULT не просто указывает на успех и неудачу. В случае сбоя HRESULT сообщает, почему вызов был неудачным. Когда вы сталкиваетесь с сбоем, вам необходимо декодировать HRESULT, чтобы узнать, почему вызов был неудачным.

В этом случае вызов настолько прост, что есть только один очевидный отказ. Вы не инициализировали COM. С вероятностью, очень близкой к 1, значение, возвращаемое вызовом CoCreateInstance, равно CO_E_FIRST со значением 0x800401f0, что указывает на то, что COM не был инициализирован.

Вы хотите добавить звонок в CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) при запуске и сопоставить его с вызовом CoUninitialize(), когда вы закончите работу с COM.

Для чего это стоит, я думаю, что ваша функция была бы лучше, если бы все ее параметры были широкими. Подобная функция не должна беспокоить себя такими преобразованиями. Если вам нужно сделать такие преобразования, включите в свой код некоторые вспомогательные методы для их выполнения. Вы можете добавить функцию для преобразования из std::string в std::wstring, и это должно быть все, что вам нужно.

Смежные вопросы