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
647 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 16:58:28 ] それよりおれは>>635 の1行目が気になる
648 名前:デフォルトの名無しさん [2007/11/03(土) 09:36:00 ] それよりおれは>>647 の1行目が気になる
649 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 01:27:44 ] C++/CLIって、仕事あるか?
650 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 14:08:18 ] >>647 実は俺も気になってた。
651 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 16:50:50 ] >>649 3ds/maxの会社
652 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 17:38:42 ] CLI穴だらけじゃん(`Д')ノ じゃあみんなで補完しあおうぜ(=゚ω゚)ノ 議論盛り上がりまくり(゚д゚)ウマー ドトネト対応(・∀・)イイ! ってのが製作者の狙いということか( ゚Д゚)ハッ いや…なん違うような(;´Д`)
653 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 21:55:56 ] なすてnullptrなんて作たんだろ、nullで統一してよ
654 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 00:15:35 ] ぬるぽ
655 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 00:37:10 ] >>653 > なすてnullptrなんて作たんだろ、nullで統一してよ '\0' と混同する人がいないとも限らないからかな…
656 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 00:52:35 ] #define null 0としているプログラムは探せば結構ありそうに思う。 そんなコードでも変更なしに使えるようにという配慮では?
657 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 18:41:43 ] え C++/CLIはヘッダーに全部実装するのが流儀だろ cppファイルなんていらんのですよ
658 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 20:35:57 ] 実体化しないのかよ まさか、プリコンパイルヘッダに全部うわなんだおまえやめr
659 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 10:19:51 ] >>649 このあいだ、基本は.NETライブラリで、ネイティブ用のI/Fも欲しいって仕事があって 何を使っても良かったし、ずっと自分が面倒みる事になる事は分ってたから C++/CLI のラッパーで対応したが。 レアケースなのは間違いないな。
660 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 10:29:36 ] >基本は.NETライブラリで、ネイティブ用のI/Fも欲しいって これ、何ていうドトネトアプリの破滅。
661 名前:デフォルトの名無しさん [2007/11/11(日) 16:39:40 ] >>え C++/CLIはヘッダーに全部実装するのが流儀だろ あ、やはりそうなのか?
662 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 17:10:26 ] こより的には、そのやり方はちょっと…
663 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 19:56:20 ] C#でいう「インターフェイス メンバの明示的実装」をやるにはどうすればいいの?
664 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 20:35:39 ] 自己解決 private: virtual Object^ Clone() = ICloneable::Clone { ... }
665 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 21:43:18 ] CLI 部分については C++/CLI って C# よりむしろ VB に近いと思う瞬間の一つだな raise とか
666 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 22:15:02 ] >>662 マイナー杉
667 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 11:38:24 ] >raise とか これ、何てDelphi?
668 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 22:11:41 ] 2008入れてみた。 STL/CLI使えるぽ。
669 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 00:02:11 ] .net fx 2.0 指定でも使える?
670 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 09:45:51 ] この言語って、どの程度流行ってんの?
671 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 09:49:10 ] 各国で静かなブームですよ
672 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 11:01:19 ] TreeViewとListViewにxVN_GETDISPINFO相当の機能がなかったので、 Controlから派生させて自作したよ('A`) (VirtualModeもパフォーマンスがよくなかった・・・) C#だとAPIや定数の定義が面倒だが、C++/CLIだとWin32ヘッダそのままインクルードして使えるから楽でいい。 だがそんなことするくらいなら最初っから つMFC ・・・そんな感じだ。
673 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 11:21:38 ] メッセージぐらいならわざわざControl使わんでもどうとでもなるが。 Notify系メッセージならWM_REFLECTION付きで当該コントロールに来るし。
674 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 11:22:08 ] いやWTL最強
675 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 21:35:28 ] >>673 メッセージぐらいではどうにもならんのですよ。 WM_NOTIFY + WM_REFLECTでメッセージ引っ掛けても、先が続かん
676 名前:デフォルトの名無しさん [2007/11/27(火) 18:43:18 ] Windowsプログラムを組む必要がない場合 CLIを勉強する意味ある?
677 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 18:44:30 ] Windows以外で動く独自のCLIを開発する場合とか。
678 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 18:48:44 ] ( ゚д゚ )( ゚д゚ )( ゚д゚ )…
679 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 12:51:24 ] 独自にCLRを実装するなら、CLI の勉強は必要だな C++/CLI は不要だが
680 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 00:41:11 ] Object型の変数の値が、値型Tのボクシングされたオブジェクトであるかどうかを 調べるにはどうすればいいんでしょうか C#では obj is T とするところです
681 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 00:58:20 ] 参照型同様dynamic_cast<T^>(obj)がnullptrになるか否かで判定すればいい。
682 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 08:42:54 ] safe_cast ?
683 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 14:51:10 ] castに失敗した時に、例外が発生したほうがいいならsafe_cast。 nullptrを返してほしいなら、dynamic_cast。 if分の条件でスマートに使いたいなら、T::typeid->IsSubclassOf(obj)もしくはIsInstanceOfType()の組み合わせで。
684 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 08:30:52 ] public ref class A : public Generic::IEnumerable<Object^> { public: virtual Generic::IEnumerator<Object^>^ GetEnumerator(); }; コンパイルエラーになるのだが、こういう実装はだめなの?
685 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 08:47:51 ] エラーメッセージぐらい書(ry System::Collections::IEnumerable::GetEnumeratorの方の宣言がない
686 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 08:57:42 ] >>685 public ref class A : Generic::IEnumerable<Object^> { public: virtual Generic::IEnumerator<Object^>^ GetEnumerator(); virtual Collections::IEnumerator^ GetEnumerator(); }; してみたけど、だめでした。 error C2556: 'System::Collections::IEnumerator ^A::GetEnumerator(void)' : overloaded function differs only by return type from 'System::Collections::Generic::IEnumerator<T> ^A::GetEnumerator(void)' with [ T=System::Object ^ ]
687 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 09:29:04 ] そりゃ返値が違うだけの同名同引数メソッドを宣言できるわけないだろ? 別名定義する必要がある。リファレンスのinterface classの解説見れ
688 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 09:51:04 ] >>687 以下でコンパイル通りました。 public ref class A : Generic::IEnumerable<Object^> { public: virtual Generic::IEnumerator<Object^>^ GetEnumerator() = Generic::IEnumerable<Object^>::GetEnumerator; virtual Collections::IEnumerator^ GetEnumerator2() = Collections::IEnumerable::GetEnumerator; }; ありがとうございました。
689 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 15:15:44 ] GetEnumerator2のほうはprivateにしたほうが
690 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 16:34:04 ] >>689 早速private: + sealedにしました。 重ね重ねありがとう
691 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 16:56:00 ] マネージクラスも共変できたらいいのにと思う。
692 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 17:58:42 ] 共変ができないのはなんでだろう CLI 上の制約?
693 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 02:20:10 ] >>691 Genericsは共変/反変をサポートしてるけど 標準クラスライブラリと有名どころの言語がサポートしていないので事実上死に設定
694 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 02:33:11 ] たしかデリゲートもIL上は共変・反変できたような。
695 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 21:08:19 ] C#はデリゲートなら共変反変おk
696 名前:デフォルトの名無しさん [2007/12/08(土) 17:56:12 ] (C/C++スレから誘導されて来ました) VS2005にてC++/CLI使用中です。 Hoge()というアンマネージドクラスが既にあり、これをマネージ環境で使うことを考えています。 このとき、 Hoge *hoge0 = new Hoge(); Hoge *hoge1 = new Hoge(); Hoge *hoge2 = new Hoge(); ・・・ というのを Hoge *hoge[10]; hoge[0] = new Hoge(); hoge[1] = new Hoge(); hoge[2] = new Hoge(); ・・・ のよう配列にするにはどうしたらよいでしょう? (マネージ環境だと Hoge *hoge[10]; の時点でCLI配列使え!って怒られてしまうんですよね・・・)
697 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 18:16:54 ] 普通にできるはずだが? エラーメッセージとか番号とかちゃんと書けよ
698 名前:デフォルトの名無しさん [2007/12/08(土) 18:21:12 ] C++/CLIでSTLって使えないんですかね。。。 アンマネージ内で使いたいんですが、#include<list>とか<vector>とかすると error C2039: 'free' : '`global namespace'' のメンバではありません。 e:\program files\microsoft visual studio 8\vc\include\cstdlib error C3861: 'free': 識別子が見つかりませんでした e:\program files\microsoft visual studio 8\vc\include\malloc.h とエラーが出ます。。。
699 名前:696 [2007/12/08(土) 18:25:37 ] >>697 アンマネージクラスだと普通にできますが、マネージ環境だと Hoge *hoge[10]; のところで 「error C4368: hoge' をマネージ 'test01:managedClass01' のメンバとして定義できません。混合型はサポートされていません」 といったエラーになります。 このエラーでググると「マネージ環境なんだからarray<>使うべし」といった見つかるのですが、 例文はintの配列とかそんなんばっかりで、今回のような場合はどうすりゃいいのか・・・といった感じです。 よろしくお願いいたします。
700 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 18:38:07 ] >>699 ttp://msdn2.microsoft.com/ja-jp/library/xhfb39es(VS.80).aspx Hoge *hoge[10]をメンバにしようとしてるんだろ。
701 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 18:41:38 ] >>698 普通に使えるが? ファイルぶっ壊れてるんじゃね?
702 名前:デフォルトの名無しさん [2007/12/08(土) 21:20:59 ] >>701 まじですか。。。 再インストールしてみます、ありがとですω
703 名前:デフォルトの名無しさん mailto:sage [2007/12/09(日) 00:51:43 ] >>>701 再インストールしたところ思いっきり動きました。 5時間悩んでたのが馬鹿らしい。。。 ありがとでした。
704 名前:デフォルトの名無しさん mailto:sage [2007/12/09(日) 09:02:32 ] >>699 やりたいことと少し違うかも知れんが、 new N[10]で10個のオブジェクトの生成は済んでるから注意な。 class N { }; // native class ref class M { // managed class N *n; public: M() { n = new N[10]; } ~M() { delete [] n; } !M() { delete [] n; } };
705 名前:デフォルトの名無しさん mailto:sage [2007/12/09(日) 11:06:54 ] array<IntPtr>^ _ptrs = gcnew array<IntPtr>(10); _ptrs[0] = IntPtr( new Hoge() ); ・・・ でよくね?
706 名前:デフォルトの名無しさん mailto:sage [2007/12/09(日) 19:48:19 ] Conditional属性は使えないの? 諦めてマクロにするしかない?
707 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 09:08:28 ] >>1 は?お前バカか? .NET開発のデファクトスタンダードはC#だろ。常識的に考えて いまさら時代遅れのC++なんて勉強する気しねーよ。 俺はJavaから始めたからよ。 で、ホントはC#よりC++/CLIのほうが未来ありそうなん?
708 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 11:09:09 ] >>707 C++ と C++/CLI の区別が出来ない人は 他の人を馬鹿呼ばわりする資格はありません
709 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 11:30:45 ] >>1 の一行目は皮肉みたいなもんだろ www.microsoft.com/japan/msdn/vs05/visualc/VS05Cplus.aspx たぶんこういうのが元ネタだけどタイトルの割に内容は微妙にネガティブw
710 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 13:20:05 ] C++/CLIはC++にどっぷり漬かった俺にはなんか納得できないものがある。
711 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 13:52:34 ] 全然チェックしてないけど.NET3.5で言語に手は加わってんの? マーシャリングライブラリが付くって話は聞いたことがあるけど あとSTLと この辺は言語そのものじゃないしな
712 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 01:18:30 ] >>710 C++ がすでに何でもありなところを、さらに C++/CLI でなんでもありになってるので好感もてない?ポインタがふたとおりあるとか。
713 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 01:27:01 ] ポインタじゃないよトラッキングハンドルだよ
714 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 02:35:25 ] C++ のネイティブ・クラスをマネージドに委託できると嬉しいんだよな 普通にクラス作って gcnew したらマネージドになってくれるような機能
715 名前:デフォルトの名無しさん [2007/12/16(日) 10:15:37 ] BCCで使えるの?
716 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 10:37:32 ] gcc-cil はどうなったん?
717 名前:デフォルトの名無しさん [2007/12/18(火) 01:30:20 ] なあ、Windowsアプリ作るならC#のほうが楽じゃね? C++にマネージコードが混ざるとうっとおしい。
718 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 08:43:23 ] つ C++ Builder
719 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 11:58:38 ] おまえらがC#に移行しない理由は何?
720 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 13:10:26 ] いつまで待ってもドトネトが必要とされない。
721 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 13:40:58 ] Managed DirectX が消滅した
722 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 13:44:58 ] というか C++/CLI と C# は使う場所がちがうだろ、常識的に考えて ...
723 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 13:46:48 ] ( <●><●>) C丼だけで全部を作れないということは分かってます (U )つ u u
724 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 15:54:40 ] C#でC++よりも効率のいいデバイスドライバーって作れるの?
725 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 17:18:28 ] ここC++/CLIスレなんだけど
726 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 17:24:39 ] C#は.NETを必要とする代わりに便利な環境を提供するものだけど C++/CLIはどうしても.NETが必要な人のためのものだからな
727 名前:デフォルトの名無しさん [2007/12/19(水) 01:40:55 ] .NETが必要なこと自体に遭遇したことがない
728 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 10:06:30 ] リッチなGUIを簡単に作れるのは魅力的なんだが
729 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:23:58 ] .NETは美しいんだよ。 APIのドキュメントと長時間睨めっこしなくて済む
730 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:39:59 ] それなんてDelphi/VCL?
731 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 14:20:22 ] 某は見苦しさを極めてるからなw
732 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 21:21:14 ] >>724 そもそもC#で作ったデバイスドライバなんてあるの?
733 名前:デフォルトの名無しさん [2007/12/26(水) 00:46:25 ] マネージド、アンマネージドのクラスや配列の解放について質問があります。 なるべく使い終わったクラスを即時メモリ解放したくて、 delete しているのですが、タスクマネージャで確認しても、解放しているようには見えません。 マネージもアンマネージも、deleteしたタイミングでメモリ解放されるのでしょうか? それとも、マネージはGCに頼るしかなく、アンマネージはdeleteのあるタイミングでメモリ解放されるのでしょうか?
734 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 00:50:47 ] アンマネージドでも確保したメモリをプールして使いまわしてるだけだから、 deleteしたからといって、即座にメモリがOSに返還されるわけではないよ。
735 名前:デフォルトの名無しさん [2007/12/26(水) 09:49:21 ] 既定の new や malloc から先はどうやってるのか 追いかけたことないけど,「必要なら持っていっても いいよ」っていうマークでもつけておいて必要に応じて OS が回収できるようにしているのかな?
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 さんの言うとおりの動きなのかな? とりあえず解決しましたー。ありがとです。