• ベストアンサー

ショートカットファイルのリンク先がほしい

void main(int argc,char *argv[]) { ....... fp=fopen(argv[1],"w+"); ....... } によってexeファイルをつくり このexeファイルにショートカットファイルをドラッグしてのショートカットフィルのリンク先ファイルを操作したいのですが argv[1]にはショートカットファイルのリンク先のファイルパスが入らずに ショートカットファイル(.LNK)自身のパスが入ってしまうために リンク先ファイルを操作できません どのようにしてプログラム上でリンク先パスを得ることができますか?

  • nubou
  • お礼率62% (293/470)

質問者が選んだベストアンサー

  • ベストアンサー
noname#30727
noname#30727
回答No.1

COM は説明が大変なので、簡単なものを作ってみました。 OLE32.LIB を一緒にリンクして試してみてください。 IPersistFile::Load の第1引数は LPCOLESTR で、これは単なる UNICODE 文字列なので、MultiByteToWideChar 以外に適当なものがあれば、それを使用してください。 #include <windows.h> #include <shlobj.h> #include <stdio.h> char *GetLink(const char *path, char *link, int size) { IShellLink* sl = NULL; IPersistFile* pf = NULL; char* addr = NULL; WCHAR buff[MAX_PATH]; HRESULT hr; hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&sl); if (SUCCEEDED(hr)) { hr = sl->QueryInterface(IID_IPersistFile, (void**)&pf); if (SUCCEEDED(hr)) { MultiByteToWideChar(CP_ACP, 0, path, -1, buff, MAX_PATH); hr = pf->Load(buff, STGM_READ); if (SUCCEEDED(hr)) { hr = sl->GetPath(link, size, NULL, 0); } else { lstrcpyn(link, path, size); } addr = link; } } if (pf) { pf->Release(); } if (sl) { sl->Release(); } return addr; } int main(int argc, char *argv[]) { char link[MAX_PATH]; if (argc != 2) { printf("引数を1つ指定してください\n"); return 0; } CoInitialize(NULL); if (GetLink(argv[1], link, MAX_PATH)) { printf("LINK=%s\n", link); } else { printf("失敗しました\n"); } CoUninitialize(); return 0; }

nubou
質問者

補足

ありがとうございます Borland5.5でコンパイルして動作を確認しました ショートカットのリンク先は表示されるようです ショートカットのデータ構造がどうなっているか教えていただければ幸いです

関連するQ&A

  • ExcelVBA ショートカットファイルからリンク先を取り出す

    こんにちは! 「.lnk」などのショートカットファイルからリンク先のパスを取り出したいのですが、どうやればいいのでしょうか? エクセルシートのセル上に、ショートカットファイルのパスが書いてあります

  • 任意のファイルを別のファイルにコピーするプログラム。

    コマンドラインからコピー元、コピー先ファイル名を指定してファイルをコピーするプログラムなんですが… #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { FILE *fp; if ((fp = fopen(argv[0],"r") == NULL){ printf("ファイル%sが存在しません。\n",argv[0]);exit(-1); } if ((fp = fopen(argv[1],"w") == NULL){ printf("ファイル%sがコピーできません。\n",argv[1]);exit(-1); } fclose(fp); } どこか間違っているところがあるでしょうか? ありましたら詳しく教えてもらえると幸いです。 少し自信がないのでわかる方はよろしくおねがいします。

  • エラーが出ます

    12,51,13,123,133,551,… というコンマで区切られているファイルを読み込みたいです。数字は100文字です。どう書けば全部読み込めるでしょうか? よろしくお願いします。 int main(int argc,char *argv[ ]){ int line; int i; FILE *fp; fp = (argc > 1)? fopen(argv[1],"r"): stdin; if(fp==NULL){ perror("fopen"); exit(0); }   while(fscanf(fp,"%d",&line) != EOF){ printf("%d\n") } if(argc>1){ fclose(fp);   }

  • ショートカットのリンク先の記述

    リムーバブルディスクにフォルダを作って、そこにexeファイルを置きました。そのexeファイルのショートカットを作り、リムーバブルディスクのルートに置いています。 これをWクリックしてプログラムを起動させたいのですが、環境が変わると、リムーバブルディスクのドライブ名が変わるので、ショートカットのリンクが切れてしまいます。ショートカットのリンク先を書き直すのも面倒です。記述法を変えることで解決できますか? ドライブ名を削除したら、「リンク先が不正」となってしまいました。

  • ショートカットのリンク先と作業用フォルダ

    こんにちは。Windows XPのショートカットについてお教え下さい。 ショートカットを見ると「リンク先」というものと「作業用フォルダ」というものがあります。 「リンク先」は大元のファイルのパスが書かれているのはわかります。 よくわからないのが、リンク先に、 "C:\Program Files\UWSC.exe" "C:\Documents and Settings\test\デスクトップ\test.uws" "メモ帳" "おはよう<#TAB>元気してた?<#CR>" といったリンクが書かれていた場合は、何を表しているのでしょうか? また、「作業用フォルダ」も何をするところかわかりません。 平たく言うとどういったことに使うのでしょうか?

  • ファイルの出力先がうまく指定できません。。

    今、ファイルの出力先を変更させたいと思っていて、 調べたところ、fp=fopen("フォルダ名/test.txt","wb") のようにすればよい、というところまでは調べたのですが、 私の場合、ファイル名を、filenameというchar型の変数に入れており、 fp=fopen(filename,"wb")となってます。 これを、fp=fopen("フォルダ名/filename","wb")としてみたのですが、 これではダメでした。 ファイル名の入っている変数はそのまま使いたいのですが、 それでパス指定をする方法ありますでしょうか?

  • ファイル操作

    あるファイルから長さの違った数字や文字を読み込んで配列に格納したいのですが数字などの長さが違うとなんかおかしくなってしまいます; 例えば 1 a 1 2 a 2 3 b 3 4 b 4 などのファイルはできるのですが 0 1 2 3 a 3 4 b 4 5 c 5 の場合5つの配列に格納したいのです。1行目で1つ2行目で1つ3行目の 左、真ん中、右の数字でそれぞれ1つづつ格納したいのです。 それで自分でやったのですが typedef struct path{ int left [100]; int right[100]; char center [100]; }Path; int main(int argc,char *argv[]) { FILE *fp; Path path; int i=0; int first; int second[100]; fp = fopen(argv[1],"r"); while(fscanf(fp,"%d %c %d",&path.left[i],&path.center[i],&path.right[i])==3){ i++; } fclose(fp); このようにやると3行目からはきちんとよみこむのですが1、2行目がうまくできません@@; firstとsecondのそれぞれ1、2行目を入れたいのです。 fscanfをもう1つ増やすしてもやってみましたがうまくいきませんでした。 ちなみにfscanf関数のところをならったばかりです。 fgetcとかそのようなのを使うのでしょうか?(よくわからないですけど) よろしくお願いします。ちなみにLinuxでgcc、C言語です。

  • ショートカットのリンク先について。

    スタートアップにある、Microsoft Officeのショートカットですが、 リンク先がCD-ROMになってしまったので C:\Program Files\Microsoft Office\Office\OSA9.exe" -b -l に変更したいのですが、OKを押すと 「受け側に指定されたパス名'C:\Program'は無効です。パスとファイル名が正しいか確認してください。」 というエラーメッセージが出てしまい、変更できません。 恐らくフォルダ名にある半角スペースが原因なのかと思いますが、 どうすればいいのでしょうか?

  • ショートカットファイルそのものを開く方法は?

    ショートカットファイル(.lnk)の構造を見たいので、バイナリエディタ(Stirling)で開こうとしたのですが、 どうやって指定しても、リンク先ファイルが開いてしまいます。 一回だけ成功して.lnkファイルそのもの開くことが出来たのですが、また出来なくなってしまいました。 本格的に分析するわけではないので、とりあえず秀丸で無理やり開ければ、とも思ったのですがそれも不可能でした。 .lnkファイル自体を開く方法を教えて下さい。

  • ファイルコピープログラムについて

    まだC言語とか始めたばかりであまりよく分からないのですが、 今、ドラッグしたファイルをデスクトップにコピーするプログラムを作成してるのですが、少し困ったことになりました・・・・ 一応ファイルのコピーをデスクトップに作成はできるのですが、 何故か、作成されたファイルのサイズが2バイト程大きくなります・・・。 ファイルサイズを変えずにコピーする方法が分かりません・・・ ソースを張っておきますので、誰か解決策を教えていただけないでしょうか? #include <stdio.h> #include <windows.h> int main(int argc,char *argv[]) { FILE *fp,*copy; int buf; if(argc>1){ rename(argv[1],"DATA.bin"); fp=fopen("DATA.bin","rb"); copy=fopen("c:/xxx/yyy/Desktop/COPY.bin","wb"); while(1){ fread(&buf,sizeof(buf),1,fp); fwrite(&buf,sizeof(buf),1,copy); if(feof(fp)){ puts("OK"); fclose(fp); fclose(copy); rename("DATA.bin",argv[1]); rename("COPY.bin",argv[1]); exit(1); } } } return 0; }

専門家に質問してみよう