1

アイコンのあるリンクをWindows7で作成しようとしています。これにはJNAライブラリを使用しています。CoCreateInstanceの呼び出しに問題があります。エラーを返します。まず、IShellLinkのGUIDが正しいかどうかわかりません(私はWindowsプログラマーではありません)。以下はこれまでの私のコードです。IShellLinkへのポインターを取得したら、リンクのパラメーター(ターゲット、アイコン、説明など)を入力する必要があります。このリンク( http://www.codeproject.com/Articles/11467/How-to-create-short-cuts-link-files )にある以下のCコードからこの呼び出しをモデル化しています。これにmklinkコマンドを使用できることは知っていますが、アイコンと説明を追加するオプションがあります。

private void createLink(){
    Pointer reserved = null; //Must be null
    int dwCoInit = 0;

    HRESULT oleInitResult = Ole32.INSTANCE.CoInitializeEx(reserved,dwCoInit);
    if(oleInitResult.equals(W32Errors.S_OK)){
        GUID rclsid = Ole32Util.getGUIDFromString("{e82a2d71-5b2f-43a0-97b8-81be15854de8}"); //Shell object
        GUID riid = Ole32Util.getGUIDFromString("{000214EE-0000-0000-C000-000000000046}"); //CLSID of the IShellLink object
        PointerByReference ppv = new PointerByReference();
        HRESULT oleCreateResult = Ole32.INSTANCE.CoCreateInstance(rclsid,null,ObjBase.CLSCTX_INPROC,riid,ppv);
        if(oleCreateResult.equals(W32Errors.S_OK)){

        }else{
            System.out.println("Failed to create link error "+oleCreateResult.intValue());
        }
    }
    Ole32.INSTANCE.CoUninitialize();
}
######################C++サンプルコード
/*
--------------------------------------------------------------------------------
Description: Creates the actual 'lnk' file (assumes COM has been initialized).
Parameters: pszTargetfile    - File name of the link's target, must be a non-empty string.
pszTargetargs    - Command line arguments passed to link's target, may be an empty string.
pszLinkfile      - File name of the actual link file, must be a non-empty string.
pszDescription   - Description of the linked item. If this is an empty string the description is not set.
iShowmode        - ShowWindow() constant for the link's target. Use one of:
                       1 (SW_SHOWNORMAL) = Normal window.
                       3 (SW_SHOWMAXIMIZED) = Maximized.
                       7 (SW_SHOWMINNOACTIVE) = Minimized.
                     If this is zero the showmode is not set.
pszCurdir        - Working directory of the active link. If this is an empty string the directory is not set.
pszIconfile      - File name of the icon file used for the link.  If this is an empty string the icon is not set.
iIconindex       - Index of the icon in the icon file. If this is < 0 the icon is not set.
Returns: HRESULT value >= 0 for success, < 0 for failure.
--------------------------------------------------------------------------------
*/
static HRESULT CreateShortCut(LPSTR pszTargetfile, LPSTR pszTargetargs, LPSTR pszLinkfile, LPSTR pszDescription, 
int iShowmode, LPSTR pszCurdir, LPSTR pszIconfile, int iIconindex) {
HRESULT       hRes;                  /* Returned COM result code */
IShellLink*   pShellLink;            /* IShellLink object pointer */
IPersistFile* pPersistFile;          /* IPersistFile object pointer */
WORD          wszLinkfile[MAX_PATH]; /* pszLinkfile as Unicode string */
int           iWideCharsWritten;     /* Number of wide characters written */
hRes = E_INVALIDARG;
if (
       (pszTargetfile != NULL) && (strlen(pszTargetfile) > 0) &&
       (pszTargetargs != NULL) &&
       (pszLinkfile != NULL) && (strlen(pszLinkfile) > 0) &&
       (pszDescription != NULL) && 
       (iShowmode >= 0) &&
       (pszCurdir != NULL) && 
       (pszIconfile != NULL) &&
       (iIconindex >= 0)
) {
    hRes = CoCreateInstance(&CLSID_ShellLink,     /* pre-defined CLSID of the IShellLink object */
                            NULL,                 /* pointer to parent interface if part of aggregate */
                            CLSCTX_INPROC_SERVER, /* caller and called code are in same process */
                            &IID_IShellLink,      /* pre-defined interface of the IShellLink object */
                            &pShellLink);         /* Returns a pointer to the IShellLink object */
    if (SUCCEEDED(hRes))
    {
      /* Set the fields in the IShellLink object */
      hRes = pShellLink->lpVtbl->SetPath(pShellLink, pszTargetfile);
      hRes = pShellLink->lpVtbl->SetArguments(pShellLink, pszTargetargs);
      if (strlen(pszDescription) > 0)
      {
        hRes = pShellLink->lpVtbl->SetDescription(pShellLink, pszDescription);
      }
      if (iShowmode > 0)
      {
        hRes = pShellLink->lpVtbl->SetShowCmd(pShellLink, iShowmode);
      }
      if (strlen(pszCurdir) > 0)
      {
        hRes = pShellLink->lpVtbl->SetWorkingDirectory(pShellLink, pszCurdir);
      }
      if (strlen(pszIconfile) > 0 && iIconindex >= 0)
      {
        hRes = pShellLink->lpVtbl->SetIconLocation(pShellLink, pszIconfile, iIconindex);
      }

      /* Use the IPersistFile object to save the shell link */
      hRes = pShellLink->lpVtbl->QueryInterface(pShellLink,        /* existing IShellLink object */
                                                &IID_IPersistFile, /* pre-defined interface of the IPersistFile object */
                                                &pPersistFile);    /* returns a pointer to the IPersistFile object */
      if (SUCCEEDED(hRes))
      {
        iWideCharsWritten = MultiByteToWideChar(CP_ACP, 0, pszLinkfile, -1, wszLinkfile, MAX_PATH);
        hRes = pPersistFile->lpVtbl->Save(pPersistFile, wszLinkfile, TRUE);
        pPersistFile->lpVtbl->Release(pPersistFile);
      }
      pShellLink->lpVtbl->Release(pShellLink);
    }

  }
  return (hRes);
}
4

2 に答える 2

2

それは非常に単純であることがわかりました。したがって、このページにアクセスすると、次の手順に従って数日節約できます。com4jサイトの手順に従ってshell32.dllのマッピングを生成します。http://com4j.java.net/tutorial.html 次に 、次のコマンドを呼び出します。アイコンを作成します。一度知ってしまえばとても簡単です。

IWshShell3 shellLink = ClassFactory.createWshShell();
Com4jObject obj =  shellLink.createShortcut(linkPath.getAbsolutePath());
IWshShortcut link = obj.queryInterface(IWshShortcut.class);
link.workingDirectory(desktopPath.getAbsolutePath());
link.description("My Link");
link.arguments(" Hello ");
link.iconLocation(iconPath.getAbsolutePath());
link.targetPath(javawsPath.getAbsolutePath());
link.setName("Test Link");
link.save();
于 2013-02-12T18:39:07.347 に答える
0

GUIDを変更することで、CoCreateInstanceへの呼び出しを修正しました。以下はコードで、OKを返します。しかし、ポインタを取得したので、必要なパラメータ(リンク名、ターゲット名、説明、アイコン)を設定する方法がわかりません。誰か提案がありますか?

GUID rclsid = Ole32Util.getGUIDFromString("{00021401-0000-0000-C000-000000000046}"); //CLSID_ShellLink 
if (W32Errors.FAILED(hr.intValue())) { 
    Ole32.INSTANCE.CoUninitialize(); 
    throw new Exception("Shell Object GUID failed."); 
}       
GUID riid = Ole32Util.getGUIDFromString("{000214EE-0000-0000-C000-000000000046}"); //CLSID of the IShellLink object
PointerByReference ppv = new PointerByReference();
hr = Ole32.INSTANCE.CoCreateInstance(rclsid,null,WTypes.CLSCTX_LOCAL_SERVER,riid,ppv);
if(hr.equals(W32Errors.S_OK)){
    Pointer type = ppv.getValue();

}else{
    System.out.println("Failed to create link error "+hr.intValue());
}
于 2013-02-05T19:58:52.530 に答える