添付ファイルの保存No.15835
marshside さん 03/12/21 17:50
 
 Windows98でVersion3.06を使用しています。
 添付ファイルを保存するとき、ドラッグ&ドロップではなく
右クリックメニューから保存を選択してダイアログを開く場合に、
フォルダを指すショートカットを選ぶとそれをフォルダと認識
せずに「(ショートカット名).lnk」いう名前で保存しようと
してしまいます。
 WindowsXPの環境だと同様の手順でショートカットでもフォルダと
認識されるようです。

[ ]
RE:15835 添付ファイルの保存No.15853
秀まるお2 さん 03/12/22 15:41
 
 調べてみたら、OFN_NOVALIDATEというフラグを指定すると、Windows98の場合
にダイアログボックスがうまく動作しなくなるようです。

 OFN_NOVALIDATEを指定しないでおくと、必ず何らかのファイル名を入力しない
といけなくなり、現状でのファイル名無しでOKできる作りが不便な方向に修正さ
れることになります。

 なんとかうまく回避できるかどうか、フックプロシージャをいじってみます。

[ ]
RE:15853 添付ファイルの保存No.15854
秀まるお2 さん 03/12/22 16:16
 
 とりあえず、.lnkだったらOKできないような作りには出来ましたが、.lnkファ
イルの差している先のフォルダへ移動する処理を作っていて挫折しました。

 .lnkファイル(のファイル名)からフォルダ名を一発で取り出す簡単な方法が
あったらうれしいんですが…。IPersistFileやらIShellLinkやらという処理を書
いていて挫折しました。

 ということで、現状の仕様のままとさせていただきます。

[ ]
RE:15854 添付ファイルの保存No.15863
秀まるお2 さん 03/12/22 19:21
 
 っとコメントしつつ、さらに別の方法で、なんとか適当に対処できました。

 OFN_NOVALIDATEのフラグの指定をやめて、代わりにダイアログボックスのフッ
クプロシジャでWM_COMMANDのIDOKが来たら、その時点でファイル名が空であれば、
適当に文字列を入れて無理矢理OKされるようにしました。

 ということで、次のV3.07β34からそういうことでうまく動くようになる予定
とさせていただきます。

[ ]
RE:15863 添付ファイルの保存No.15864
MAKOPI さん 03/12/22 19:34
 
こんにちは。MAKOPIです。

> .lnkファイル(のファイル名)からフォルダ名を一発で取り出す簡単な方法が
>あったらうれしいんですが…。IPersistFileやらIShellLinkやらという処理を書
>いていて挫折しました。
>

いまさらですが、以下みたいな感じでどうですか?
------

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow )
{
 char szPath[MAX_PATH];
 GetFilePathForShortCut(NULL, "C:\\Temp\\HOGEへのショートカット.lnk",szPath,
MAX_PATH);
 return 0;
}

//// ショートカットファイルが指すパス取得関数
#include <shlobj.h>
HRESULT GetFilePathForShortCut(HWND hWnd,      // in  :ウィンドウハンドル
          LPCTSTR lpszShortcutFilePath, // in  :ショートカットファイルパス
          LPTSTR pszFilePath,    // out :ショートカットが示すファイルパス
          int nFilePathBufSize )   // out :pszFilePathのサイズ
{
 HRESULT   hres;
 IShellLink  *psl;
 WORD   wsz[MAX_PATH];   // Unicode String
 WIN32_FIND_DATA wfd;
 
 // Initilize COM(どこかでやっていれば必要なし)
 ::CoInitialize(NULL);

    // IShellLink インターフェースの取得
 hres = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
         IID_IShellLink, (void **)&psl);
 if(SUCCEEDED(hres))
 {
  IPersistFile *ppf;
 
  // IPersistFile インターフェースの取得
  hres = psl->QueryInterface(IID_IPersistFile, (void **)&ppf);
  if(SUCCEEDED(hres))
  {
   // Unicodeに変換
   ::MultiByteToWideChar(CP_ACP, 0, lpszShortcutFilePath, -1, wsz, MAX_PATH);

   // ショートカットファイルのロード
   hres = ppf->Load(wsz, STGM_READ);
   if(SUCCEEDED(hres))
   {
    // ショートカットの解決
    hres = psl->Resolve(hWnd, SLR_ANY_MATCH);
    if(SUCCEEDED(hres))
    {
     // ショートカットの指す、ファイルおよびフォルダのフルパス取得
     hres = psl->GetPath(pszFilePath, nFilePathBufSize,
          (WIN32_FIND_DATA *)&wfd, 0 /*SLGP_SHORTPATH*/ );
    }
   }
   ppf->Release();   // IPersistFileの開放
  }
  psl->Release();    // IShellLinkの開放
 }
 return hres;
}

[ ]
RE:15864 添付ファイルの保存No.15873
秀まるお2 さん 03/12/23 04:20
 
 わざわざありがとうございます。

 IShellLinkのインスタンスを生成してからIPersistFileをQueryInterfaceすれ
ばよかったんですね。僕は逆順じゃないと駄目かと思って、CLSID_PersistFile
でCoCreateInstanceしようとして挫折してしまいました。

 (古いプログラマーなのでOLE2関係は苦手です)

[ ]
RE:15873 添付ファイルの保存No.15877
marshside さん 03/12/23 11:36
 
秀まるお2さん、MAKOPIさん
対応ありがとうございます。お待ちしております。

[ ]