トップページ⇒tech
1001コメント291KB

■MFC相談室 mfc11.dll■

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
Microsoft Foundation Classライブラリ専用スレです。

前スレ
■ VisualC++(MFC限定)相談室 MFC10.dll■
http://pc5.2ch.net/test/read.cgi/tech/1074104008/

関連リンクは >>2-10 の辺り。
0652650NGNG
>>651
文句は言わんが、あんたの言いたいことが判らん。
#だからこそ無知と言われているのだろうが。
0653デフォルトの名無しさんNGNG
>>651
ない爪を隠そうとしなくてもw
0654デフォルトの名無しさんNGNG
ほんとに無知なのに勘違い自信家だと調べもしないで偉そうにするのな(しかも自作自演)
0655デフォルトの名無しさんNGNG
質問です。
MFCでアクセスのDBから検索するプログラムつくりました。
一緒にアクセス(のフォーマット)のDBを配布したいんですけど
ライセンスは大丈夫ですかね?
0656デフォルトの名無しさんNGNG
ダイアログバーの追加がうまくいきません

テンプレートを作って
CMainFrameでCDialogBarのオブジェクトを用意
コンストラクタでCreateを呼ぶ

でコンパイルは通りますが実行しようとすると
"0x77f5284"の命令が"0x00000000"のメモリを参照しました。
メモリが"written"になることはできませんでした。
と出て実効できません。

とりあえずダイアログバーを表示するだけの場合でも他に何かやらなければならないことがありますか?
0657デフォルトの名無しさんNGNG
>>656
CMainFrameのコンストラクタで、CMainFrameを親としてCDialogBarをCreateしてる
というオチだろうか?
0658デフォルトの名無しさんNGNG
>>656
コンストラクタ内の auto 変数として CDialogBar オブジェクトを定義している
というオチだろうか?
0659デフォルトの名無しさんNGNG
>>656
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_DlgBar.html
0660656NGNG
なんか勘違いしていました
コンストラクタではなくMainFrameのOnCreateでCreateを呼んでいます
CDialogBar オブジェクトはちゃんとCMainFrameクラスのメンバとして宣言していますし

>>659のサイトの通りにやっても同じエラーが出て実効できません
0661デフォルトの名無しさんNGNG
>>660
まず落ちている個所を特定しる。
0662デフォルトの名無しさんNGNG
>>650
UNICODEビルドの場合、std::stringの派生じゃ困ると思う。
0663デフォルトの名無しさんNGNG
>>662
std::basic_string<TCHAR>
0664デフォルトの名無しさんNGNG
>>663
そんなことみんな知ってるよ
0665デフォルトの名無しさんNGNG
>>664
ちゃんと話がかみ合ってると俺は見ているが・・・
この後の展開次第かもな
0666デフォルトの名無しさんNGNG
いまのCStringってテンプレートだよね
VC++6.0はちがったとおもったけど
0667デフォルトの名無しさんNGNG
>>666
そそ、C6とC7で互換性がなくて怪しげなソースが引っ掛かり捲くり。
C6は兎も角、C4の頃はまともにテンプレートが使えない状態だったし。
0668デフォルトの名無しさんNGNG
VC++.NETつかえねー
0669デフォルトの名無しさんNGNG
>>668 ( ´,_ゝ`)プッ・・
0670デフォルトの名無しさんNGNG
>>667
爆弾? 新型でてるのか??
0671デフォルトの名無しさんNGNG
C6とかC7って首都高みたいだな。
0672デフォルトの名無しさんNGNG
タイトルバーの文字列ってどう変更するんでしょうか?
実行途中で変えるとか起動時に変える
というのではなく、デフォルトを変えたいと言うか…
0673デフォルトの名無しさんNGNG
>>672
リソースストリングテーブルのIDR_MAINFRAMEに
・SDIなら先頭から\nまでの文字列
・MDIなら文字列そのもの
がタイトルバーに表示されるような気がした。
0674672NGNG
>>673
変更できました
ソースを必死で検索してました…

ありがとうございました
0675デフォルトの名無しさんNGNG
>>674
大サービスついでに言っとく。
ttp://www.ne.jp/asahi/hishidama/home/tech/vcpp/caption.html
0676デフォルトの名無しさんNGNG
>>675
リンク先のページで、動的に変える場合は SetWindowText とか使えとなっているけど、
CFrameWnd::SetTitle で変えるか、GetTitle をオーバーライドして変えておかないと
不意に元に戻されて「MFCは陰で何やってるかわかんない・・・APIだけの方がラクぽ」
ってことになるので注意。
0677デフォルトの名無しさんNGNG
TCHARと_TCHARのちがいってなんですか?
0678デフォルトの名無しさんNGNG
>>677
_TCHAR
 tchar.hが_UNICODE/_MBCSが定義されているかで切り替える。
TCHAR
 windows.h(の中のwinnt.h)がUNICODEが定義されているかで切り替える。LPCTSTRなどの仲間がいる。
0679デフォルトの名無しさんNGNG
質問させてください。

MFCでSDIのプログラムを作っています。
ビューの基本クラスをCTreeViewにしています。

フレームのメンバ関数から、ビューのメンバ関数を使えずにいます。

ビューの基本クラスがCViewの場合、ポインタをGetActiveViewで取得でき、
そこからメンバ関数を使えると思うのですが、
自分のプログラムの場合、CTreeViewなので、GetActiveViewの戻り値を
CTreeViewにキャストして関数を使ったところ、コンパイルは通るのですが、
アドレスがおかしいなどのエラーがでました。

どなたか知恵をかしてください。

0680デフォルトの名無しさんNGNG
>>679
まずはデバッガで GetAvtiveView が返してきたものを見てみたら?
0681デフォルトの名無しさんNGNG
>>679
そりゃCTreeViewにキャストしたらCTreeViewまでのメンバしか使えないでしょ。
0682679NGNG
>>680
ぬるっす。
わかりました。OnCreateでやってたからだめなんですね。
Activeじゃないですものね。

ありがとうございました。
0683デフォルトの名無しさんNGNG
質問です。
エクスプローラの超簡易版みたいなものを作っています。
ツリービューでの表示と展開はできるようになったのですが、
たとえば展開しているフォルダに別アプリなどで新しいフォルダ
を作成した時、すぐにエクスプローラの表示に反映させるには
どうすれば良いでしょうか?

MFC6.0です、よろしくお願いします。
0684デフォルトの名無しさんNGNG
>>683
FindFirstChangeNotification
0685デフォルトの名無しさんNGNG
>>684
ありがとうございます!
0686デフォルトの名無しさんNGNG
>>678
回答ありがとうございます。MFCだと_TCHARがよさそうなので_TCHAR使います。
0687デフォルトの名無しさんNGNG
MFCアプリのGUIスレッドでメッセージだけでなくCEvent等の
監視も行いたいと考えています。とりあえず考え付くのは
CWinThread::PumpMessage内のGetMessageの前、又は
OnIdleにてMsgWaitForMultipleObjectsを呼ぶ方法です。
CWinThread::RunのoverrideにしてもOnIdleのブロックに
しても余り一般的とは思えず躊躇してます。

似たような事をやったことある人がいれば意見をお願いします。
0688デフォルトの名無しさんNGNG
>>687
AfxBeginThread()でスレッドを作り、その中でシグナルイベント待ち。
ユーザーインターフェーススレッドに対して通知をしたい場合は、
WM_USER以上のユーザー定義メッセージを送信する。
受け取る側でもメッセージをユーザー定義メッセージ受信できるようにしておく。
0689デフォルトの名無しさんNGNG
MFCベースアプリで実装されている機能についてプラグインにすることになったのですが
プラグインとはどうやって作ればいいのでしょうか?
0690デフォルトの名無しさんNGNG
>>689
susieプラグインで練習してみれば?
0691デフォルトの名無しさんNGNG
>>688
WM_USERじゃ拙いって。WM_APPを越える値がお勧め。

>>687
私のアプリでは、タイマーでイベント監視をした。
イベントの場合は落とし穴がいろいろあるから気をつけてや〜
0692687NGNG
>>688
別スレッドだとスレッドスイッチが多くなるのが少し
気になります。

>>691
タイマーだと処理周期が頭打ちとなってしまいそうです。

基本的には688の方法でもパフォーマンス的にはOK
だと思いますが、MsgWaitForMultipleObjectsを使えば
監視するだけのスレッドを立ち上げずにすむかなぁと思い
質問しました。
0693デフォルトの名無しさんNGNG
ActiveXをDllに組み込み、プラグインにしたいです。
メニューのプロジェクトへ追加、コンポーネントとコントロール・・を使って追加すると
ラッパクラスが出来ると思うのですがこれを使うことは出来るのでしょうか?

このクラスのインスタンスをDll側のグローバルに用意してもいざメソッドを呼ぶと
void AFX_CDECL CWnd::SetProperty(DISPID dwDispID, VARTYPE vtProp, ...)
{
  ASSERT(m_pCtrlSite != NULL); // not an OLE control (not yet, at least)

で引っかかってしまいます。
このクラスは使わずに自分でCreateInstanceするのですか?
0694デフォルトの名無しさんNGNG
>>692
処理速度が問題になるなら、イベントでの同期は検討しなおした方がよくない?
イベントはそれ自体早くないと思うし、発行側は処理側が処理したことを知りえないから
何らかの方法で返信しないといけなくなるしね。
0695デフォルトの名無しさんNGNG
>>687,692
質問者の分際で、評論家・審査員を気取ってんじゃねーよ、クソが
0696デフォルトの名無しさんNGNG
MFC使っときながらスレッド生成のコストを気にする人には困ったものだ。
単にスキル不足なだけちゃうんかと。
0697デフォルトの名無しさんNGNG
>>696
お前が偉そうに言うな
0698デフォルトの名無しさんNGNG
CStringのoperator=の戻り値にconsが付いてるのはなぜですか?
何故こんなこと思ったかというと

CString& func(CString& str)
{
CString tmp;
// 処理
return str = tmp;
}

returnのところで
error C2440: 'return' : 'const class CString' から 'class CString &' に変換することはできません。(新しい動作 ; ヘルプを参照)
変換で修飾子が失われます。
と出たからです。

std::string::operator=の戻り値にはconst付いてないのに、CStringに付いてる意図はなんでしょうか?
0699デフォルトの名無しさんNGNG
>>698
CStringが作られた頃のC++は代入演算子の結果がCと同じく右辺値だったからじゃない?
それでCStringもそれに合わせてoperator =()の戻り値を値渡しに……するとオーバーヘッドがかかるんでconst参照にした、って具合。
0700デフォルトの名無しさんNGNG
>>698
WTLって知ってる?マイクロソフトのサイトからダウソできるよ。
WTLのCStringだと、constじゃないよ。
WTL::CStringで解決。終了。
0701デフォルトの名無しさんNGNG
>>700
>意図はなんでしょうか?
って聞いてるんだから、その答えじゃ解決になってませんよっと。

ちなみに、手元にあるVer7.1(build 3340)ではconstで
最新のWTL7.5.4196.0 では付いてませんね。
0702700NGNG
>>701
マジですか?よく調べずに書いてしまった。
当方、WTL7.5です。
>>698さん、そんなわけでスマソ。忘れて下さい。
0703700NGNG
>>702
なりすましはやめてください。
0704デフォルトの名無しさんNGNG
早く夏休みが終わりますように…(ナムナム
0705yara ◆SSLypP3Luo NGNG
VC2005か.NET Framework SDKにMFCある?
0706デフォルトの名無しさんNGNG
CSplitterWndを用いて分割しCListView、CHtmlView等を貼り付けてブラウザを作っております。
http://www.codeproject.com/miscctrl/simplebrowserformfc.aspを参考にして
メモリ上のHTMLを書き込むと言うプログラムを作成いたしました。

このプログラムはCListView上のキーダウンのタイミングでCHtmlViewを書き換えるものです。
これは上手くいったのですが、問題が出てきてしまいました。

CHtmlViewをクリックしたあとに、CListView上にクリック等で戻りキーダウンすると
FocusがCHtmlViewに移動してしまうのです。
このときにメモリ上のHTMLファイルを書き込んでおりまます。

どうやら、HtmlViewをクリアする所あたりで問題が起きているようなのですが。
また、CHtmlViewをクリックを一度もしない場合においては問題なく動いております。

SetFocusでCListViewにセットし直しても、上手く動かないようです。

何か良い案、参考情報へのリンクなどお知りでございましたらご教授ください。
0707デフォルトの名無しさんNGNG
>>706
SetActiveViewとかどうよ?(試してないが)
ついでに
>お尻でございましたら
「ご存知でしたら」じゃね?
0708706NGNG
>>707
お恥ずかしい(涙

SetActiveViewを試してみたのですが、上手くいきませんでした。
0709デフォルトの名無しさんNGNG
起動と同時にタブコントロールを生成しようと、
C○○ViewのOnInitialUpdateで
CTabCtrl.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 200, 80), this, 100);
を呼び出すと、SDIだと上手くいったんですがMDIでは何故かタブが生成されません。
エラーが出る訳でもなく、thisをGetWindow(GW_CHILD)に変更するとMDI子ウィンドウに生成されるので、
指定するウィンドウか生成するタイミングが間違っていると思うのですが色々試しても分かりません。
原因の分かる方、教えて下さい。
0710デフォルトの名無しさんNGNG
すでに(VIEWの)ウィンドウがあるかどうかくらいは確認したんだろうな?
0711デフォルトの名無しさんNGNG
コンボボックスについて質問です。

コンボボックスのエディットコントロールでテキストを変更した場合、OnCbnEditchangeXXXXが呼ばれますが、
このエディットコントロールのテキストの内容を取得する方法を教えてください。
0712デフォルトの名無しさんNGNG
>>711
「テキストの内容」ってなんだ?
GetLBText()じゃないの?

つーかリファレンスでメンバ関数のチェックぐらいしたんだろうな?
0713デフォルトの名無しさんNGNG
>>712
失礼しました。
誤)テキストの内容
正)エディットボックスの内容

その関数だとリストボックス内のテキストです。
エディットボックス内のテキストを取得する方法が見つかりません。
0714デフォルトの名無しさんNGNG
GetWindowText
0715711NGNG
>>714
ありがとうございました。
0716デフォルトの名無しさんNGNG
VC6.0で開発しています。

IEコンポーネントを使ってネット上からhtmlファイルを取得し、
解析して保存したいのですが、
ブラウザ画面を表示させたくはありません。

IEコンポーネントのうちURLからコンテンツを取得する機能と
htmlコンテンツを解析する機能を使いたいのですが
どのようにすればよいのでしょうか?
0717デフォルトの名無しさんNGNG
>>716
「解析」というのが何を指しているのか分からないね。
IEコンポーネントを使うって書いてあるけど、ブラウザ・エンジンを使うってのは
普通レンダリングさせるためであって、ファイル内容をHTMLコードとして見る
だけなら必要ないことのはずだが?
0718716NGNG
>>717
レスありがとうございます。

> 「解析」というのが何を指しているのか分からないね。

テーブルで表示されてる表などを整形してリスト表示したり
したいです。

> IEコンポーネントを使うって書いてあるけど、ブラウザ・エンジンを使うってのは
> 普通レンダリングさせるためであって、ファイル内容をHTMLコードとして見る
> だけなら必要ないことのはずだが?

ごもっともです。
・URLからhtmlコードを簡単に取得できそう。
・IE対応のページを確実に解析できそう
というのが理由です。

htmlの解析という視点に立つと他の手段はあるのでしょうか?

0719デフォルトの名無しさんNGNG
DOMオブジェクトとかのドキュメント構造を取得したいってことじゃないの?
0720デフォルトの名無しさんNGNG
>>719

そうです。
でもXMLパーサーでは解析できませんよね?
一応試して見ましたができなかったので
IEコンポーネント使えば確実だろうと思いました。
0721デフォルトの名無しさんNGNG
http://www.asia.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vcsample/html/_sample_mfc_tear.asp
0722デフォルトの名無しさんNGNG
CHtmlViewってのはあくまでViewであって表示させるためのものだと思うが?
中身をデータとして扱いたいならCHttpXXX系やCAsyncSocketなんかを使って
ファイル・データをもってきて自分で使いたいように加工するもんだと思う。
0723デフォルトの名無しさんNGNG
軽いHTMLパーサならCodeProjectとかSourceForgeとかにありそうだけどな。
0724デフォルトの名無しさんNGNG
>>722
自分でparseしたくないって話だっただろ。
GetHtmlDocumentでドキュメントインターフェイスの取得できるし。
0725デフォルトの名無しさんNGNG
>>720
IEコンポっていうか MSHTML っていうのが MS の html エンジン。
IE も WebBrowser Control もコレ使ってる。
使い方のサンプルは以下にあるよ。
データを持ってくるところは自分でやることになるような気がするけど。

http://msdn.microsoft.com/archive/en-us/samples/internet/browser/walkall/default.asp?frame=true
0726720NGNG
みなさまありがとう

>> 721,725を見ましたが
この二つの組み合わせでうまくいきそうです。

感謝しています。
0727初心者DNGNG
今、メニューの項目からダイアログを開いて値を入れて
OKを押したら、その値を元にCPenの絵が動くっていう
ソフトを作ってます。
ダイアログを表示するのはクラスCxxxAppに、
CPenで書かれた絵はOnDrawじゃなくCxxxViewクラスの中にpublic:として
HogeDraw()(OnDrawじゃないっす)を作ってあります。
ダイアログの関数に
if( Hoge.DoModal() == IDOK ){
  クラスCxxxViewのメンバ関数HogeDraw(ダイアログの値を引数にする)
}
としたいのですが、どう記述すれば良いのですか?
参考になりそうなサンプルとかあったら教えてください。
対処できずにはや3日ほど経ちました…
0728& ◆RdmUjfVKqQ NGNG
簡単に言うとCxxxAppの中で
CxxxViewのHogeDraw(引数あり)を使いたいんですが、
どう変数を宣言すればいいのか、どうポインタを渡せば良いのか
分からないってことです。
すいません、お願いします。
0729デフォルトの名無しさんNGNG
名前が化けました。727=728です。
0730デフォルトの名無しさんNGNG
とりあえず、地道に勉強してくれ。
0731デフォルトの名無しさんNGNG
3日もあればかなり勉強できる(・∀・)!
0732デフォルトの名無しさんNGNG
ネットワークスレから移動してきました。
再質問します。
677 名前:デフォルトの名無しさん :04/09/09 22:52
ライブラリに依存する質問になってしまいますが、MFCのCAsyncSocketのOnXXX()は、
どういう仕組みで呼び出されるのでしょうか?
もし、メッセージポンプを経て呼び出されるのなら、OnXXX()の中では長時間の処理が
出来なくなりますが、皆さんどう対処しているのでしょう?


678 名前:677 :04/09/09 23:38
ソース見てみました。
カレントスレッドのメッセージポンプを利用するみたいですが、あってますか?
もしかしてスレ違いでしょうか?
0733732NGNG
CWinThreadはメッセージポンプが付いているそうですが、
これを利用すればいいのでしょうか?
0734デフォルトの名無しさんNGNG
よく分らないけどメッセージハンドラ内でどうしても処理が長くなるのなら
処理をスレッドに配置してスレッド起動をして、そのままメッセージハンドラを抜けてしまえばいいんじゃない?
ってか何をするのかによる。本当に長い計算をするのならスレッドにすればいいと思う。
何かを待つのなら・・・何を待つのか聞きたい。

0735732NGNG
>>734
例えば子プロセスの終了を待つとか。
0736732NGNG
Microsoftのサンプルでは、大抵子プロセスを待つ部分にワーカスレッドを使っているみたいですが、
ソケット側のちょっとした挙動の変化でGUIを止めたくないのです。
こういう要求って変ですか?
0737デフォルトの名無しさんNGNG
その場合、そのイベントハンドラからやっぱりスレッドを起動し、
そのスレッド内部でWaitFor系APIで子プロセスの終了イベントを待つ。
(たぶんその子プロセスのハンドルかなんかがそのままイベントとしてWaitできると思った。)
そんで、WaitForSingleObjectを抜けたらメインスレッドにメッセージをポストしてスレッドはそのまま終了。
というのはどう?
0738デフォルトの名無しさんNGNG
>>737
おそらくそれが正当な方法なんでしょうね。
Microsoftのサンプルもそういう形が多いです。

ところで、複数のサーバが合わさった形のプログラムはどうインプリメントするべきなんでしょうか?
たとえば、HTTP、FTPなどが組み合わさっているようなものです。
もし、あるサーバで異常が起こった場合、タイムアウトなどによって回復されるまでの期間
GUIが重くなる事態は避けたいと思います。
各サーバごとにUIスレッドを分けるといいのかな?などと妄想しましたが、
普通はどうするものなのでしょうか?

HTTP、FTPというのはあくまでもたとえです。
0739デフォルトの名無しさんNGNG
別プロセスにして、サーバー同士はプロセス間通信しとけよ。
0740ディフォルトの名無しさんNGNG
VCでMFCを使用してアプリを作成したのですが、OSや環境によって正常に
動作しないなんてあるのでしょうか?
 日本語版や英語版のWINDOWS環境では問題なく動作していたんですが
ドイツ版のWINDOWSでは動くPCと動かないPCが出てきました
動かないPCは、コンストラクション後にInitdialogに入らずにそのまま、
そのダイアログが終了してしまうという現象でした。
このようなことってあるんでしょうか?
0741デフォルトの名無しさんNGNG
>>739
プロセス間通信にもソケットを使おうとしています。
俺は異常でしょうか?
0742デフォルトの名無しさんNGNG
自分はCAsyncSocketを使ったことが無いのでなんともいえないですが
ワーカスレッドでバークレーソケットを使うなら
UIのスレッドとは別にサーバAとサーバBを別々のワーカスレッドにして
おのおのでソケットを作ってlistenしたりすると思う。
そしておのおののサーバスレッドはイベントをUIに通知するためにPostMessageして
メインスレッドと交信する。もしどっちかが死んだり固まったりした場合でリスタートしたいなら
仕切りなおしの同期の処理を設計する必要があるでしょう。

0743デフォルトの名無しさんNGNG
>>742
実は、そういう形で作っていたのですが、非同期に切り替えることにしました。
以前は、各ソケットにスレッドを割り当ててブロッキングしていたのですが、
非同期にするに当たってATLあたりからメッセージポンプをいただいて
自前のソケットクラスを拡張するか、MFCを使うか考えました。
そして簡単そうなMFCを使うことにしたわけです。

一つのプロセスでUIスレッドを複数使うのはあまり一般的ではないのでしょうか?
0744デフォルトの名無しさんNGNG
>>740
CWinApp派生::InitInstanceでDoModal呼ぶ前に抜けるコードパスも存在する場合がある。
ソケットを使うための初期化処理(Wizが自動インプリメント)に失敗したとか。
0745デフォルトの名無しさんNGNG
>>741
別に普通だけど?
0746デフォルトの名無しさんNGNG
実は、先ほどMFCソース(CAsyncSocket)を読んでみて余りのシンプルさと、
素直とは言えない作りに驚きました。
これだったら、自分で作り直したほうがいいのではないかとさえ思うのです。
皆さんはどう思いますか?
0747742NGNG
>>743
自分はUIスレッド複数はやったことが無いので、一般的かどうかについては
他の回答者の方の回答をお待ちくださいです。
0748デフォルトの名無しさんNGNG
既存のものを作り変える必要性が本当にあるかというのも気になる
既存のものの問題がもしブロッキングとかだったら正しくselectを使うなど
すれば回避できると思う。しかしそのブロッキングの解決策としてCAsyncSocketを使うのは
結局同じ問題に到達するかもしれない上に変なアーキテクチャのために振り回されるかも。
0749デフォルトの名無しさんNGNG
一般論として、技術があるなら自分でできるところまでやれば良いけど、自分で
やった分には責任を持たなくちゃいけないことになる。それを踏まえてどこまで
自分で「できる」のか判断して決めるしかないのでは?
0750デフォルトの名無しさんNGNG
>>732
OnXXX で(自らなにか)時間のかかる処理をするなら、
非同期でソケットを使う利点はまるでないと思うけど。

>ソケット側のちょっとした挙動の変化でGUIを止めたくないのです。
ちょっと状況が想定できないけど、どんなときにそういう問題がおきますか?
0751デフォルトの名無しさんNGNG
>>728
DDXでぐぐれ
■ このスレッドは過去ログ倉庫に格納されています