ATL 相談室

このエントリーをはてなブックマークに追加
WTLのバージョンがあがったのに話題にもなりませんかそうですか・・・
WTLのスレは別にあるんで
2005BetaにはもうATL8.0付いてるの?
ちょいと聞きたいんだけど
MFCではメッセージハンドラ内で投げられたCException例外は
ハンドラ内でcatchしなくてもフレームワークがcatchしてメッセージBOXを出してくれますよね。
それと同じ様に、ATLでもハンドラから漏れ出た例外をcatchしたいのです。

とりあえず今はBEGIN_MSG_MAPとEND_MSG_MAPをコピペして
try, catchを追加した独自のマクロを使ってますが…
もっとスマートな方法は無いでしょうか?
>>930
template <class T>
class CExceptionCatcher
{
 public:
 static LRESULT CALLBACK WindowProc(
   HWND hWnd,
   UINT uMsg,
   WPARAM wParam,
   LPARAM lParam
 )
 {
  try
  {
   return T::WindowProc(hWnd, uMsg, wParam, lParam);
  }
  catch (...)
  {
   ...;
  }
  return 0L;
 }
};
なんてのを継承するのはどう? WindowProc を持っているクラスを判断してテンプレートパラメータに
しなきゃいけないところがなんか泥臭いけど・・・
>>931
ありがとうございます。
いいかも、と思ったのですがCWindowImplBaseT<>::WindowProcを見てみると
例外のこと考慮されてないっぽいのでなんか危なそうです。
できればProcessWindowMessageから外に例外を出さないようにできないかなと考えて思いつきました。

#define MSG_MAP_TRY try {
#define MSG_MAP_CATCH(type, func) \
} \
catch(const type& e) \
func(e); \
}

BEGIN_MSG_MAP(theClass)
MSG_MAP_TRY
// この間のハンドラで起きた例外をキャッチする
MSG_MAP_CATCH(std::exception, ExceptionFunc)
END_MSG_MAP()
WSHのGetObject 関数みたいに
未登録コンポーネントのインスタンスを作成する方法はありますか?
934デフォルトの名無しさん:04/07/25 15:39
あげとこう。
MFCもATLも最近始めたばっかりなんだがどう使い分けたら
いいのかサパーリわからん。
ATLで開発するときに、MFCは絶対使わない前提ですが
GDIのAPIなんかをいちいちSTLでラップしてますか?

あ・漏れはめんどくさいからしません。
最近、10年前のWindows API(16ビット)サンプル多数つきの本が
すごく役にたったりしてます。

WTL。
STLでラップって何よ
>>936の文は支離滅裂な感じがする。
>>936
CDC とか使うか?って話?漏れは使ってない。
使う価値がたいして感じられないから。

しかし CHandle なんかは C++ 特有のスコープ外れたら
破棄されるあたりが便利なので使ってる。
いちいちラップとか書いてるから、CDCも知らないんじゃ
DrawTextでストリングクラスを受けたりするかってことじゃないのか
あぁ、STLでラップってstd::stringで受けられるようにするって意味か。
なるほど。でも STL でラップしたい関数(群)ってそんなにあるかな?
文字列はどっちかっていうと CComBSTR 使ってるし・・・
俺もCStringで足りるなぁ。
どうせstring(CStringでもいいけど)を引数に使うメリットったって、
文字数を関数に渡さなくて良いとかその程度だべ?
GUIアプリあまり作らない人間にとってはstd::stringの方が馴染み深いと思う
でもそれだけのためにいちいちラップっていうのも。
俺ならc_strでいいやと。
948はじめて:04/08/09 20:21
System.Stringでいいやと。
おじさんつまんなーい。
951
952936:04/08/10 08:11
STLでラップって、少々言い方が悪かったです

HDCに関わる操作クラスを自作する。テンプレートクラスとかのSTL
機能も利用して再利用可能なクラスを作る。って事をしたほうが合理的か
どうかって事を聞きたかったのです。

>>940
CDCって、MFCをインクルードしたプロジェクトで有効でしょう?
MFCは使いたくないのでAPIごりごりなわけじゃないですか
やっていて、自分なりの結論としては、とりあかずAPIごりごりが
正解な気がします。これで動作したら後々クラス化できると思うし

> テンプレートクラスとかのSTL 機能
用語の使い方がおかしい。
> CDCって、MFCをインクルードしたプロジェクトで有効でしょう?
なんども言われているが、WTLにすでにある。
>>953
WTLのスレにいってきます
やっぱりただの無知だったのか
>>955
行ってきましたがこれを学習するよりも
API直書きのほうが効率が良いと思いました。
>>956
マテマテ。
WTL くらいは使っても良いと思うぞ。メッセージマップとか。
その辺だけならドキュメントを1時間も読めば使えるだろうから、
「学習する」って程のものでもないし。
皆につっこまれて意地になってるだけだろ。
いえいえ、>>958意地になってなんかないですよ

実装が既に終わりましたので。次回の機会に使わせてもらいます。
ところでVC++6とVC.NETで同じソースをビルドするとして
VC++6(SP6)プロパティページダイアログの動作が怪しいなんて事ありませんか?

.NETビルドのATLはVB6には貼れない
VC++6ビルドのATLは.NET VBに貼れる
互換性についてのドキュメントってどこにあるのでしょうか?
教えて君でスマソ
日本語がめちゃくちゃだな
なんか言うばかりでレアな実装している人はいないんだな
また俺語ですか<レアな実装
レアな実装とは、往々にしてアレな実装である
IWebBrowser2 についてお聞きします。

Navigate 先を about:blank にしメモリ上の HTML を表示する、
という処理は書けたのですが、この HTML 内にある、
相対リンクがどうにも意図どおりに解釈されません。

具体的には
・外部スタイルシートを実行ディレクトリからの
 相対URL指定しても無視される。
・この文書内のアンカーへまともに飛べない。
 #some_where に行こうとすると
 about#some_where なる何も無いページを表示する
と言った症状です。

普通にテンポラリファイルに書き出して、
サクっと読み出すのが吉なんでしょうか?
質問させてください。

ATLの勉強のために、MSDNの ATL チュートリアル を参考にして作っていました。
このチュートリアルで説明しているコントロールに、htmlのparamタグを使って
値を渡せる機能を追加しようとしたんですが、タグに指定した値にはならず
デフォルトの値から変化しませんでした。
どの用にすればこの機能を使うことが出来るでしょうか

調べたところ、IPersistPropertyBagを使えば出来るようになるということで
使ってみたんですが、症状は変わりませんでした。
新規プロジェクトのウィザードで属性のチェックをつけた状態(チュートリアルではチェックを外していました)で、
IPersistPropertyBagを使ったときは上手くいったんですが、その状態ではイベントを追加することが出来ませんでした。
(追加してビルドするとfire_ClickInとfire_ClickOutというメソッドがないというようなエラーが出ます。)

参考にしている ATL チュートリアル
ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vccore/html/_atl_ATL_Tutorial.asp
967デフォルトの名無しさん:04/08/14 22:12
あげとこう。
>>966
IObjectSafetyを実装して、INTERFACESAFE_FOR_UNTRUSTED_CALLER と
INTERFACESAFE_FOR_UNTRUSTED_DATA あたりはサポートした?

あと IPersistPropertyBag は、キミの追加したプロパティの保存と読み込みを
勝手にサポートしてくれたりは「しない」から、ちゃんとBEGIN_PROP_MAPとか
使ってプロパティを登録してあげる必要があるけど、これはやってますか?
969966:04/08/16 21:19
すいません、自己解決しました

public IPersistStreamInitImpl<CMyCtrl>,
public IPersistPropertyBagImpl<CMyCtrl>
COM_INTERFACE_ENTRY_IMPL(IPersistStreamInit)
COM_INTERFACE_ENTRY_IMPL(IPersistPropertyBag)
COM_INTERFACE_ENTRY_IMPL_IID(IID_IPersist, IPersistPropertyBag)
を追加することで解決することができました。

参考ページ
ttp://www.faqchest.com/msdn/ATL/atl-97/atl-9710/atl97100800_09033.html

お騒がせしました。

>>966
返信ありがとうございます。

>IObjectSafetyを実装して、INTERFACESAFE_FOR_UNTRUSTED_CALLER と
>INTERFACESAFE_FOR_UNTRUSTED_DATA あたりはサポートした?
INTERFACESAFE_FOR_UNTRUSTED_DATAはサポートしていませんでした。
パラメータの安全性が保障されるとの事なので追加したいと思います。

>あと IPersistPropertyBag は、キミの追加したプロパティの保存と読み込みを
>勝手にサポートしてくれたりは「しない」から、ちゃんとBEGIN_PROP_MAPとか
>使ってプロパティを登録してあげる必要があるけど、これはやってますか?
確認したところ、やってありました。
970966:04/08/16 21:20
>>968
すいません、アンカーミスです
968さんありがとうございます
971デフォルトの名無しさん:04/08/28 12:43
あげとこう。
972はじめて:04/08/31 02:26
ATL.NETキタ━━━━(゚∀゚)━━━━ッ!!
ttp://www.atl.net/
973マイク ◆yrBrqfF1Ew :04/08/31 02:58
ATLはキモイな。
内容がな(ry
内容がなんと水鳥拳
976デフォルトの名無しさん
あげとこう。