Как передать аргумент, используя функцию IShellLink :: SetPath - PullRequest
2 голосов
/ 13 февраля 2012

Я использую эту программу на C на win32, чтобы изменить цель ярлыка с
["C: \ Program Files \ YP \ YPseries \ Bin \ myexe.exe"] до
["C: \ Program Files \ YP \ YPseries \ Bin \ myexe.exe" - запустить UDCDevicePage]
исключая квадратные скобки.

Однако, когда я использую
WCHAR newTargetPath [] = L "\" C: \ Program Files \ YP \ YP series \ Bin \ myexe.exe \ "-Start UDCDevicePage";
в основном SetPath возвращает код ошибки E_INVALIDARG.

Как передать аргумент myexe с помощью функции IShellLink :: SetPath?

Программа приведена ниже:

HRESULT changeLinkTarget(LPCSTR pathLink, LPWSTR newTargetPath) 
{ 
    HRESULT hres; 
    IShellLink* psl; 
    WCHAR szGotPath[MAX_PATH]; 
    WIN32_FIND_DATA wfd; 

    // Get a pointer to the IShellLink interface.
    hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl); 
    if (SUCCEEDED(hres)) 
    { 
        IPersistFile* ppf; 
        // Get a pointer to the IPersistFile interface. 
        hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf); 

        if (SUCCEEDED(hres)) 
        { 
            WCHAR wsz[MAX_PATH]; 
            // Ensure that the string is Unicode. 
            MultiByteToWideChar(CP_ACP, 0, pathLink, -1, wsz, MAX_PATH); 

            // Load the shortcut. 
            hres = ppf->Load(wsz, STGM_READ); 

            if (SUCCEEDED(hres)) 
            { 
                // Get the path to the link target. 
                hres = psl->GetPath(szGotPath, MAX_PATH, (WIN32_FIND_DATA*)&wfd, SLGP_SHORTPATH); 

                if (SUCCEEDED(hres))
                {
                    hres = psl->SetPath(newTargetPath);
                    hres = ppf->Save(wsz, TRUE); //save changes
                }
                else
                {
                    // Handle the error
                }

            } 
            // Release the pointer to the IPersistFile interface. 
            ppf->Release(); 
        } 
        // Release the pointer to the IShellLink interface. 
        psl->Release(); 
    } 
    return hres; 
}



int _tmain(int argc, _TCHAR* argv[])
{
    char linkPath[128] = "C:\\Users\\Public\\Desktop\\YP  series.lnk";
    WCHAR newTargetPath[] = L"\"C:\\Program Files\\YP\\YP  series\\Bin\\myexe.exe\" -Start UDCDevicePage";

    CoInitialize(NULL); // initialize the COM subsystem
    HRESULT ret = changeLinkTarget(linkPath, newTargetPath);


    return 0;
}

1 Ответ

3 голосов
/ 13 февраля 2012

Пути, как правило, просто exe;вы, кажется, пытаетесь установить путь для исполняемого файла с некоторыми аргументами командной строки.Попробуйте вместо этого использовать SetPath только для exe - без дополнительных кавычек - и используйте IShellLink :: SetArguments () для параметров командной строки.SetPath, возможно, пытается проверить параметр, проверив, существует ли exe-файл с именем полной строки, которую вы передаете, и которая, вероятно, завершится с ошибкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...