SHGetFileInfoでExplorerに表示されるICONのファイル名を取得したいのですが
うまくいきません。

int main(int argc, char* argv[])
{
SHFILEINFO sfi;
::CoInitialize(NULL);

if(0 == ::SHGetFileInfo("C:\\hogehoge.txt", FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), SHGFI_ICONLOCATION))
return -1;
printf("Icon location file = %s\n", sfi.szDisplayName);
return 0;
}

SHGFI_TYPENAMEを指定するとsfi.szTypeNameファイルタイプ名が入るのは確認できたのですが、SHGFI_ICONLOCATIONを指定してもsfi.szDisplayNameにアイコンファイル名が入ってくれません。(sfi.szDisplayName[0]='\0'で終わりになっている...)

MSDNを見る限りはこれであっているようなのですが、正しい使い方を教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

正直うちの環境(Win98 + VC++ 6.0SP4)でもうまく行かないときはあります。


ただし、SHGFI_ICONを指定しておけばとりあえずアイコンハンドルが手に入るため、それをそのままMFCのCImageListとかに保存してListViewに渡してやればアイコンは表示できてしまうので、実際問題としてあまり不都合は感じてません。

WindowsCEを引き合いに出したのは、一応ターゲットとなっているOSプラットフォームが書かれていなかったため、念のため、と思ったまでのことです。
一応MSDN Knowledge Baseで検索をかけた結果でも、特にWin32環境で制限やバグがあるような報告は上がってなかったので、SHGFI_ICONLOCATIONがうまく働かない原因はいまだ謎のままです。
    • good
    • 0
この回答へのお礼

解決になりませんでしたが、お付き合いくださいましてありがとうございました。

お礼日時:2001/03/02 22:17

ひょっとすると、SHGFI_ICONLOCATIONだけではだめで、SHGFI_ICONも一緒に指定しないとだめなのではないでしょうか。

MSDNのドキュメントには記載がありませんが。

あと気になるのは、WindowsCE Ver.2.10以降ではSHGFI_ICONLOCATIONはサポートされない、とMSDNドキュメントにも書かれているので、環境によってはSHGFI_ICONLOCATIONが使えなくなっている可能性も考えられます。

この回答への補足

たびたびお付き合いありがとうございます。

SHGFI_ICONも指定しましたが、だめでした。

CEとWin32を関連付ける意味が良く解かりませんが、
となるとCEでサポートされない多くのWin32APIも使用不能の可能性がありますね。

環境によりというのはありえるかもしれませんが、
cockyさんの環境では、あのコードで問題なく取得出来るのでしょうか?

補足日時:2001/03/02 18:08
    • good
    • 0

一つ確認ですが、「c:\hogehoge.txt」というファイルはHDD上に実在しますか?


もし実在しないのであれば、SHGFI_USEFILEATTRIBUTESも一緒に指定しないと、Windowsが実際に「c:\hogehoge.txt」の情報を読みに行ってしまい、ファイルが存在しないためにエラーになってしまいますから、szDisplayNameに情報が入らないのも当たり前だと思いますが。

この回答への補足

たびたびすみません。

ファイルは実在します。SHGFI_USEFILEATTRIBUTESを指定しても同じでした。

パラメータに問題があるのかと思い、ファイルの種類も取得するように
改良してみました。

#include <windows.h>
#include <shellapi.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
SHFILEINFO sfi;
::CoInitialize(NULL);
if(0 == ::SHGetFileInfo(".pdf", FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi),
SHGFI_ICONLOCATION | SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES))
return -1;
printf("Icon location file = %s\n", sfi.szDisplayName);
printf("Type name = %s\n", sfi.szTypeName);
return 0;
}

結果、

Icon location file =
Type name = Adobe Acrobat文書

となりました。ファイルの種類は問題なく取得できるのですが、アイコンファイル名だけなぜかできないです。

補足日時:2001/03/02 08:24
    • good
    • 0

他の拡張子のファイルでは試してみましたか?


.txtのような拡張子だとアイコン情報がSystemImageListの中に入っていて、SHGFI_ICONLOCATIONを指定してもアイコンファイル名が出てこなかったように記憶してるんですが。

この回答への補足

早速の回答ありがとうございます。
.txtではなく、.pdfにしてみましたAcrobatReaderの実行ファイルあたりが
返ってきてよさそうなのですが、結果は同じです。

SHGetFileInfo APIのドキュメントにも出てきますが、
SystemImageListというのが具体的にどのようなImageListなのか
(シェルにキャッシュされているアイコンを集めたものか、shell32.dllあたり
に格納されているシェル標準で持っているアイコンを集めたものか)
よくわかっていません。

いろいろ検索して調べてみましたが、うまく行く例が見当たりません。
もし「こうすればうまく行く」みたいな例があると助かります。
すみません。

補足日時:2001/03/02 00:24
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QSHGetFileInfoでアイコンが取得できない場合がある

VC++にてエクスプローラもどきを作成しています。

ListViewへファイルアイコンを表示するために、
SHGetFileInfoを使用し、

// 大きいアイコンのハンドル取得
// fnameは拡張子だけの文字列です
SHGetFileInfo( fname, NULL, &shfInfo, sizeof(SHFILEINFO),
SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES );
licon = shfInfo.hIcon;

上記のようにしてファイルアイコンを取得し、
CImageListへ追加した上で、描画しています。
そして、ダイアログのサイズが変更された際に、
OnSize関数にて、ListView内のアイコンを再度取得し、
再描画しているのですが、
何度もOnSizeで再描画を行っているうちに、
SHGetFileInfoにて取得したshfInfo.hIconが
NULLになってしまいます。
一度、shfInfo.hIconがNULLになると、
何度、SHGetFileInfoを呼んでも、返ってくるhIconは
毎回NULLになってしまい、ListView内に
アイコンが表示されません。

SHGetFileInfo関数を呼ぶ際の制約等があるのでしょうか?

VC++にてエクスプローラもどきを作成しています。

ListViewへファイルアイコンを表示するために、
SHGetFileInfoを使用し、

// 大きいアイコンのハンドル取得
// fnameは拡張子だけの文字列です
SHGetFileInfo( fname, NULL, &shfInfo, sizeof(SHFILEINFO),
SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES );
licon = shfInfo.hIcon;

上記のようにしてファイルアイコンを取得し、
CImageListへ追加した上で、描画しています。
そして、ダイアログのサイズが変更された際に...続きを読む

Aベストアンサー

 こんにちは。
 リソースリークしているのではないでしょうか。
 取り敢えず、使い終わったアイコンのハンドルを削除して見て下さい。
 因みに以下で再現出来しました。

SHFILEINFO shfInfo;
//取り敢えずノートパッド(メモ帳)のアイコンを取って来る
TCHAR szPath[] = _T("C:\\WINNT\\notepad.exe");
for(int i = 0; i < 100000; ++i)
{
SHGetFileInfo( szPath, NULL, &shfInfo, sizeof(SHFILEINFO),SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES );
HICON hicon = shfInfo.hIcon;

//此れを呼べば大丈夫
//::DestroyIcon(hicon);
if(hicon == NULL)
{
//いずれココに来る
}
}

QWin32APIにて、アイコンの情報を取得する方法を教えてください。

いつもお世話になっております。
只今、小生WindowsXPSP3上で、C言語とWin32APIを使い、BCC5.5.1でコンパイルし、Windowsプログラミングを勉強しています。

今回質問させて頂きたいのは、
「ウィンドウにアイコンを描画する際、
 BitBlt関数の第4・5引数に指定する転送元画像の幅と高さを取得する
 際にはどうすればいいか」
です。

例えば、ビットマップ画像の幅、高さを取得する際は、

GetObject(hBitmap, (int)sizeof(BITMAP), &bmp_info);
をして、
w = bmp_info.bmWidth;
h = bmp_info.bmHeight;

とし、x, yをBitBlt関数の第4・5引数に指定する方法というのは知っているのですが、アイコンの場合はどのようにして、幅、高さを求められるのでしょうか??

先輩方、ご教授宜しくお願い致します。

Aベストアンサー

 こんばんは。

 GetIconInfo()APIです。
 
 http://msdn.microsoft.com/ja-jp/library/cc364668.aspx
 http://msdn.microsoft.com/en-us/library/ms648052(VS.85).aspx

//TRUE->アイコン、FALSE->カーソル
ICONINFO ici = {TRUE};
::GetIconInfo(hIcon, &ici);

//ICONINFO::hbmColorメンバにビットマップハンドルが入っている
BITMAP bmp;
::GetObject(ici.hbmColor, sizeof(bmp), &bmp);

QGetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・

お世話になっています。

iniファイルを読込み、各変数に代入するC言語のDLLを作成したいのです。
このサイトの投稿や、MSDNなどにも載っていたのですが、
少し理解に苦しみます。

現在まで、理解した点がwindows.hのインクルードを
記述するところ辺りです。
iniファイルは下記のようなレイアウトです。

---<mst.ini>----------------------------
[user]
name=username
ID=userid
[pc]
pcname=FMV
----------------------------------------

#include<windows.h>は記述することまでは
分かりましたが、以下から進みません。。。

GetPrivateProfileString("")

初心者で申し訳ありませんが、お助け願います。

Aベストアンサー

こんにちは。itohhといいます。

サンプルを載せておきます。

mst.iniファイル内の[user]セクションのnameキーの値を取得する。
DWORD dwLen=0;
char strBuf[100];
dwLen = GetPrivateProfileString("user",       // セクション名
                "name",       // キー名
                "soushi_ni",     // デフォルト値
                strBuf,       // 読み込んだ値を格納するエリア
                sizeof(strBuf),   // 上記のエリアのサイズ
                "mst.ini" );     // iniファイル名

解説:
iniファイル名をフルパスで指定しないとWindowsのディレクトリにあるものと判断されます。
Win9xなら「c:\windows」、WinNT系なら「c:\WinNT」。

[user]セクションのnameキーがないときは、デフォルト値で指定した値が設定させます。

復帰値「dwLen」は実際に設定した値(文字列)の長さが返されます。

こんにちは。itohhといいます。

サンプルを載せておきます。

mst.iniファイル内の[user]セクションのnameキーの値を取得する。
DWORD dwLen=0;
char strBuf[100];
dwLen = GetPrivateProfileString("user",       // セクション名
                "name",       // キー名
                "soushi_ni",     // デフォルト値
                strBuf,       // 読み込んだ値を格納するエリア
             ...続きを読む

QCTreeCtrlのノードごとにアイコンを変えたい

おせわになります。

C++6.0 MFC で開発しております。

現在,CTreeCtrlで、下記のような画像付き(●:画像)のツリーを表示しています。
●AAA-●bbb
 -●ccc
-●ddd
そこで、下記のようにノードごとに画像を変えたいのですが、どのような関数を使用すればよいのでしょうか?
●AAA-★bbb
 -◆ccc
-□ddd

お手数ですがなにとぞよろしくお願いします。

Aベストアンサー

 こんばんは。

 イメージリストの作成方法は何通りかある為、ピンポイントで説明するのは難しいのですが、イメージリストの使い方を間違えていて、●★◆□の様に並んでいないか、ツリーコントロールの操作を間違えているか、ではないでしょうか。
 以下は16x16のアイコン4個分を並べてデザインしたビットマップ(64x16のビットマップ)を読み込んで、ツリーアイテムに設定します。
 デザインさえ合っていれば成功する筈です。以下参考程度に。

BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// "バージョン情報..." メニューをシステム メニューに追加します。

// IDM_ABOUTBOX は、システム コマンドの範囲内になければなりません。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、
// Framework は、この設定を自動的に行います。
SetIcon(m_hIcon, TRUE);// 大きいアイコンの設定
SetIcon(m_hIcon, FALSE);// 小さいアイコンの設定

// TODO: 初期化をここに追加します。
//16x16のアイコン4個分(64x16デザイン)のイメージを読み込む
HIMAGELIST hImgList = ::ImageList_LoadImage(NULL, TEXT("imglist.bmp"), 16, 0, CLR_NONE, IMAGE_BITMAP, LR_LOADFROMFILE);

//CImageListの作成
CImageList* pImgList = new CImageList();
pImgList->Attach(hImgList);

//CTreeCtrlにアイテムを追加
CTreeCtrl* pTree = static_cast<CTreeCtrl*>(this->GetDlgItem(IDC_TREE1));
pTree->SetImageList(pImgList, TVSIL_NORMAL);

/*アイテム追加と同時にイメージリスト番号を指定する場合
HTREEITEM hItem = pTree->InsertItem(TEXT("AAA"), 0, 0);//イメージリスト1番目を指定
hItem = pTree->InsertItem(TEXT("bbb"), 1, 1, hItem);//イメージリスト2番目を指定
hItem = pTree->InsertItem(TEXT("ccc"), 2, 2);//イメージリスト3番目を指定
hItem = pTree->InsertItem(TEXT("ddd"), 3, 3, hItem);//イメージリスト4番目を指定
*/

/*後でイメージリスト番号を指定する場合
HTREEITEM hItem1 = pTree->InsertItem(TEXT("AAA"));
HTREEITEM hItem2 = pTree->InsertItem(TEXT("bbb"), hItem1);
HTREEITEM hItem3 = pTree->InsertItem(TEXT("ccc"));
HTREEITEM hItem4 = pTree->InsertItem(TEXT("ddd"), hItem3);

pTree->SetItemImage(hItem1, 0, 0);
pTree->SetItemImage(hItem2, 1, 1);
pTree->SetItemImage(hItem3, 2, 2);
pTree->SetItemImage(hItem4, 3, 3);
*/

return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}

void CTestDlg::OnDestroy()
{
CDialog::OnDestroy();

// TODO: ここにメッセージ ハンドラ コードを追加します。
CTreeCtrl* pTree = static_cast<CTreeCtrl*>(this->GetDlgItem(IDC_TREE1));
if(pTree == NULL)
return;

CImageList* pImgList = pTree->SetImageList(NULL, TVSIL_NORMAL);
if(pImgList == NULL)
return;

//CImageListをnewで作成した場合はdeleteが必須
delete pImgList;
}

 こんばんは。

 イメージリストの作成方法は何通りかある為、ピンポイントで説明するのは難しいのですが、イメージリストの使い方を間違えていて、●★◆□の様に並んでいないか、ツリーコントロールの操作を間違えているか、ではないでしょうか。
 以下は16x16のアイコン4個分を並べてデザインしたビットマップ(64x16のビットマップ)を読み込んで、ツリーアイテムに設定します。
 デザインさえ合っていれば成功する筈です。以下参考程度に。

BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();...続きを読む

Qラジオボタンのグループ化

VC6.0の
ラジオボタンのグループ化についてですが
例えばIDC_RADIO1~IDC_RADIO6まで作ったとして
IDC_RADIO1と
IDC_RADIO4のグループにチェックをいれると
IDC_RADIO1~3と4~6が
それぞれグループになったのですが
1、2、6と3、4、5をグループにしたいときは
どうすればよいのでしょうか?

あるサイトによるとグループボックスでラジオボタンで囲むと
囲んだ部分がグループになると記述されてたのですが
それについてもうまくいかなかったのですが、教えて頂けないでしょうか?

Aベストアンサー

[レイアウト]-[タブオーダー]でタブ順を
IDC_RADIO1,2,6,3,4,5 の順で設定します。
ラジオボタンのプロパティで IDC_RADIO1 と IDC_RADIO3
の[グループ]をチェックします。またIDC_RADIO5 の後の
コントロール(何でも良い)の[グループ]もチェック
します。

>グループボックスでラジオボタン
マジっすか。

QC:\WINNT\system32\SHELL32.dllの中のアイコンファイルがいる

こんばんは。

C:\WINNT\system32\SHELL32.dll の中にたくさんアイコンファイルがあり、それを使用したいのですが、このファイルが開けません。

SHELL32.dllファイルをダブルクリックすると、「アプリケーションから開く」ダイアログボックスが出てきて、どのアプリケーションから開けばよいのか、分かりません。

誰か分かる方がお見えでしたら、教えてください。よろしくお願いします。

Aベストアンサー

"*.dll"ファイルから、アイコンを取り出したいのでしたら、下記のフリーソフトが便利です。

『アイコン取り出し IconStars』
http://www.forest.impress.co.jp/library/iconstars.html

また、ショートカットのアイコンを変更したいのでしたら、ショートカットの『プロパティ』⇒『ショートカット』タブ⇒『アイコンの変更』で"*.dll"ファイルを指定して、アイコンを選択すればできますが・・・。

参考URL:http://www.forest.impress.co.jp/library/iconstars.html

QCStaticコントロールの静的イメージ描画

はじめまして、質問させてください。

VC++ 2005 MFC で開発しております。

Picture Control(DDX CStasic型)に
イメージ(外部ファイル JPG)を静的に描画させたいのですが
方法がわかりません。

お詳しい方がおられましたら、ご教授お願いいたします。

ちなみに
CImageを使用して描画はできるのですが
その場合、OnPaintをオーバーライドして
描画更新処理を書かないと一度だけ描画されて終わって
しまうと思います。

CStaic変数にロードしたら
再度ロードされるまで
ずっと描画させていたいです。

以上になります。
宜しくお願いいたします。

Aベストアンサー

SelectObjectで選択するとその時まで選択されていたデバイスハンドルを返してきます
そのハンドルを一時変数に保存しておいて描画後に戻してやるのです

CBitmap* pOld = m_dcMem.SelectObject( &m_bmpMem );
といった具合で記憶して描画処理を行います
使用後に
m_dcMem.SelectObject( pOld );
といった具合にして m_bmpMemをDCからはずします
この後
m_ctlImage.SetBitmap( m_bmpMem );
といった具合に選択してやればできると思います

CStaticのTypeはビットマップで無いとSetBitmapでイメージを表示しません

QVC++プログラムをつかったBMP画像の拡大縮小について

現在VC++をつかった画像を扱うプログラミングを学習中なのですが、画像データの取り扱いについてわからないことがあるため教えていただきたいです。

BMP画像をバッファに取り込んだあとで、画像の縦横を拡大縮小したデータを新たなバッファに格納したいのですが、画像を拡大縮小する方法がわかりません。いくつかのプログラムのソースを見させていただいたのですが、BITMAPINFOHEADER構造体の中のbiWidthやbiHeightの値を変えているだけのようなのです。

これらの値を変えるだけで、指定した幅と高さに変換された画像データが得られるのでしょうか?
また、それで拡大縮小されるならば、変換された画像データは輝度情報が滑らかになるように何かしらの補正が加えられていたりするのでしょうか?それとも、途中途中の輝度を単純に抜いていたりするだけなのでしょうか。
その辺の原理についても教えていただけるとうれしいです。

お手数をかけますが、よろしくお願いします。

Aベストアンサー

> 実際に拡大縮小された画像のデータ(バッファ)がどこに格納されたのかわかりません・・・。

一般的には、メモリやVRAMに載ります。取得もできますが、DIBSectionを使うと、メモリとして参照しやすいです。

> また、StretchBlt関数は、描画を目的としているようなのですが、今回の場合、
> -- snip --
> 描画は無駄な手間のように思われます。

実際の画面に表示するかにかかわらず、WindowsのAPIにおける画像の操作は原則として「DC」という概念を使います。
メモリやプリンタもDCの一種と扱われますし、必ずしも画面描画は意味しません。
ビットマップに何か書くのも、DCと関連付けてそこに描画する仕組みです。

メモリ上で拡大縮小するということは、結局のところ突き詰めれば
元画像を読んで拡大縮小した画像をそこ(メモリ上)に描画している、
ということだと思いますが、いかがでしょう。

# C言語の入出力がコンソールにもファイルにも使えるようにFILE*を使うのとかと大差ない、
# DCってのはWindowsにおける「描画先」の抽象化された概念です。

> 何かスマートな方法はないものでしょうか?

DCという概念自体はWindows GDIの根底ですから、WindowsのAPIである限り、
他を使ってもIFは違えど内部的にはDCと大差ないと思われますが。
「質問者さんにとってのスマート」が不明ですが、自前で変換処理を書くか、
完全独自処理の画像変換ライブラリを持ってくるのがスマートですか。

> 実際に拡大縮小された画像のデータ(バッファ)がどこに格納されたのかわかりません・・・。

一般的には、メモリやVRAMに載ります。取得もできますが、DIBSectionを使うと、メモリとして参照しやすいです。

> また、StretchBlt関数は、描画を目的としているようなのですが、今回の場合、
> -- snip --
> 描画は無駄な手間のように思われます。

実際の画面に表示するかにかかわらず、WindowsのAPIにおける画像の操作は原則として「DC」という概念を使います。
メモリやプリンタもDCの一種と扱われま...続きを読む

Qボタンのオーナードローについて

既存のプログラムにあるボタンをオーナードローに変更しようとしています。
概要としては、以下のとおりです。
・MainFrame-CDialogBar((1))-CWnd((2))のような重なりになっています。
・上記(2)のクラスにてオーナードローできるようにしたいのです。
・開発環境は、VC++6.0です。

変更点は以下のとおりです。
・(2)にメッセージマップの追加(ON_WM_DRAWITEM())
・(2)にメッセージハンドラの追加(OnDrawItem())
・(1)メソッド内で、(2)をCreate後、(2)にModifyStyle()にて、BS_OWNERDRAWを付加

ところが、変更後のOnDrawItem()にイベントが飛んできません。
自分で調べたことは、以下のとおりです。
・SPY++でメッセージの確認(→飛んできていません)
・GetWindowLong()にて、ボタンスタイルの確認(→追加スタイルが付加されてました)

このような場合、他にどこを調べて良いか教えて頂きたいのです。
拙い文章ですが、何卒、よろしくお願い致します。

既存のプログラムにあるボタンをオーナードローに変更しようとしています。
概要としては、以下のとおりです。
・MainFrame-CDialogBar((1))-CWnd((2))のような重なりになっています。
・上記(2)のクラスにてオーナードローできるようにしたいのです。
・開発環境は、VC++6.0です。

変更点は以下のとおりです。
・(2)にメッセージマップの追加(ON_WM_DRAWITEM())
・(2)にメッセージハンドラの追加(OnDrawItem())
・(1)メソッド内で、(2)をCreate後、(2)にModifyStyle()にて、BS_OWNERDRAWを付...続きを読む

Aベストアンサー

解決方法としては2種類考えられます
(1)のCDialogBarの派生クラスを作成し、こちらでWM_DRAWITEMもメッセージマップとOnDrawItemをオーバーライドする方法

(2)のCWnd派生クラスに DrawItemメソッドと仮想関数のOnChaildNotifyを実装する
仮想関数の中身はMFCのソースのCButton::OnChaildNotifyを参考にすればいいでしょう
OnChaildNotifyの中でWM_DRAWITEM以外は CWnd::OnChaildNotifyを呼び出してリターン
WM_DRAWITEMの場合はlParamを LPDRAWITEMSTRUCTにキャストして呼び出せばいいようですよ

今回の構成ではCMainFrmaeまでオーナー描画が通知されません
通知されるのは (2)の親の CDialogBarまでのようです
CMainFrameの子ウィンドウとしてオーナー描画のコントロールを追加した場合にはCMainFrame::OnDrawItemが呼ばれるようです

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。


人気Q&Aランキング