- 1 名前:デフォルトの名無しさん mailto:sage [2006/03/12(日) 16:08:39 ]
- おそらく、.NET開発でデファクトスタンダードに最も近い
であろうC++/CLIについて語ろうぜ! このスレはC++および.NET Frameworkについて一定以上の知識を持っている人が対象となります。 .NETのクラスライブラリの使い方といった質問は姉妹スレ「くだすれC++/CLI(初心者用)」に お願いします。 前スレッドはこちら (p)pc8.2ch.net/test/read.cgi/tech/1126450441/l50 姉妹スレ くだすれC++/CLI(初心者用) (p)pc8.2ch.net/test/read.cgi/tech/1142144110/l50 managed C++ やろうぜ!! 002 (p)pc8.2ch.net/test/read.cgi/tech/1139043535/l50
- 736 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 11:36:14 ]
- newやmallocはHeap系APIに丸投げでねーの?
- 737 名前:デフォルトの名無しさん [2007/12/26(水) 12:43:27 ]
- >>736
ん?システムコールに丸投げ? もっと,こう,自前でヒープを管理していると思うんだけど.
- 738 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 12:50:54 ]
- >>737
ちょいと階層は深いけど最終的にはそうなってるようだね>VC2005で確認。 そうなると500KB以上は個別にVirtualAlloc/VirtualFreeで、 小さいのは一元管理で縮小せずに再利用だろう。 もしかしてLINKオプションの/HEAPオプションは使われてないかも?
- 739 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 18:04:01 ]
- >>737
Win32APIはシステムコールではないよ。 Windowsのシステムコールは非公開でげすよ。
- 740 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 18:06:00 ]
- ttp://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%B3%E3%83%BC%E3%83%AB
システムコールとは、オペレーティングシステム (OS) (より明確に言えばOSのカーネル)の機能を呼び出すために使用される機構のこと。 実際のプログラミングにおいては、OSの機能は関数 (API) 呼び出しによって実現されるので、 OSの備える関数 (API) のことを指すこともある
- 741 名前:デフォルトの名無しさん [2007/12/26(水) 21:10:12 ]
- >>739
Windows においてはシステムコールはサブシステムの裏に隠れて いて直接呼び出すことはできないってこと? Win32 API って POSIX レイヤと同じレイヤ?
- 742 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 15:37:07 ]
- 基本的に同じ。ただ、GDI関係は性能の都合でWin32 APIはカーネルのほうまで突っ込んでいたはず。
これをシステムコールというのかはわからないけど、 そういうサブシステムの下に位置するネイティブAPIと呼ばれるがNTDLL.DLLから公開されている。 9xの場合はVxDをDeviceIOControlで呼び出すことがシステムコールに相当するといっていいと思う。
- 743 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 22:22:48 ]
- ファイナライザって要らない子?
- 744 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 22:31:21 ]
- Disposeし忘れたときに必要
- 745 名前:デフォルトの名無しさん [2007/12/31(月) 00:50:26 ]
- C++/CLIくだすれって消えてる?あるならそちらに誘導してもらえれば嬉しいです(’・ω・)
おとなしくC#いけって話かなぁ。。。 ttp://homepage3.nifty.com/ishidate/vcpp05_6/vcpp05_6.htm ここを参考にしながらForm1_Paintが呼ばれたときに DrawlineとかDrawRectangleで描画するプログラム書いてるんですが、 その処理がとても重いので(他の理由もあるのですが)ボタンを押されたときだけ画面を更新するようにしたいんですが、どうしたら良いでしょうか。 (Form1_Paintだとウィンドウの移動などでも更新されてしまうので、それを避けたいということです。) button1ってボタン作って、button1_Clickに全部書きゃ良いじゃんとか思ったんですが、 引数が(System::Object^ sender, System::EventArgs^ e)なのでe->Graphicsを使えなくて困ってます。
- 746 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 05:08:13 ]
- メンバにBitmapとか描画バッファを用意して
button1_Clickで描画、PaintでBitBltが妥当じゃね?
- 747 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 10:55:55 ]
- >>745
Form.CreateGraphicsは? .NET使うならC#は読み書きできるようになった方がいろいろ便利だよ
- 748 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 10:16:58 ]
- あけおめです。
>>746-747 レスありがとうございます。 まず>>747のようにbutton1_Clickに Graphic^ g=CreateGraphics(); としてボタンでの描画は成功したんですが、今度はForm1_Paintが呼ばれたときに描画されたものが消えてしまったので >>746の方法をとろうとしたんですが、ドキュメント見たりググったりしてもいまいち描画バッファ→画面のBitBltのやり方が 分からなかったので、 www.atmarkit.co.jp/fdotnet/dotnettips/458picboxdraw/picboxdraw.html を見ながらpictureBox1を作って、 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { Graphics^ g = Graphics::FromImage(pictureBox1->Image); drawRandomWalk(g); pictureBox1->Refresh(); } こんな感じで解決しました。結果的には>>746の方法に近い?解決策となりました。 C#も勉強してみます(’・ω・) ありがとうございました。
- 749 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:39:43 ]
- make_publicの使い方に詳しい方いますか?
ReleaseでDLLをBuildするとリンクエラーが発生します。 >libtest.obj : error LNK2022: metadata operation failed (80131195) : カスタム属性が適合しません: (0x0c00021b)。 >Stdafx.obj : error LNK2022: metadata operation failed (80131195) : カスタム属性が適合しません: (0x0c000261)。 Debugでビルドするとエラーが発生しません。 make_publicはStdafx.h(PreCompileヘッダ)に記述しているのですが、 どう対処すればよいのでしょうか?
- 750 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 10:05:33 ]
- ガベージコレクションが走るスレッドっていうのは、どのスレッドかは確定してないんですよね?
ということは、ガベージコレクションが走る際に呼び出すアンマネージリソースの処理は スレッドセーフにしておかなければならないということかな? 具体的には参照カウントオブジェクトのラッパーをC++/CLIで作って.NETで使おうとしてるんだけど Release関数をスレッドセーフにしなきゃならんのかなと。 (Interlockedにすればいいだけの話なんで、それ自体はどうってことないのですが)
- 751 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 11:45:06 ]
- ファイナライザスレッドは独立したスレッドなのでどのみちスレッドセーフは必要だろう
- 752 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 13:40:31 ]
- ファイナライザ中でthisに属するオブジェクトも生存は保証されていないしね
本当に最後の手段なんだから、基本的にはGC任せにしない方がいいよ
- 753 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 13:43:49 ]
- 値型メンバは確実に生存してるぜ? その値型が持つ参照型はともかく
- 754 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 13:48:15 ]
- >>751-752
ありがとうございます。 明示的にDisposeてことになると思うんですが、 そうなるとDisposeしなければならないインスタンスを持つクラスがデータ構造の奥深くにあると どんどんDispose呼び出しが感染していって親クラスのとこまで行ってしまいますよね。 面倒くさいなぁと思いつつも、仕方が無いなぁとも感じてるんですが やっぱりそんなもんですかね…
- 755 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 23:19:17 ]
- アンマネージリソースを取り扱う以上、これは仕方ねっス。
頭切り替えるしかねっス。 ちなみにアンマネージリソース絡みでSafeHandleてのもあるんスが、 これの経緯とか調べるとさらに頭痛のタネが増えるのでオススメっす。
- 756 名前:デフォルトの名無しさん [2008/01/19(土) 09:08:52 ]
- C++/CLIのメソッド引数に%をつけることについて質問があります。
マネージ型の配列や構造体をメソッドに渡すとき、”^”をつけますが、 この渡し方で配列や構造体の”ポインタ”が渡されると思っていました。 ”^”の引数があるメソッドを持ったクラスライブラリをVBで参照したら “ByVal”となっていました。 ここで質問ですが、”^”でなく”^%”としなければ配列や構造体が 値渡し(配列全体がCopy?)になるのでしょうか?%をつける、 という概念がC++/CLIで現れたため悩んでいます。 できるならば 配列や構造体は値渡しでなく、アドレス渡し、配列渡しをしたいのですが・・・
- 757 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 09:13:22 ]
- ^は参照型 そのまま渡すと参照をコピー
%はC++の&、C#のref/outに当たる参照渡し 「参照型 参照渡し」で調べればいいよ
- 758 名前:デフォルトの名無しさん [2008/01/19(土) 09:54:02 ]
- >>757
ありがとうございます。調べてみました。参照型の^引数はアドレスをコピー、参照型の^%渡しはアドレスを参照渡しする、ということですね。 ということは参照型の場合、どちらの方法で渡してもパフォーマンスに大きな影響はないということでしょうか。 参照型と参照渡しの違いを理解しないといけないのですね。
- 759 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 10:52:27 ]
- .NETで参照渡しはあんまり使わないよ
参照で渡すことが多いんだったら初めから参照型にする
- 760 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 22:59:01 ]
- TryParseとかあるじゃん
- 761 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 21:33:21 ]
- スレ立ったのが2006年とかC++/CLIは使われてないの?
今からやるならC#のがいいかね?
- 762 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 22:06:34 ]
- アンマネージC++もC#も使えるようになった上で、
もしも必要に迫られたときにやっと登場する言語だからね
- 763 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 22:54:30 ]
- 俺は間違っても#なんか使わん。意地でCLI
- 764 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 22:55:23 ]
- シーナンバー
- 765 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 16:42:52 ]
- >>761
そりゃ今からやるならC#だな それよりVB.NETがいいに決まってるけどw 少なくともC++/CLIなんて論外だ まあ.NETやること自体が間違いかもしれないが・・・
- 766 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 01:51:49 ]
- なぜVBを推すのか
- 767 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 23:32:44 ]
- ref じゃないクラスで managed なクラスのイベント捕まえようとしてるのだけど
やり方がわからないので教えてください。 ref class hoge { event EventHandler ^ev; }; class hoge_wrapper { hoge ^_hoge; void OnHogeEv(System::Object ^o, System::EventArgs ^); hoge_wrapper(hoge ^_hoge) { this->_hoge = _hoge; _hoge->ev += gcnew System::EventHandler (this, &hoge_wrapper::OnHogeEv); } }; こんなコードを書いているのだけど EventHandler のコンストラクターでC3364のコンパイルエラーがでて怒られます。
- 768 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 23:52:38 ]
- >767
そりゃ、混合型は駄目だろ ネイティブはネイティブ、マネージドはマネージドで扱わないと
- 769 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:25:09 ]
- あ、hoge_wrapper::_hoge の型は
gcroot<hoge ^> _hoge; って宣言してました。転記ミスです。
- 770 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:59:04 ]
- いや、そこもそうだけど、gcnew しているイベント・ハンドラにネイティブの
ポインタ this を渡してるだろ? マネージドでイベントアダプタみたいな物を作ったら?
- 771 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:13:10 ]
- MAKE_DELIGATE っていうのを見つけて、試してみたら意図したとおりに動くみたいです。
中身を見てみたら 770 さんの言うとおりの動きなのかな? とりあえず解決しましたー。ありがとです。
|

|