none
Программное создание ярлыка RRS feed

  • Вопрос

  • Прошу не убивать и не крыть матом, снова с проблемами... :)

    Имеется следующий код, который выводит программно ярлык из папки "сетевые подключения". 

    #include <stdio.h>
    #include <shlobj.h>
    #include <shlwapi.h>
    
    bool __fastcall CreateShortCut(LPWSTR pwzShortCutFileName,  LPCITEMIDLIST pidl,
                                   LPTSTR pszWorkingDirectory, WORD wHotKey, int iCmdShow);
    int short_cut_startup(char *connection_name, LPWSTR link_name);
    LPITEMIDLIST GetNextItemID(LPCITEMIDLIST pidl);
    UINT GetSize(LPCITEMIDLIST pidl);
    LPITEMIDLIST Append(LPCITEMIDLIST pidlBase, LPCITEMIDLIST pidlAdd);
    
    LPMALLOC pMalloc;
    
    int main(void)
    {
        if(short_cut_startup("demo", L"demo.lnk"))
            printf("Success!\n");
        else printf("Can't create shortcut!\n");
        return 0;
    }
    
    /* Main function which creating shortcut on desktop */
    int short_cut_startup(char *connection_name, LPWSTR link_name)
    {
        LPITEMIDLIST pidConnections = NULL;
        LPITEMIDLIST pidlItems = NULL;
        LPITEMIDLIST pidlDesk = NULL;
        IShellFolder *psfFirstFolder = NULL;
        IShellFolder *psfDeskTop = NULL;
        IShellFolder *pConnections = NULL;
        LPENUMIDLIST ppenum = NULL;
        ULONG celtFetched;
        HRESULT hr;
        STRRET str_curr_connection_name;
        TCHAR curr_connection_name[MAX_PATH] = "";    /* Connection point name */
        TCHAR desktop_path[MAX_PATH]="";            /* Path to desktop */
        TCHAR full_link_name[MAX_PATH]="";            /* Full shortcut name */
        LPITEMIDLIST full_pid;                        /* Full shortcut pid */
    
       
        CoInitialize( NULL );
        /* Allocating memory for Namespace objects */
        hr = SHGetMalloc(&pMalloc);
        hr = SHGetFolderLocation(NULL, CSIDL_CONNECTIONS, NULL, NULL, &pidConnections);
    
        /* Get full path to desktop */
        SHGetFolderPath(NULL, CSIDL_DESKTOP, NULL, 0, desktop_path);
    
        hr = SHGetDesktopFolder(&psfDeskTop);
        hr = psfDeskTop->BindToObject(pidConnections, NULL, IID_IShellFolder, (LPVOID *) &pConnections);
        hr = pConnections->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);
    
        /* Loop for searching our connection */
        while(hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
        {
            pConnections->GetDisplayNameOf(pidlItems, SHGDN_INFOLDER, &str_curr_connection_name);
            StrRetToBuf(&str_curr_connection_name, pidlItems, curr_connection_name, MAX_PATH);
            if(!strcmp(curr_connection_name,connection_name))
                goto found;
        }
        printf("Connection not found in \"Network connections\" folder.\n");
        return 0;
    found:
        /* Append PIDLs */
        full_pid=Append(pidConnections,pidlItems);
        SetCurrentDirectory(desktop_path);
        if(!CreateShortCut(link_name, full_pid, "C:\\windows", 0, SW_SHOWNORMAL))
            return 0;
    
        ppenum->Release();
        pMalloc->Free(pidlItems);
        pMalloc->Free(pidConnections);
        pMalloc->Release();
        pConnections->Release();
        CoUninitialize();
        return 1;
    }
    
    bool __fastcall CreateShortCut(LPWSTR pwzShortCutFileName,  LPCITEMIDLIST pidl,
                                   LPTSTR pszWorkingDirectory, WORD wHotKey, int iCmdShow)
    { 
        IShellLink * pSL; 
        IPersistFile * pPF; 
        HRESULT hRes; 
        hRes = CoCreateInstance(CLSID_ShellLink, 0,CLSCTX_INPROC_SERVER, 
                                IID_IShellLink, (LPVOID *)&pSL); 
        if( SUCCEEDED(hRes) ) 
        { 
            hRes=pSL->SetIDList(pidl);
            if(SUCCEEDED(hRes))
            { 
                hRes = pSL->SetHotkey(wHotKey); 
                if( SUCCEEDED(hRes) ) 
                { 
                    hRes = pSL->SetShowCmd(iCmdShow); 
                    if( SUCCEEDED(hRes) ) 
                    { 
                        hRes = pSL->QueryInterface(IID_IPersistFile,(LPVOID *)&pPF); 
                        if( SUCCEEDED(hRes) ) 
                        { 
                            hRes = pPF->Save(pwzShortCutFileName,TRUE); 
                            pPF->Release(); 
                        }
                    }
                }
            }
            pSL->Release(); 
        }
        return SUCCEEDED(hRes); 
    }
    
    /******************************************************************************/
    /* Functions copied from http://msdn.microsoft.com */
    
    LPITEMIDLIST GetNextItemID(LPCITEMIDLIST pidl) 
    { 
       // Check for valid pidl.
       if(pidl == NULL)
          return NULL;
    
       // Get the size of the specified item identifier. 
       int cb = pidl->mkid.cb; 
    
       // If the size is zero, it is the end of the list. 
    
       if (cb == 0) 
          return NULL; 
    
       // Add cb to pidl (casting to increment by bytes). 
       pidl = (LPITEMIDLIST) (((LPBYTE) pidl) + cb); 
    
       // Return NULL if it is null-terminating, or a pidl otherwise. 
       return (pidl->mkid.cb == 0) ? NULL : (LPITEMIDLIST) pidl; 
    } 
    
    /* Get size of PIDL */
    UINT GetSize(LPCITEMIDLIST pidl)
    {
        UINT cbTotal = 0;
        if (pidl)
        {
            cbTotal += sizeof(pidl->mkid.cb);    // Terminating null character
            while (pidl)
            {
                cbTotal += pidl->mkid.cb;
                pidl = GetNextItemID(pidl);
            }
        }
        return cbTotal;
    }
    
    /* Appending PIDLs */
    LPITEMIDLIST Append(LPCITEMIDLIST pidlBase, LPCITEMIDLIST pidlAdd)
    {
        if(pidlBase == NULL)
            return NULL;
        if(pidlAdd == NULL)
            return (LPITEMIDLIST)pidlBase;
        
        LPITEMIDLIST pidlNew;
    
        UINT cb1 = GetSize(pidlBase) - sizeof(pidlBase->mkid.cb);
        UINT cb2 = GetSize(pidlAdd);
    
        pidlNew = (LPITEMIDLIST)pMalloc->Alloc(cb1 + cb2);
        if (pidlNew)
        {
            CopyMemory(pidlNew, pidlBase, cb1);
            CopyMemory(((LPSTR)pidlNew) + cb1, pidlAdd, cb2);
        }
        return pidlNew;
    }

    Но при компиляции появляются ошибки:

    error C2664: CreateLinkThenChangeIcon: невозможно преобразовать параметр 1 из 'const char [9]' в 'LPTSTR'	
    
    Ошибка	7	error C2061: синтаксическая ошибка: идентификатор "_TCHAR"	
    
    Ошибка	6	error C2664: IPersistFile::Save: невозможно преобразовать параметр 1 из 'WORD [256]' в 'LPCOLESTR'	
    
    Ошибка	5	error C2664: lstrcatW: невозможно преобразовать параметр 2 из 'const char [13]' в 'LPCWSTR'	
    
    Ошибка	4	error C2664: IPersistFile::Save: невозможно преобразовать параметр 1 из 'WORD [256]' в 'LPCOLESTR'	
    
    Ошибка	3	error C2664: MultiByteToWideChar: невозможно преобразовать параметр 3 из 'TCHAR [256]' в 'LPCSTR'	
    
    Ошибка	2	error C2664: lstrcatW: невозможно преобразовать параметр 2 из 'const char [2]' в 'LPCWSTR'	
    

    Код работал, может я чего то с библиотеками намутил? Ткните носом пожалуйста...

    24 марта 2012 г. 14:46

Ответы

  • Не указаны в линковщике библиотеки содержащие данные функции.

    Пройдитесь по этим функциям, посмотрите в документиции какие lib файлы необходимы, например для CoInitialize нужна Ole32.lib, для SHGetFolderLocation - Shell32.lib.

    Эти данные указаны внизу в описании функции (раздел Requirements - Library).


    Для связи [mail]

    • Помечено в качестве ответа Mr.Sanders 2 апреля 2012 г. 10:03
    2 апреля 2012 г. 9:42
  • 1) Для всех строк нужно применить макрос TEXT
    2) Также нельзя сравнивать char и TCHAR

    Попробуйте исправленный вариант:

    // testtt.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    
    #include <stdio.h>
    #include <shlobj.h>
    #include <shlwapi.h>
    
    #pragma comment(lib,"Shlwapi.lib")
    
    bool __fastcall CreateShortCut(LPWSTR pwzShortCutFileName,  LPCITEMIDLIST pidl,
                                   LPTSTR pszWorkingDirectory, WORD wHotKey, int iCmdShow);
    int short_cut_startup(TCHAR *connection_name, LPWSTR link_name);
    LPITEMIDLIST GetNextItemID(LPCITEMIDLIST pidl);
    UINT GetSize(LPCITEMIDLIST pidl);
    LPITEMIDLIST Append(LPCITEMIDLIST pidlBase, LPCITEMIDLIST pidlAdd);
    
    LPMALLOC pMalloc;
    
    int main(void)
    {
        if(short_cut_startup(L"demo", L"demo.lnk"))
            printf("Success!\n");
        else printf("Can't create shortcut!\n");
        return 0;
    }
    
    /* Main function which creating shortcut on desktop */
    int short_cut_startup(TCHAR *connection_name, LPWSTR link_name)
    {
        LPITEMIDLIST pidConnections = NULL;
        LPITEMIDLIST pidlItems = NULL;
        LPITEMIDLIST pidlDesk = NULL;
        IShellFolder *psfFirstFolder = NULL;
        IShellFolder *psfDeskTop = NULL;
        IShellFolder *pConnections = NULL;
        LPENUMIDLIST ppenum = NULL;
        ULONG celtFetched;
        HRESULT hr;
        STRRET str_curr_connection_name;
        TCHAR curr_connection_name[MAX_PATH] = L"";    /* Connection point name */
        TCHAR desktop_path[MAX_PATH]=L"";            /* Path to desktop */
        TCHAR full_link_name[MAX_PATH]=L"";            /* Full shortcut name */
        LPITEMIDLIST full_pid;                        /* Full shortcut pid */
    
       
        CoInitialize( NULL );
        /* Allocating memory for Namespace objects */
        hr = SHGetMalloc(&pMalloc);
        hr = SHGetFolderLocation(NULL, CSIDL_CONNECTIONS, NULL, NULL, &pidConnections);
    
        /* Get full path to desktop */
        SHGetFolderPath(NULL, CSIDL_DESKTOP, NULL, 0, desktop_path);
    
        hr = SHGetDesktopFolder(&psfDeskTop);
        hr = psfDeskTop->BindToObject(pidConnections, NULL, IID_IShellFolder, (LPVOID *) &pConnections);
        hr = pConnections->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);
    
        /* Loop for searching our connection */
        while(hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
        {
            pConnections->GetDisplayNameOf(pidlItems, SHGDN_INFOLDER, &str_curr_connection_name);
            StrRetToBuf(&str_curr_connection_name, pidlItems, curr_connection_name, MAX_PATH);
            if(!_tcscmp(curr_connection_name,connection_name))
                goto found;
        }
        printf("Connection not found in \"Network connections\" folder.\n");
        return 0;
    found:
        /* Append PIDLs */
        full_pid=Append(pidConnections,pidlItems);
        SetCurrentDirectory(desktop_path);
        if(!CreateShortCut(link_name, full_pid, L"C:\\windows", 0, SW_SHOWNORMAL))
            return 0;
    
        ppenum->Release();
        pMalloc->Free(pidlItems);
        pMalloc->Free(pidConnections);
        pMalloc->Release();
        pConnections->Release();
        CoUninitialize();
        return 1;
    }
    
    bool __fastcall CreateShortCut(LPWSTR pwzShortCutFileName,  LPCITEMIDLIST pidl,
                                   LPTSTR pszWorkingDirectory, WORD wHotKey, int iCmdShow)
    { 
        IShellLink * pSL; 
        IPersistFile * pPF; 
        HRESULT hRes; 
        hRes = CoCreateInstance(CLSID_ShellLink, 0,CLSCTX_INPROC_SERVER, 
                                IID_IShellLink, (LPVOID *)&pSL); 
        if( SUCCEEDED(hRes) ) 
        { 
            hRes=pSL->SetIDList(pidl);
            if(SUCCEEDED(hRes))
            { 
                hRes = pSL->SetHotkey(wHotKey); 
                if( SUCCEEDED(hRes) ) 
                { 
                    hRes = pSL->SetShowCmd(iCmdShow); 
                    if( SUCCEEDED(hRes) ) 
                    { 
                        hRes = pSL->QueryInterface(IID_IPersistFile,(LPVOID *)&pPF); 
                        if( SUCCEEDED(hRes) ) 
                        { 
                            hRes = pPF->Save(pwzShortCutFileName,TRUE); 
                            pPF->Release(); 
                        }
                    }
                }
            }
            pSL->Release(); 
        }
        return SUCCEEDED(hRes); 
    }
    
    /******************************************************************************/
    /* Functions copied from http://msdn.microsoft.com */
    
    LPITEMIDLIST GetNextItemID(LPCITEMIDLIST pidl) 
    { 
       // Check for valid pidl.
       if(pidl == NULL)
          return NULL;
    
       // Get the size of the specified item identifier. 
       int cb = pidl->mkid.cb; 
    
       // If the size is zero, it is the end of the list. 
    
       if (cb == 0) 
          return NULL; 
    
       // Add cb to pidl (casting to increment by bytes). 
       pidl = (LPITEMIDLIST) (((LPBYTE) pidl) + cb); 
    
       // Return NULL if it is null-terminating, or a pidl otherwise. 
       return (pidl->mkid.cb == 0) ? NULL : (LPITEMIDLIST) pidl; 
    } 
    
    /* Get size of PIDL */
    UINT GetSize(LPCITEMIDLIST pidl)
    {
        UINT cbTotal = 0;
        if (pidl)
        {
            cbTotal += sizeof(pidl->mkid.cb);    // Terminating null character
            while (pidl)
            {
                cbTotal += pidl->mkid.cb;
                pidl = GetNextItemID(pidl);
            }
        }
        return cbTotal;
    }
    
    /* Appending PIDLs */
    LPITEMIDLIST Append(LPCITEMIDLIST pidlBase, LPCITEMIDLIST pidlAdd)
    {
        if(pidlBase == NULL)
            return NULL;
        if(pidlAdd == NULL)
            return (LPITEMIDLIST)pidlBase;
        
        LPITEMIDLIST pidlNew;
    
        UINT cb1 = GetSize(pidlBase) - sizeof(pidlBase->mkid.cb);
        UINT cb2 = GetSize(pidlAdd);
    
        pidlNew = (LPITEMIDLIST)pMalloc->Alloc(cb1 + cb2);
        if (pidlNew)
        {
            CopyMemory(pidlNew, pidlBase, cb1);
            CopyMemory(((LPSTR)pidlNew) + cb1, pidlAdd, cb2);
        }
        return pidlNew;
    }


    Для связи [mail]

    • Помечено в качестве ответа Abolmasov Dmitry 29 марта 2012 г. 14:51
    • Снята пометка об ответе Mr.Sanders 2 апреля 2012 г. 7:03
    • Помечено в качестве ответа Mr.Sanders 2 апреля 2012 г. 10:30
    27 марта 2012 г. 11:29

Все ответы

  • 1) Для всех строк нужно применить макрос TEXT
    2) Также нельзя сравнивать char и TCHAR

    Попробуйте исправленный вариант:

    // testtt.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    
    #include <stdio.h>
    #include <shlobj.h>
    #include <shlwapi.h>
    
    #pragma comment(lib,"Shlwapi.lib")
    
    bool __fastcall CreateShortCut(LPWSTR pwzShortCutFileName,  LPCITEMIDLIST pidl,
                                   LPTSTR pszWorkingDirectory, WORD wHotKey, int iCmdShow);
    int short_cut_startup(TCHAR *connection_name, LPWSTR link_name);
    LPITEMIDLIST GetNextItemID(LPCITEMIDLIST pidl);
    UINT GetSize(LPCITEMIDLIST pidl);
    LPITEMIDLIST Append(LPCITEMIDLIST pidlBase, LPCITEMIDLIST pidlAdd);
    
    LPMALLOC pMalloc;
    
    int main(void)
    {
        if(short_cut_startup(L"demo", L"demo.lnk"))
            printf("Success!\n");
        else printf("Can't create shortcut!\n");
        return 0;
    }
    
    /* Main function which creating shortcut on desktop */
    int short_cut_startup(TCHAR *connection_name, LPWSTR link_name)
    {
        LPITEMIDLIST pidConnections = NULL;
        LPITEMIDLIST pidlItems = NULL;
        LPITEMIDLIST pidlDesk = NULL;
        IShellFolder *psfFirstFolder = NULL;
        IShellFolder *psfDeskTop = NULL;
        IShellFolder *pConnections = NULL;
        LPENUMIDLIST ppenum = NULL;
        ULONG celtFetched;
        HRESULT hr;
        STRRET str_curr_connection_name;
        TCHAR curr_connection_name[MAX_PATH] = L"";    /* Connection point name */
        TCHAR desktop_path[MAX_PATH]=L"";            /* Path to desktop */
        TCHAR full_link_name[MAX_PATH]=L"";            /* Full shortcut name */
        LPITEMIDLIST full_pid;                        /* Full shortcut pid */
    
       
        CoInitialize( NULL );
        /* Allocating memory for Namespace objects */
        hr = SHGetMalloc(&pMalloc);
        hr = SHGetFolderLocation(NULL, CSIDL_CONNECTIONS, NULL, NULL, &pidConnections);
    
        /* Get full path to desktop */
        SHGetFolderPath(NULL, CSIDL_DESKTOP, NULL, 0, desktop_path);
    
        hr = SHGetDesktopFolder(&psfDeskTop);
        hr = psfDeskTop->BindToObject(pidConnections, NULL, IID_IShellFolder, (LPVOID *) &pConnections);
        hr = pConnections->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);
    
        /* Loop for searching our connection */
        while(hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
        {
            pConnections->GetDisplayNameOf(pidlItems, SHGDN_INFOLDER, &str_curr_connection_name);
            StrRetToBuf(&str_curr_connection_name, pidlItems, curr_connection_name, MAX_PATH);
            if(!_tcscmp(curr_connection_name,connection_name))
                goto found;
        }
        printf("Connection not found in \"Network connections\" folder.\n");
        return 0;
    found:
        /* Append PIDLs */
        full_pid=Append(pidConnections,pidlItems);
        SetCurrentDirectory(desktop_path);
        if(!CreateShortCut(link_name, full_pid, L"C:\\windows", 0, SW_SHOWNORMAL))
            return 0;
    
        ppenum->Release();
        pMalloc->Free(pidlItems);
        pMalloc->Free(pidConnections);
        pMalloc->Release();
        pConnections->Release();
        CoUninitialize();
        return 1;
    }
    
    bool __fastcall CreateShortCut(LPWSTR pwzShortCutFileName,  LPCITEMIDLIST pidl,
                                   LPTSTR pszWorkingDirectory, WORD wHotKey, int iCmdShow)
    { 
        IShellLink * pSL; 
        IPersistFile * pPF; 
        HRESULT hRes; 
        hRes = CoCreateInstance(CLSID_ShellLink, 0,CLSCTX_INPROC_SERVER, 
                                IID_IShellLink, (LPVOID *)&pSL); 
        if( SUCCEEDED(hRes) ) 
        { 
            hRes=pSL->SetIDList(pidl);
            if(SUCCEEDED(hRes))
            { 
                hRes = pSL->SetHotkey(wHotKey); 
                if( SUCCEEDED(hRes) ) 
                { 
                    hRes = pSL->SetShowCmd(iCmdShow); 
                    if( SUCCEEDED(hRes) ) 
                    { 
                        hRes = pSL->QueryInterface(IID_IPersistFile,(LPVOID *)&pPF); 
                        if( SUCCEEDED(hRes) ) 
                        { 
                            hRes = pPF->Save(pwzShortCutFileName,TRUE); 
                            pPF->Release(); 
                        }
                    }
                }
            }
            pSL->Release(); 
        }
        return SUCCEEDED(hRes); 
    }
    
    /******************************************************************************/
    /* Functions copied from http://msdn.microsoft.com */
    
    LPITEMIDLIST GetNextItemID(LPCITEMIDLIST pidl) 
    { 
       // Check for valid pidl.
       if(pidl == NULL)
          return NULL;
    
       // Get the size of the specified item identifier. 
       int cb = pidl->mkid.cb; 
    
       // If the size is zero, it is the end of the list. 
    
       if (cb == 0) 
          return NULL; 
    
       // Add cb to pidl (casting to increment by bytes). 
       pidl = (LPITEMIDLIST) (((LPBYTE) pidl) + cb); 
    
       // Return NULL if it is null-terminating, or a pidl otherwise. 
       return (pidl->mkid.cb == 0) ? NULL : (LPITEMIDLIST) pidl; 
    } 
    
    /* Get size of PIDL */
    UINT GetSize(LPCITEMIDLIST pidl)
    {
        UINT cbTotal = 0;
        if (pidl)
        {
            cbTotal += sizeof(pidl->mkid.cb);    // Terminating null character
            while (pidl)
            {
                cbTotal += pidl->mkid.cb;
                pidl = GetNextItemID(pidl);
            }
        }
        return cbTotal;
    }
    
    /* Appending PIDLs */
    LPITEMIDLIST Append(LPCITEMIDLIST pidlBase, LPCITEMIDLIST pidlAdd)
    {
        if(pidlBase == NULL)
            return NULL;
        if(pidlAdd == NULL)
            return (LPITEMIDLIST)pidlBase;
        
        LPITEMIDLIST pidlNew;
    
        UINT cb1 = GetSize(pidlBase) - sizeof(pidlBase->mkid.cb);
        UINT cb2 = GetSize(pidlAdd);
    
        pidlNew = (LPITEMIDLIST)pMalloc->Alloc(cb1 + cb2);
        if (pidlNew)
        {
            CopyMemory(pidlNew, pidlBase, cb1);
            CopyMemory(((LPSTR)pidlNew) + cb1, pidlAdd, cb2);
        }
        return pidlNew;
    }


    Для связи [mail]

    • Помечено в качестве ответа Abolmasov Dmitry 29 марта 2012 г. 14:51
    • Снята пометка об ответе Mr.Sanders 2 апреля 2012 г. 7:03
    • Помечено в качестве ответа Mr.Sanders 2 апреля 2012 г. 10:30
    27 марта 2012 г. 11:29
  • При компиляции исправленного варианта возникает ошибка возникает :

    error C3861: _tcscmp: идентификатор не найден

    Я так понял что это из за отсутствия tchar.h

    Но после подключения ошибки при линковки:

    Ошибка	17	error LNK1120: 14 неразрешенных внешних элементов	
    Ошибка	16	error LNK2019: ссылка на неразрешенный внешний символ "extern "C" long __stdcall CoInitialize(void *)" (?CoInitialize@@$$J14YGJPAX@Z) в функции "int __cdecl short_cut_startup(wchar_t *,wchar_t *)" (?short_cut_startup@@$$FYAHPA_W0@Z)	
    Ошибка	15	error LNK2019: ссылка на неразрешенный внешний символ "extern "C" long __stdcall SHGetMalloc(struct IMalloc * *)" (?SHGetMalloc@@$$J14YGJPAPAUIMalloc@@@Z) в функции "int __cdecl short_cut_startup(wchar_t *,wchar_t *)" (?short_cut_startup@@$$FYAHPA_W0@Z)	
    
    Ошибка	14	error LNK2019: ссылка на неразрешенный внешний символ "extern "C" long __stdcall SHGetFolderLocation(struct HWND__ *,int,void *,unsigned long,struct _ITEMIDLIST * *)" (?SHGetFolderLocation@@$$J220YGJPAUHWND__@@HPAXKPAPAU_ITEMIDLIST@@@Z) в функции "int __cdecl short_cut_startup(wchar_t *,wchar_t *)" (?short_cut_startup@@$$FYAHPA_W0@Z)	
    
    Ошибка	13	error LNK2019: ссылка на неразрешенный внешний символ "extern "C" long __stdcall SHGetFolderPathW(struct HWND__ *,int,void *,unsigned long,wchar_t *)" (?SHGetFolderPathW@@$$J220YGJPAUHWND__@@HPAXKPA_W@Z) в функции "int __cdecl short_cut_startup(wchar_t *,wchar_t *)" (?short_cut_startup@@$$FYAHPA_W0@Z)	
    
    Ошибка	12	error LNK2019: ссылка на неразрешенный внешний символ "extern "C" long __stdcall SHGetDesktopFolder(struct IShellFolder * *)" (?SHGetDesktopFolder@@$$J14YGJPAPAUIShellFolder@@@Z) в функции "int __cdecl short_cut_startup(wchar_t *,wchar_t *)" (?short_cut_startup@@$$FYAHPA_W0@Z)	
    
    Ошибка	11	error LNK2019: ссылка на неразрешенный внешний символ "extern "C" void __stdcall CoUninitialize(void)" (?CoUninitialize@@$$J10YGXXZ) в функции "int __cdecl short_cut_startup(wchar_t *,wchar_t *)" (?short_cut_startup@@$$FYAHPA_W0@Z)	
    
    Ошибка	10	error LNK2019: ссылка на неразрешенный внешний символ "extern "C" long __stdcall CoCreateInstance(struct _GUID const &,struct IUnknown *,unsigned long,struct _GUID const &,void * *)" (?CoCreateInstance@@$$J220YGJABU_GUID@@PAUIUnknown@@K0PAPAX@Z) в функции "bool __stdcall CreateShortCut(wchar_t *,struct _ITEMIDLIST const *,wchar_t *,unsigned short,int)" (?CreateShortCut@@$$FYG_NPA_WPBU_ITEMIDLIST@@0GH@Z)	
    
    Ошибка	9	error LNK2028: ссылка на неразрешенную лексему (0A000074) "extern "C" long __stdcall SHGetDesktopFolder(struct IShellFolder * *)" (?SHGetDesktopFolder@@$$J14YGJPAPAUIShellFolder@@@Z) в функции "int __cdecl short_cut_startup(wchar_t *,wchar_t *)" (?short_cut_startup@@$$FYAHPA_W0@Z)	
    
    Ошибка	8	error LNK2028: ссылка на неразрешенную лексему (0A000070) "extern "C" long __stdcall CoCreateInstance(struct _GUID const &,struct IUnknown *,unsigned long,struct _GUID const &,void * *)" (?CoCreateInstance@@$$J220YGJABU_GUID@@PAUIUnknown@@K0PAPAX@Z) в функции "bool __stdcall CreateShortCut(wchar_t *,struct _ITEMIDLIST const *,wchar_t *,unsigned short,int)" (?CreateShortCut@@$$FYG_NPA_WPBU_ITEMIDLIST@@0GH@Z)	
    
    Ошибка	7	error LNK2028: ссылка на неразрешенную лексему (0A00006A) "extern "C" void __stdcall CoUninitialize(void)" (?CoUninitialize@@$$J10YGXXZ) в функции "int __cdecl short_cut_startup(wchar_t *,wchar_t *)" (?short_cut_startup@@$$FYAHPA_W0@Z)	
    
    Ошибка	6	error LNK2028: ссылка на неразрешенную лексему (0A000044) "extern "C" long __stdcall CoInitialize(void *)" (?CoInitialize@@$$J14YGJPAX@Z) в функции "int __cdecl short_cut_startup(wchar_t *,wchar_t *)" (?short_cut_startup@@$$FYAHPA_W0@Z)	
    	
    Ошибка	5	error LNK2028: ссылка на неразрешенную лексему (0A00003A) "extern "C" long __stdcall SHGetFolderPathW(struct HWND__ *,int,void *,unsigned long,wchar_t *)" (?SHGetFolderPathW@@$$J220YGJPAUHWND__@@HPAXKPA_W@Z) в функции "int __cdecl short_cut_startup(wchar_t *,wchar_t *)" (?short_cut_startup@@$$FYAHPA_W0@Z)	
    
    Ошибка	4	error LNK2028: ссылка на неразрешенную лексему (0A000035) "extern "C" long __stdcall SHGetMalloc(struct IMalloc * *)" (?SHGetMalloc@@$$J14YGJPAPAUIMalloc@@@Z) в функции "int __cdecl short_cut_startup(wchar_t *,wchar_t *)" (?short_cut_startup@@$$FYAHPA_W0@Z)	
    
    Ошибка	3	error LNK2028: ссылка на неразрешенную лексему (0A000027) "extern "C" long __stdcall SHGetFolderLocation(struct HWND__ *,int,void *,unsigned long,struct _ITEMIDLIST * *)" (?SHGetFolderLocation@@$$J220YGJPAUHWND__@@HPAXKPAPAU_ITEMIDLIST@@@Z) в функции "int __cdecl short_cut_startup(wchar_t *,wchar_t *)" (?short_cut_startup@@$$FYAHPA_W0@Z)	
    

    :) ищу решение


    2 апреля 2012 г. 7:17
  • Не указаны в линковщике библиотеки содержащие данные функции.

    Пройдитесь по этим функциям, посмотрите в документиции какие lib файлы необходимы, например для CoInitialize нужна Ole32.lib, для SHGetFolderLocation - Shell32.lib.

    Эти данные указаны внизу в описании функции (раздел Requirements - Library).


    Для связи [mail]

    • Помечено в качестве ответа Mr.Sanders 2 апреля 2012 г. 10:03
    2 апреля 2012 г. 9:42
  • Дмитрий огромное спасибо все заработало, извените что я вас замучил можно считать что всю программу за меня вы написали :), еще раз огромное спасибо.
    2 апреля 2012 г. 10:04