システムの特殊なフォルダのパス名の取得方法

このQ&Aのポイント
  • VC++2008 Express EditionでSHGetSpecialFolderPathを使ってシステムの特殊なフォルダのパス名を取得する方法について調査したが、結果が常に「C」しか取得できない問題が発生している。
  • 質問者はネット上の例を参考にしてソースコードを書いたが、どの場所のパスを取っても結果が「C」しか返ってこない。
  • 原因が何であるかについて質問者は不明であり、質問者は解決策を求めている。
回答を見る
  • ベストアンサー

システムの特殊なフォルダのパス名の取得を取得しようとしています。

システムの特殊なフォルダのパス名の取得を取得しようとしています。 VC++2008 Express EditionでSHGetSpecialFolderPathをつかって パスを取ってみようとネット上の例だから拝借して 下記のようなソースを書いてみたのですが、 出てくる結果が、どの場所のパスをとっても「C」しか出てこないのです。 これってなにが原因なのでしょうか? どなたかお教え願えないでしょうか? [ソース] #include<stdio.h> #include<shlobj.h> int main(){ TCHAR buf[_MAX_PATH]; SHGetSpecialFolderPath(NULL, buf, CSIDL_DESKTOPDIRECTORY, FALSE); printf("デスクトップのパスは %s です\n",buf); return 0x00; }

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

プロジェクトの文字セットはどうなっています? UNICODEで取得していてMBCSでprintf()していた場合、最初の1文字しか表示されないかと思いますが。 printf("デスクトップのパスは %s です\n",buf); を _tprintf(_T("デスクトップのパスは %s です\n"),buf) としてみたらどうですか?

yxia001
質問者

お礼

有難う御座います。 文字セットがおかしかったようです。 マルチバイト文字セットではなく、unicode文字セットにしていたために 表示されませんでした。 とりあえず、問題解決できました。

その他の回答 (1)

回答No.2

printfの書式が違うのでは? Unicode文字セットを使うにしている場合、TCHAR は wchar_t になりますので、 %S を指定することになります。 printf 関数の型フィールド文字 http://msdn.microsoft.com/ja-jp/library/hf4y5e3w.aspx それと、もしかしたらsetlocaleも必要かも。

関連するQ&A

  • ショートカットからフルパスを取得する方法について

    こちら【http://www.kab-studio.biz/Programing/Codian/ShellExtension/09.html】のサイトを参考にしてショートカットからアプリ実行ファイルのフルパスを取得しようとしています。開発環境はMicrosoft Visual Studio 2010です。 以下のソースで特にエラーなく実行はできるのですが、アプリによっては取得できないものがあります。 デスクトップにあるショートカットアイコンですべて動作テストを行っています。 Janetter.lnk、Microsoft Visual Studio 2010.lnk、MetasequoiaLER3.0.lnk、Microsoft Office Word 2007.lnk の四つを試しました。 JanetterとVisualStudioはフルパスが問題なく取得でき、アドレスをたどってアイコンをダブルクリックしてみるとアプリが起動できます。 Metasequoiaは全く取得できず、wordはC:\windows\Installer\{90120000-0011-0000-0000000FF1CE}}\wordicon.exeを取得しました。 アドレスをたどり、wordicon.exeをダブルクリックして起動しようとしてもwordを起動することはできませんでした。 アプリによって取得できるものとできないものの差は何なのでしょうか? どうすればすべての実行ファイルのフルパスを取得できるでしょうか、アドバイスを頂けると助かります。 #include <windows.h> #include <shlobj.h> #include <iostream> #include <string> IShellLink *pShellLink; //IShellLinkへのポインタ IPersistFile *pPersistFile; //IPersistFileへのポインタ bool getLnk(){ HRESULT hRes;//結果 //メンバの初期化 pShellLink = NULL; pPersistFile = NULL; //OLE【 Object Linking and Embedding 】アプリケーションソフト間でデータを転送・共有するための仕組み //OLEを使うために初期化 hRes = ::CoInitialize(NULL); //エラー対処 if(hRes == E_OUTOFMEMORY) return false; if(hRes == E_INVALIDARG) return false; if(hRes == E_UNEXPECTED) return false; // 空のインターフェイスを用意 // ファイル情報の格納場所の確保 hRes = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink,(LPVOID *)&pShellLink); //エラー対処 if(hRes == CLASS_E_NOAGGREGATION) return false; if(hRes == REGDB_E_CLASSNOTREG) return false; //IPersistFileへのポインタを取得 IShellLinkの操作に必要 hRes = pShellLink->QueryInterface(IID_IPersistFile,(LPVOID*)&pPersistFile); //エラー対処 if(hRes != S_OK) return false; return true; } bool UngetLnk(){ //IPersistFileへのポインタの破棄 if(pPersistFile != NULL) pPersistFile->Release(); //IShellLinkへのポインタの破棄 if(pShellLink != NULL) pShellLink->Release(); ::CoUninitialize(); return true; } bool LinkLoad(LPCTSTR lnkpass){ HRESULT hRes; // 結果 OLECHAR ochLinkFile[MAX_PATH]; //ユニコードに変換 ::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,lnkpass,-1,ochLinkFile,MAX_PATH); //ショートカットファイルの読み込み hRes = pPersistFile->Load(ochLinkFile,STGM_READ); if(hRes != S_OK) return false; //リンクの決定 ショートカットの読み込み hRes = pShellLink->Resolve(NULL,SLR_UPDATE); if(hRes != NOERROR) return false; return true; } int main(){ LPCTSTR lnkpath="C:\\Users\\Momo\\Desktop\\Microsoft Office Word 2007.lnk"; LPSTR fullpath; char x[100]; fullpath = x; if(getLnk()){ LinkLoad(lnkpath); pShellLink->GetPath(fullpath, _MAX_PATH, NULL, 0); UngetLnk(); std::cout << fullpath << std::endl; }else std::cout << "false" << std::endl; return 0; }

  • 何処が間違っていますか?

    ---------------------------------------------------------------------------------------- #include<stdio.h> #include<stdlib.h> #define MAX_LINE 128 int main(void); int main(void) { char buf[MAX_LINE]; int n; printf("降水確率を入力してください。\n"); gets(buf); n = atoi(buf); printf("降水確率は %d %% です。\n",n); if (n >= 50) { printf("傘を忘れずにね。\n"); } else { printf(傘はいりません。\n"); } printf("いってらっしゃい。\n"); return(0); }

  • intとlongは同じ?

    #include <stdio.h> #include <limits.h> int main() { printf("%d\n%d", INT_MAX, LONG_MAX); return 0; } 出力 214783647 214783647 Win7 64bit (VC++2010) CentOS 32bit (gcc) どちらの環境でも同じ出力結果となりました。 intとlongなぜ同じになってしまったのでしょうか。

  • 教えてください

    なんども見直してもエラーになります。ソースのおかしいところ教えてください。 #include <stdio.h> #include <time.h> #include <stdlib.h> main () { int computer; printf("【ジャンケンゲーム】\n"); srand(time(NULL)); //乱数の種をまく   computer = rand()%3 + 1; printf("コンピューターは %d", computer); return 0; }

  • コンパイルできない

    c言語をはじめたばかりの初心者です。"typ.c"というソースファイルをメモ帳でつくって、コマンドプロンプト上でコンパイルしようとしたのですが、うまくいきませんでした。typ.cファイルの内容は *typ.c*/ #include <stdio.h> #include <stdlib.h> /*for exit()*/ int main(void) { FILE *fin, *fout; char buf[256]; char filename1[80], filename2[80]; printf("入力ファイル名="); gets(filename1); printf("出力ファイル名="); gets(filename2); fin = fopen(filename1, "r"); if (fin == NULL){ printf("%sをオープンできません\n", filename1); exit(1); } fout = fopen(filename2, "w"); if (fout == NULL){ printf("%sをオープンできません\n", filename2); exit(1); } while (fgets(buf, 256, fin) != NULL){ fputs(buf, fout); } fclose(fin); fclose(fout); return 0; } となっています。 いざコマンドプロンプト上でコンパイルしようとすると  C:Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\stdio.h(189) : error C20 27: 認識できない型'PostAttribute'が使れています。 c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(71) : 'PreAttribute'の宣言を確認してください。 という注意書きが大量にでてきて最後に C:Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\stdio.h(239) : fatal err or C1003: プログラム内のエラーが100個を超えました。コンパイルは中断されます。                         となってしまいます。 使っているOSはwindows vista で コンパイラはMicrosoft Visual C++ 2008 Express Edition です。 どうしたらよいのかわかりません。 どうか教えてください。 説明に不足があればまた足しますのでよろしくお願いします。

  • fgetsで2行目から文字化け

    fgetsでファイルを一行ずつ読み込みたいのですが、二行目以降が文字化けしてしまいます。 ******* ソース ******* #include <windows.h> #include <stdio.h> FILE *fp; if ((fp = fopen("textlist.txt", "r")) == NULL){ MessageBox(NULL, TEXT("ファイルを開けません"), NULL, NULL); exit (1); } while (1) { TCHAR buf[128] = {0}; if (fgets(buf, sizeof(buf), fp) == NULL) break; MessageBox(NULL,buf,NULL,NULL); } fclose(fp); ***** textlist.txt ***** あいうえお かきくけこ さしすせそ メッセージボックスの一回目は正しく"あいうえお"と表示されますが、二回目・三回目は文字化けしています。 最終的に一行ずつ分けて配列に入れたいので、fgetsで出来たらと思っています。 よろしくお願いします。

  • コンパイルエラーの原因がわからず困っています。

    こんばんは。 どなたか以下のプログラム(test4.c)が何故コンパイル出来ないのか教えて頂けませんか。行数は見やすいように一時的につけさせて頂きました。 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<unistd.h> 5 #include<errno.h> 6 #include<signal.h> 7 #include<sys/types.h> 8 9 10 11 12 13 int main(){ 14 FILE *fp,*fp2; 15 char str[1024]; 16 char *tok; 17 char buf[256]; 18 fp = fopen("file.txt","r"); 19 int i = 0; 20 fp2 = fopen("out.txt","a"); 21 22 while((str = fgets(str,1024,fp)) == EOF){ 23 24 while(1){ 25 // 前文を取得 26 tok = strtok(str, "("); 27 printf("%s\n",tok); 28 strcat(buf, tok); 29 30 // 中文を取得 31 tok = strtok(NULL, ")"); 32 if(tok == NULL)break; 33 tok = strtok(NULL, ")"); 34 if(tok == NULL)break; 35 36 *(tok + 1) = '\0'; 37 tok = strtok(NULL, "CEUFRSAP.");//フラグをトークンの材料にする 38 strcat(buf,tok); 39 40 // 後文を取得 41 tok = strtok(NULL, "("); 42 tok = strtok(NULL, ")"); 43 strcat(buf,"tcp "); 44 strcat(buf,tok); 45 break; 46 } 47 printf("%s\n",buf); 48 printf("%d行目です/n",i++); 49 fputs(buf,fp2); 50 } 51 52 printf("合計%d行です\n",i); 53 fclose(fp); 54 fclose(fp2); 55 return 0; 56 } 以下がコンパイルエラーの全文です。 test4.c: In function ‘main’: test4.c:22: error: incompatible types in assignment どんな些細な意見でも結構です。アドバイスをして頂けないでしょうか。どうぞよろしくお願いします。

  • ソースのおかしいところ

    ソースのおかしいところ教えてください。 #include <stdio.h> main() {     printf("Hello!");     return 0; }

  • スタートアップフォルダのパスの取得

    環境はWIN98 VC++6.0 MFCです。 スタートアップフォルダのパスを取得するために以下のようにしました。 XPではうまくいきましたが、WIN98では取得できません。 どうすれば取得できますか? char chPath[MAX_PATH]; LPITEMIDLIST pidl; ::SHGetSpecialFolderLocation( GetSafeHwnd(), CSIDL_COMMON_STARTUP, &pidl ); ::SHGetPathFromIDList( pidl, chPath );

  • gccのオプションは必要ですか?

    ubuntuを使ってc言語の勉強(スーパービギナー編ですが)をしています。 以下のプログラムを実行すると、Segmentation faultが出ます。 以前、-lmのオプションを付けないと、math.hが使えない事が、ありましたが、今回の場合、何か必要でしょうか? #include<stdio.h> #include<stdlib.h> int main(void) { FILE *fin; char buf[256]; char filename1[80]; printf("入力ファイル名="); gets("filename1"); fin = fopen(filename1,"r"); if(fin==NULL){ printf("%sをオープンできません。\n",filename1); exit(1); } while(fgets(buf,256,fin) !=NULL){ printf("%s",buf); } fclose(fin); return 0; }

専門家に質問してみよう