• 締切済み

アイコンにドラッグアンドドロップ

VisualStudio 2005 で c++でダイアログベースのアプリケーションを作成しています。 ファイルをアイコンにドラッグアンドドロップして開くということをやりたいのですが、ファイルを開いたときにエラーが発生してしまいうまくいきません。対処方法を教えてください。 ソースファイル ::OnInitDialog(){ : : : : // TODO: 初期化をここに追加します。 DragAcceptFiles(); char *p = AfxGetApp()->m_lpCmdLine; CFile fin; if(p[0]!=NULL){ AfxMessageBox(p); fin.Open(FileName, CFile::typeBinary | CFile::modeRead | CFile::modeNoTruncate); } AfxMessageBox(p)でドロップしたファイルのパスは表示できています。

みんなの回答

回答No.4

>>ちなみになぜ ” が入ってしまうのでしょうか?もしわかるようでしたら教えてください。 多分ですが、ファイル名(パス名含む)全体の中に半角スペースがあるのでは無いでしょうか? その昔、実行ファイルに渡されるパラメータの区切りとして半角スペースを使用していました。 例えば、DOSコマンドのCOPY等で「copy a.txt b.txt」を実行すると、[a.txt]を[b.txt]にコピーする命令となります。 しかし、Windows95時代に入りファイル名に半角スペースが使用できるようになりました。 これを受けて、半角スペースを単純にパラメータの区切りとしてみなす事が出来なくなりました。 よって、半角スペースを含むファイル名の場合は前後に"を付加するようになっています。 「copy "a al.txt" b.txt」で「a al.txt」を一個のファイル名として扱えることが可能なようになっている。(実証済み) ファイルをドロップした場合では、ファイル名に半角スペースが含まれている事をみなして"を付加していると思われます。 以上、参考までに。。。

biyonbiyon
質問者

お礼

わかりやすい回答ありがとうございます。 非常に興味深い話でした。

回答No.3

AfxMessageBox(FileName)で何が表示されますでしょうか? 「●●.txt」だけだった場合、相対アクセスになっている可能性ありです。

biyonbiyon
質問者

お礼

ありがとうございます。 自己解決できました。 ファイル名が ”~~~デスクトップ\input.txt” となっていました。(デスクトップからドラッグした場合) Cドライブ等からドロップした場合は、ファイル名が C:\input.txt となりうまく動きました。 char *p の最初の文字に ” が含まれている場合、最初と最後の  ” を取り除く処理を加えることでうまくいくようになりました。 ご協力ありがとうございました。 ちなみになぜ ” が入ってしまうのでしょうか?もしわかるようでしたら教えてください。

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

>例えば、実行ファイルのアイコンに●●.txtをドロップした場合、 >”●●.txtが存在しません”というエラーが出てしまいます。  アクセス権とかでしょうか…。 実ファイルをドラッグ&ドロップの筈ですから、存在しないはずはないでしょうし。 あるいは他のアプリが排他で開いている…とか。 パス名などに半角スペースが入っている…かとも思いますが、たぶんちゃんと開けるでしょうな。 ネットワークの共有フォルダから…の場合でも、そうそう接続は切れないでしょうし。 ちょっと解らないです。

biyonbiyon
質問者

お礼

回答ありがとうございます。 いろいろと試してみようと思います。

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

>ファイルを開いたときにエラーが発生してしまいうまくいきません。 どのようなエラーが出ますか? また、どのように「うまくいきません」か? # 「気分が悪い」と言っただけで、病名をぴたりと言い当てる医者は居ません。 >AfxMessageBox(p); >fin.Open(FileName, CFile::typeBinary | CFile::modeRead | CFile::modeNoTruncate); >AfxMessageBox(p)でドロップしたファイルのパスは表示できています。 FileNameとは何者ですか? # タイトルの「アイコンに」というのも、少々伝わりにくいと思いますが。 # 「実行ファイルのアイコンに」くらいにした方が伝わりやすいかと。 ## 「自作゜ログラム上に表示しているアイコンに」という場合もありますし。

biyonbiyon
質問者

補足

回答ありがとうございます。 >fin.Open(FileName, CFile::typeBinary | CFile::modeRead | CFile::modeNoTruncate); ではなく、 >fin.Open(p, CFile::typeBinary | CFile::modeRead | CFile::modeNoTruncate); の間違いです。  申し訳ありません。 また、エラーの内容ですが、 例えば、実行ファイルのアイコンに●●.txtをドロップした場合、 ”●●.txtが存在しません”というエラーが出てしまいます。  申し訳ありませんが、よろしくお願いいたします。

関連するQ&A

  • VC++のプログラミングについて

    VC++(verson2003)でテンプレートはMFCのダイアログベースでアプリケーションを作成しています。以下のプログラムはあるボタンをクリックしたときに呼び出される関数でエディット(コントロール変数m_edit1)に入力されたファイル名の内容(メモ帳に記述したテキスト文)を変数textに格納するものです。このプログラム書き換えてメモ帳に 3 1 4 9 のように記述した数字をint型の一次配列に格納するようにしたいのですがどのようにすればよいでしょうか。 void CprogramDlg::OnBnClickedButton1() { CStdioFile fin; char buf[1001]; CString text,filename; m_edit1.GetWindowText(filename); if (filename == "") return; if(!fin.Open(filename, CFile::modeRead | CFile::typeBinary)) {  AfxMessageBox("読み込みファイルをオープンできません");  return; } text = ""; while (fin.ReadString(buf,1000) != NULL) { text = text + buf; } fin.Close(); }

  • VC++、MFCでSDIでアプリ作成中

    現在、VC++、MFCでSDIでアプリ作成中です。 アイコン上にファイル(txtファイル)をドラッグ&ドロップしてメモ帳を起動したいです。 ただ、ドロップされたファイルはうまく読み込めるのですが、そのファイルを開く(表示)することができません。 ドロップされたファイルは、C○○View.cppで int C○○View::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: この位置に固有の作成用コードを追加してください CStringArray argv; if( IsDropOnIcon( &argv, TRUE ) ){ int i; for( i = 0; i < argv.GetCount(); i++ ){ MessageBox( argv[ i ], "ドロップされたファイルは", MB_OK ); Read(argv[i]); } } } BOOL C○○View::IsDropOnIcon( CStringArray* argv, BOOL acceptFolder ) { CString cmdlin = ""; CString resToken; char* p; int startnum = 0; p = AfxGetApp()->m_lpCmdLine; if( strlen( p ) == 0 || p[ 0 ] == '-') return FALSE; cmdlin = p; resToken= cmdlin.Tokenize( "\"", startnum ); while( resToken != "" ){ if( resToken != " " && IsExist( resToken, acceptFolder ) ) argv->Add( resToken ); resToken= cmdlin.Tokenize( "\"", startnum ); }; return TRUE; } /* 引数で貰った文字列がファイルかどうかをチェック */ BOOL C○○View::IsExist( CString filepath, BOOL acceptFolder) { CFile fp; if( fp.Open( filepath, CFile::modeRead ) ){ fp.Close(); return TRUE; } return FALSE; } のargv[i]で取得しています。 これが、Read(arg[i])でうまく読み込めません。 ちなみにRead(CString filename)は正しく動くことは確認済みです。 Read(arg[i])を入れる場所がOnCreateがいけないとは思うのですが、どのタイミングで 読み込めばいいかがわかりません。 どなたか教えて頂けないでしょうか?

  • テキストファイルの各行の文字列を、コンボBoxに表示させたい

    テキストファイルの各行の文字列を、コンボBoxに表示させたい 現在VC++ MFCの勉強をしております。(MFCに拘ってはおりません) 下のテキストファイル"D:\data.txt" (Shift_JIS)から (内容) 田中さん 斉藤さん 吉田さん CFile の Read で一行ずつ読み込んで、CStringArrayを使って コンボBox に Insert したいと思っています。 下記のコードについてですが。 BOOL CAddDialog::OnInitDialog() { CDialog::OnInitDialog(); // TODO: ここに初期化を追加してください TCHAR* pszFileName = L"d:\\data.txt"; CFileException fileException; CFile cFile; int ret; char buffLine[256] ; CStringArray cStrComboArr ; // リスト ret = cFile.Open( pszFileName , CFile::modeRead | CFile::shareDenyNone , &fileException ); if ( ret == false ) { AfxMessageBox( L"ファイルが読込めません。" ); return 1; } while ( (ret = cFile.Read( &buffLine , 256 )) != 0 ) { cStrComboArr.Add( buffLine ); /* ここでビルドエラー */ } cFile.Close(); // コンボboxに入れる CComboBoxEx* pCombo = (CComboBoxEx*) GetDlgItem( IDC_COMBOBOXEX1 ); COMBOBOXEXITEM cbi ; cbi.mask = CBEIF_TEXT; for ( int i = 0; i < cStrComboArr.GetCount(); i++ ) { cbi.iItem = i; cbi.pszText = (LPTSTR)(LPCTSTR) cStrComboArr.ElementAt(i) ; // 「'CString' から 'LPWSTR' に変換できません」から。 cbi.cchTextMax = 256; pCombo->InsertItem( &cbi ); } return TRUE; // return TRUE unless you set the focus to a control // 例外 : OCX プロパティ ページは必ず FALSE を返します。 } cStrComboArr.Add( buffLine ); の部分でエラー表示は、 「INT_PTR CStringArray::Add(LPCTSTR)' : 1 番目の引数を 'char [256]' から 'LPCTSTR' に変換できません。」です。 根本的にやり方が間違っているのか、もう少しのところなのか、 ズバッとご指摘いただけないでしょうか。 宜しくお願いします。 OS : Vista Home Premium VS 2008 pro

  • VC++でドラッグドロップ

    いつもお世話になっております。 今回はドラッグ&ドロップについてお聞きしたいです。 リストボックスにフォルダをドラッグしてそのフォルダの中身を リストに表示するというものを作りたく、ネットでいろいろ調べた所 以下のように作りました。 ResourceViewでドロップドラッグを許可にチェックを入れる case WM_CREATE:   DragAcceptFiles(::GetDlgItem(hWnd, IDC_LIST1), TRUE);   return TRUE; case WM_DROPFILES:   { // ドロップされた内容を取得   hdrop = (HDROP)wParam;   DWORD dwSize;   CHAR szPath[MAX_PATH+1];   ZeroMemory(szPath, sizeof(szPath));   int num = ::DragQueryFile(hdrop, -1, NULL, 0);   for (int i = 0; i < num; i++);{     dwSize = ::DragQueryFile(hdrop , i, szPath, MAX_PATH+1);     if (dwSize <= 0) //取得失敗     {       return FALSE;     }     else{ //以下にszPathから中身を表示させる処理 ・・・} 以上のようにするとドラッグしたファイルの数は 正しく取得しているのですがファイル名を得る関数部分で 1.i=0としているのに、最初からi=numの数になってしまう 2.二つ目のDragQueryFileのiを1にしても戻値(ファイル名のサイズ)は 0となって取得していない となってしまいます。 なぜこのようになってしまうのか、ご教授願います。 環境はVisual C++6.0 OSは windowsXP SP2です

  • 特殊文字「\」の変換の方法

    VC++2005のMFCにてプログラムを作成しています。 CFileDialogにてテキストファイルを読み込み、 読込んだファイルパスの「\」を「\\」になるように変換したいのですが、 実装の方法が分かりません。 ===================================== 例)C:\test\hoge.txt ⇒ C:\\test\\hoge.txt と変換する。 ===================================== 下記にファイルパスをCstring型で読み込み、 char型に変換するまでのプログラムを記載します。 理想としては、char型配列の中に、 「C:\\test\\hoge.txt」のような変換後のファイルパスを 入れたいのです。 解決方法をご存知の方おられましたら、ご教示お願いできませんでしょうか。 【プログラム】 /* ファイルオープンダイアログを表示 */ CFileDialog ReadDlg( TRUE, NULL, "*.txt", OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, "txtファイル(*.txt)", this ); CString filepath; if( ReadDlg.DoModal() == IDOK ) { filepath = ReadDlg.GetPathName(); // ファイルのフルパス名を取得 } CFile cfile; CFileException ex; if( !cfile.Open( filepath, CFile::modeRead , &ex ) ) { AfxMessageBox( "ファイルを開くのに失敗しました" ); // エラーメッセージを表示 return; } char st[255] = ""; strcpy( st, filepath );

  • このプログラムの解説を

    C言語の勉強を始めたのですが、質問があります。 下のプログラムをコンパイルしたら   入力ファイル名= と出ますが、これは何を入力すればよいのでしょうか? 何か入力しても「~がオープンできません」と表示されて、これは、自分が持っているファイルを打てばよいのですか?(このプログラム自体も何を意味しているか、まだ理解できていません。) 解説よろしくお願いします。 #include<stdio.h> #include<stdlib.h> main() { FILE *fin; char buf[256]; char filename1[20]; 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); }

  • C#でドラッグ&ドロップが機能しない。

    使用OSはWindows8で 開発環境はVisualStudio2012 (.NET Framework4.5)です。 ListBox1にドラッグ&ドロップでファイル名を表示する機能を追加したいと思い、以下のようなコードを記述しました。また、ListBox1のイベントととしてListBox1ListBox1_DragEnterとListBox1_DragDropを関連づけました。 この状態でビルドして動作を確認してみると、問題なく動作しました しかし、debugフォルダ内のEXEファイルを直接起動するとドラッグ&ドロップ不可のマークが出てしまいます。 なにが問題が問題なのか分からず困っています。ご回答お願いします。 private void Form1_Load(object sender, EventArgs e) {   this.AllowDrop = true;   ListBox1.AllowDrop = true; } private void ListBox1_DragEnter(object sender,System.Windows.Forms.DragEventArgs e) {   e.Effect = DragDropEffects.Copy; } private void ListBox1_DragDrop(object sender,System.Windows.Forms.DragEventArgs e) {   string[] fileName =(string[])e.Data.GetData(DataFormats.FileDrop, false);   ListBox1.Items.AddRange(fileName); }

  • ドラッグアンドドロップでHTMLファイル上の画像ファイルのパスを取得

    IEなどのブラウザに表示されたHTMLファイル上の画像ファイル(jpeg or gif)を ドラッグアンドドロップして、画像ファイルのWeb上のパスを得たいと考えています。 現在、以下コードで試していますが、PCに保存されたローカルパス+ファイル名が 帰ってきます。なんとかして画像ファイルのWeb上のパスを取得できないでしょうか。 【例】http://www.abc.co.jp/aaa.jpgなど こちらの環境はWindowsXP HomeEdition + C++ builder6 proです。 //Dropの設定 DragAcceptFiles(Handle,true); //--------------------------------------------------------------------------- void __fastcall TForm2::DropFiles(TWMDropFiles inMsg) { char fName[255]; int Count = DragQueryFile((HDROP)inMsg.Drop,0xffffffffF, fName, 255); //Dropされたファイル名を得る for(int i=0;i<Count;i++){ DragQueryFile((HDROP)inMsg.Drop,i,fName,255); ListBox1->Items->Add(fName); } DragFinish((HDROP)inMsg.Drop); } 宜しくお願いいたします。

  • CSVを用いた検索プログラム動かし方

    #pragma warning( disable: 4996 ) #include <stdio.h> #include <string.h> #include <fstream> using namespace std; typedef struct tagKOTOWAZA{ char japanese[50]; char english[50]; }KOTOWAZA; int main() { char buf[256]; KOTOWAZA c[200]; int i, count; /*ifstream strtok strcpy を使ってファイルを読み込む*/ //=====ここから===== ifstream fin("Book1.csv"); if(fin.is_open()){ //ファイル内容の表示とクローズ for(count=0;fin.getline(buf, sizeof(buf)), !fin.eof();count++){//読み込める間 //printf("%s",buf);デバッグ用 char *p; p = strtok(buf,","); if(p)strcpy(c[count].japanese,p); p = strtok(NULL,","); if(p)strcpy(c[count].english,p); } fin.close(); }else{ printf("ファイルのオープンに失敗しました。\n"); return 1; } //=====ここまで==== return 0; } ここからどうすればCSVファイルに書いた 漢字,English を検索できるのかがわかりません・・・ 言語はC++を使っていますvisualstudio2012を使っています。 どうすればいいのか全く分かりません。 よろしくお願いします。

  • 文字列の比較について

    99としか書いてないファイルxxx.txtが有り、以下のようにして読み込みました。 char aaa[256]; if((fin=fopen("c:\\xxx.txt","r"))==NULL){ AfxMessageBox("読み込みファイルオープン出来ません"); return TRUE; } while((fgets(aaa,256,fin))!=NULL){ } fclose(fin); そしてstrcmpで比較したところ、1が返り等しくないと判定されます。 strcmp(aaa,"99") どうすれば等しいと判定できるようになりますか?

専門家に質問してみよう