トップページ⇒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 の辺り。
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でぐぐれ
0752デフォルトの名無しさんNGNG
DDXなんか関係ないじゃん
0753デフォルトの名無しさんNGNG
>>728
CxxxViewクラスのポインタをグローバル変数かどっかに保存しておけばよろしいかと。
0754デフォルトの名無しさんNGNG
>>727
ビュークラス内からダイアログを起動すればいいだけの話でしょ?
0755デフォルトの名無しさんNGNG
>>727
ビュークラスにメッセージ飛ばして、その先でHogeDraw()を実行する。
WM_APPなどでググってみれ。
ダイアログの値を渡す方法はいくらでもある。
グローバル変数でもCxxxAppのメンバ変数でも良し。
そのときはHogeDraw()はpublicじゃなくてもオッケ。
0756初心者DNGNG
>>727-729です。
皆さんありがとうございます。
結局、>>754さんのやり方でやりました。
CxxxViewクラスの中でメニューの項目からダイアログを出すっていう
関数を作ったのがなんか「?」って感じになってますが…。

>>755さんの
>ビュークラスにメッセージ飛ばして
をもうちょっと勉強してからやってみます。

勉強し直してきます…。
0757デフォルトの名無しさんNGNG
>>750
IEでもFFFTPでも挙動がおかしいときがありますよね?
操作を受け付けない時間が有りますよね?

自分の作るプログラムがそういう挙動を示さないとは思えないのです。
0758デフォルトの名無しさんNGNG
>>757
>操作を受け付けない時間が有りますよね?

…ないと思われ。OSがWin9xとか。
0759デフォルトの名無しさんNGNG
>>758
NT系でも同様だよ。
「操作」の定義があまりにもシェル寄りだね、その見方だと。
0760デフォルトの名無しさんNGNG
>>756
>>>755さんの
>>ビュークラスにメッセージ飛ばして
>をもうちょっと勉強してからやってみます。

せっかくMFC使ってるのに、そんな面倒なことしなくてもよし!
単に View にそのメニューのコマンドハンドラを追加すればいいだけだよ〜。
0761デフォルトの名無しさんNGNG
>>757
それは非同期ソケットの問題じゃないと思うけど。

漏れの経験ではそれなりに非同期っぽく作ったネットワークアプリが無反応になるのは、
gethostbyname を不用意に呼んでブロックしているケース、socket が connect / shutdown中で、
他スレッドから close しても停止できないケースが大半なんじゃないかな。
0762デフォルトの名無しさんNGNG
>>761
closeで停止できなかった場合に無反応になるのだとしたら、
何故無反応になるのですか?
0763デフォルトの名無しさんNGNG
>>762
>>761が正しいかどうか知らんが、デッドロックが起きてるとかでは?
0764デフォルトの名無しさんNGNG
非同期ソケットが便利なのは他のイベントと一緒に待てる点?
0765デフォルトの名無しさんNGNG
KFC最高。KFCあったらMacなんかイラネ
0766デフォルトの名無しさんNGNG
ウィザードでCWinThreadを継承してクラスを作るとコンストラクタとデストラクタが
protectedになるのは何故ですか?
特にデストラクタがそうなる理由がわかりません。
Microsoftのサンプルは全てpublicになっていました。
よろしくお願いします。
0767デフォルトの名無しさんNGNG
>>764
スレッドを少なく出来る部分に魅力を感じます。
Windowsでもpoll出来ますか?
出来るならそっちを使いたいです。
よろしくお願いします。
0768デフォルトの名無しさんNGNG
>>756
暮らすウィザードを一日中眺めていれば活路が見出せるはず。
ヒントは>>760
0769デフォルトの名無しさんNGNG
>>766
「何故」について考えることに意味があるかどうかだ。
しょせん同じ人間が用意したウィザードだぞ。
答えをいうなら、ウィザード作成者が徹夜明けだったからとしか答えようがない。
0770デフォルトの名無しさんNGNG
>>769
バグですかね?
たぶん意味があると思うのですが。
は!
わかったかもしれない!
もしかして、CWinThreadを継承したクラスは自分をマネージしないといけないんですか?
だとすると納得いく。
ちょっと実験してみます。
0771デフォルトの名無しさんNGNG
マネージってなんだよ。
専門用語?それともカッコイイっぽいから使ってるだけ?
0772デフォルトの名無しさんNGNG
>>771
カッコイイから使ってみました。
0773デフォルトの名無しさんNGNG
>>770
動的生成されることを前提にしてるからprotectedにしたほうが安全だと想ったんじゃない。
IMPLEMENT_DYNCREATEとかCRuntimeClassあたりで。
0774デフォルトの名無しさんNGNG
ビットマップリソースをスタティックテキストに表示する方法を教えてください
0775 ◆HsptrkZmYk NGNG
>774
vrubyでググろう
0776デフォルトの名無しさんNGNG
カッコイイだけでカタカナ語使うのは馬鹿だと思われるよ。
「コイツ、話を誤魔化してる。もしくは何も判ってない。」と思われるだけ。
0777デフォルトの名無しさんNGNG
>>776
はい。誤魔化していました。
素直にわかりませんって書けばよかったです。

>>773
そうみたいです。
でも、デストラクタはどうしてなんですかね?
破棄するときどうなるのだろう?
0778デフォルトの名無しさんNGNG
おい、CWinThreadの質問してるヤシ、ドキュメントちゃんと読んでるのか?
new/deleteで生成すると書いてあったか?
0779デフォルトの名無しさんNGNG
ピクチャコントロールでビットマップを透過したいのですがどうすればいいですか?
0780デフォルトの名無しさんNGNG
動的生成=newじゃねーよ、そもそもデストラクタがprivateならユーザーが明示的にインスタンスを作成できない。
0781デフォルトの名無しさんNGNG
もちろん内部じゃnewとかしてるけど、そういうどうでもいいところに突っ込むなよ。
0782デフォルトの名無しさんNGNG
>>779
マスクパターン
0783デフォルトの名無しさんNGNG
>>778
スレッドを自殺させたあとにメモリーをチェックするとリークしていると報告されるのですが、
これは何故なんでしょう?
0784デフォルトの名無しさんNGNG
自殺のさせ方が悪かったのだろう。
TerminateThreadを使ったのか?
0785デフォルトの名無しさんNGNG
>>784
PostQuitMessageしてみました。
0786デフォルトの名無しさんNGNG
>>785
だれがどのタイミングで?
0787デフォルトの名無しさんNGNG
ナンーカ
根本的に間違っているような母艦
0788デフォルトの名無しさんNGNG
ボタン1とボタン2で同じハンドラ関数を呼び出してるんですが、どちらが呼び出したか判定する方法ありませんか?
0789デフォルトの名無しさんNGNG
GetCurrentMessage
0790デフォルトの名無しさんNGNG
>788
MFCよくわかんないけど (じゃあなぜこのスレにいるんだつーツッコミは禁止だ)
Win32APIレベルで考えると、ボタンを押されたら親ウィンドウに
WM_COMMAND をポストされるよな。BN_CLICKED と コントロールID と
ご丁寧にボタンのウィンドウハンドルまでつけて。
コントロールID やウィンドウハンドルで選別すればヨロシけれ。

もれ普段MFC使わずにナマで書いてるけど、いちいちコントロールID設定するの面倒なんで
ウィンドウハンドルで選別してるw
究極のDQNグラマとはもれのことよw
0791デフォルトの名無しさんNGNG
じゃあなぜこのスレにいるんだ
0792デフォルトの名無しさんNGNG
SDKでプログラムしていてもWindowsアプリっぽくするためには
MFCのトリックをパクったりするのが有効だからだろ。
■ このスレッドは過去ログ倉庫に格納されています