2012-02-13 2 views
1

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

Однако, когда я использую
WCHAR newTargetPath [] = L "\" C: \ Program Files \ YP \ YP серии \ 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; 
} 

ответ

2

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

+0

Благодарим вас, Брендан за то, что нашли время, чтобы ответить на этот вопрос. – Martin

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

  • Нет связанных вопросов^_^