C++/CLI について語ろうぜ Part2at TECH
C++/CLI について語ろうぜ Part2 - 暇つぶし2ch653:デフォルトの名無しさん
07/11/05 21:55:56
なすてnullptrなんて作たんだろ、nullで統一してよ

654:デフォルトの名無しさん
07/11/06 00:15:35
ぬるぽ

655:デフォルトの名無しさん
07/11/06 00:37:10
>>653
> なすてnullptrなんて作たんだろ、nullで統一してよ
'\0' と混同する人がいないとも限らないからかな…

656:デフォルトの名無しさん
07/11/06 00:52:35
#define null 0としているプログラムは探せば結構ありそうに思う。
そんなコードでも変更なしに使えるようにという配慮では?

657:デフォルトの名無しさん
07/11/08 18:41:43
え C++/CLIはヘッダーに全部実装するのが流儀だろ
cppファイルなんていらんのですよ

658:デフォルトの名無しさん
07/11/08 20:35:57
実体化しないのかよ
まさか、プリコンパイルヘッダに全部うわなんだおまえやめr

659:デフォルトの名無しさん
07/11/09 10:19:51
>>649
このあいだ、基本は.NETライブラリで、ネイティブ用のI/Fも欲しいって仕事があって
何を使っても良かったし、ずっと自分が面倒みる事になる事は分ってたから
C++/CLI のラッパーで対応したが。

レアケースなのは間違いないな。

660:デフォルトの名無しさん
07/11/09 10:29:36
>基本は.NETライブラリで、ネイティブ用のI/Fも欲しいって

これ、何ていうドトネトアプリの破滅。

661:デフォルトの名無しさん
07/11/11 16:39:40
>>え C++/CLIはヘッダーに全部実装するのが流儀だろ
あ、やはりそうなのか?

662:デフォルトの名無しさん
07/11/11 17:10:26
こより的には、そのやり方はちょっと…

663:デフォルトの名無しさん
07/11/15 19:56:20
C#でいう「インターフェイス メンバの明示的実装」をやるにはどうすればいいの?

664:デフォルトの名無しさん
07/11/15 20:35:39
自己解決
private: virtual Object^ Clone() = ICloneable::Clone { ... }

665:デフォルトの名無しさん
07/11/15 21:43:18
CLI 部分については C++/CLI って C# よりむしろ VB に近いと思う瞬間の一つだな
raise とか

666:デフォルトの名無しさん
07/11/15 22:15:02
>>662
マイナー杉

667:デフォルトの名無しさん
07/11/16 11:38:24
>raise とか

これ、何てDelphi?

668:デフォルトの名無しさん
07/11/20 22:11:41
2008入れてみた。
STL/CLI使えるぽ。

669:デフォルトの名無しさん
07/11/21 00:02:11
.net fx 2.0 指定でも使える?

670:デフォルトの名無しさん
07/11/24 09:45:51
この言語って、どの程度流行ってんの?

671:デフォルトの名無しさん
07/11/24 09:49:10
各国で静かなブームですよ

672:デフォルトの名無しさん
07/11/24 11:01:19
TreeViewとListViewにxVN_GETDISPINFO相当の機能がなかったので、
Controlから派生させて自作したよ('A`)
(VirtualModeもパフォーマンスがよくなかった・・・)

C#だとAPIや定数の定義が面倒だが、C++/CLIだとWin32ヘッダそのままインクルードして使えるから楽でいい。

だがそんなことするくらいなら最初っから
つMFC

・・・そんな感じだ。

673:デフォルトの名無しさん
07/11/24 11:21:38
メッセージぐらいならわざわざControl使わんでもどうとでもなるが。
Notify系メッセージならWM_REFLECTION付きで当該コントロールに来るし。

674:デフォルトの名無しさん
07/11/24 11:22:08
いやWTL最強

675:デフォルトの名無しさん
07/11/24 21:35:28
>>673
メッセージぐらいではどうにもならんのですよ。
WM_NOTIFY + WM_REFLECTでメッセージ引っ掛けても、先が続かん

676:デフォルトの名無しさん
07/11/27 18:43:18
Windowsプログラムを組む必要がない場合
CLIを勉強する意味ある?

677:デフォルトの名無しさん
07/11/27 18:44:30
Windows以外で動く独自のCLIを開発する場合とか。

678:デフォルトの名無しさん
07/11/27 18:48:44
( ゚д゚ )( ゚д゚ )( ゚д゚ )…

679:デフォルトの名無しさん
07/11/28 12:51:24
独自にCLRを実装するなら、CLI の勉強は必要だな
C++/CLI は不要だが

680:デフォルトの名無しさん
07/11/30 00:41:11
Object型の変数の値が、値型Tのボクシングされたオブジェクトであるかどうかを
調べるにはどうすればいいんでしょうか
C#では obj is T とするところです

681:デフォルトの名無しさん
07/11/30 00:58:20
参照型同様dynamic_cast<T^>(obj)がnullptrになるか否かで判定すればいい。

682:デフォルトの名無しさん
07/11/30 08:42:54
safe_cast ?

683:デフォルトの名無しさん
07/11/30 14:51:10
castに失敗した時に、例外が発生したほうがいいならsafe_cast。
nullptrを返してほしいなら、dynamic_cast。
if分の条件でスマートに使いたいなら、T::typeid->IsSubclassOf(obj)もしくはIsInstanceOfType()の組み合わせで。

684:デフォルトの名無しさん
07/12/01 08:30:52
public ref class A : public Generic::IEnumerable<Object^>
{
public:
virtual Generic::IEnumerator<Object^>^ GetEnumerator();
};
コンパイルエラーになるのだが、こういう実装はだめなの?

685:デフォルトの名無しさん
07/12/01 08:47:51
エラーメッセージぐらい書(ry
System::Collections::IEnumerable::GetEnumeratorの方の宣言がない

686:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/01 09:29:04
そりゃ返値が違うだけの同名同引数メソッドを宣言できるわけないだろ?
別名定義する必要がある。リファレンスのinterface classの解説見れ

688:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/01 15:15:44
GetEnumerator2のほうはprivateにしたほうが

690:デフォルトの名無しさん
07/12/01 16:34:04
>>689
早速private: + sealedにしました。
重ね重ねありがとう

691:デフォルトの名無しさん
07/12/01 16:56:00
マネージクラスも共変できたらいいのにと思う。

692:デフォルトの名無しさん
07/12/01 17:58:42
共変ができないのはなんでだろう
CLI 上の制約?

693:デフォルトの名無しさん
07/12/02 02:20:10
>>691
Genericsは共変/反変をサポートしてるけど
標準クラスライブラリと有名どころの言語がサポートしていないので事実上死に設定

694:デフォルトの名無しさん
07/12/02 02:33:11
たしかデリゲートもIL上は共変・反変できたような。

695:デフォルトの名無しさん
07/12/04 21:08:19
C#はデリゲートなら共変反変おk

696:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/08 18:16:54
普通にできるはずだが?
エラーメッセージとか番号とかちゃんと書けよ

698:デフォルトの名無しさん
07/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
07/12/08 18:25:37
>>697
アンマネージクラスだと普通にできますが、マネージ環境だと
Hoge *hoge[10]; のところで
「error C4368: hoge' をマネージ 'test01:managedClass01' のメンバとして定義できません。混合型はサポートされていません」
といったエラーになります。

このエラーでググると「マネージ環境なんだからarray<>使うべし」といった見つかるのですが、
例文はintの配列とかそんなんばっかりで、今回のような場合はどうすりゃいいのか・・・といった感じです。

よろしくお願いいたします。

700:デフォルトの名無しさん
07/12/08 18:38:07
>>699
URLリンク(msdn2.microsoft.com)(VS.80).aspx
Hoge *hoge[10]をメンバにしようとしてるんだろ。

701:デフォルトの名無しさん
07/12/08 18:41:38
>>698
普通に使えるが?
ファイルぶっ壊れてるんじゃね?

702:デフォルトの名無しさん
07/12/08 21:20:59
>>701
まじですか。。。
再インストールしてみます、ありがとですω

703:デフォルトの名無しさん
07/12/09 00:51:43
>>>701
再インストールしたところ思いっきり動きました。
5時間悩んでたのが馬鹿らしい。。。
ありがとでした。

704:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/09 11:06:54
array<IntPtr>^ _ptrs = gcnew array<IntPtr>(10);

_ptrs[0] = IntPtr( new Hoge() );
・・・

でよくね?

706:デフォルトの名無しさん
07/12/09 19:48:19
Conditional属性は使えないの?
諦めてマクロにするしかない?

707:デフォルトの名無しさん
07/12/15 09:08:28
>>1
は?お前バカか?
.NET開発のデファクトスタンダードはC#だろ。常識的に考えて
いまさら時代遅れのC++なんて勉強する気しねーよ。
俺はJavaから始めたからよ。

で、ホントはC#よりC++/CLIのほうが未来ありそうなん?

708:デフォルトの名無しさん
07/12/15 11:09:09
>>707
C++ と C++/CLI の区別が出来ない人は
他の人を馬鹿呼ばわりする資格はありません

709:デフォルトの名無しさん
07/12/15 11:30:45
>>1の一行目は皮肉みたいなもんだろ
URLリンク(www.microsoft.com)
たぶんこういうのが元ネタだけどタイトルの割に内容は微妙にネガティブw

710:デフォルトの名無しさん
07/12/15 13:20:05
C++/CLIはC++にどっぷり漬かった俺にはなんか納得できないものがある。

711:デフォルトの名無しさん
07/12/15 13:52:34
全然チェックしてないけど.NET3.5で言語に手は加わってんの?
マーシャリングライブラリが付くって話は聞いたことがあるけど あとSTLと
この辺は言語そのものじゃないしな

712:デフォルトの名無しさん
07/12/16 01:18:30
>>710
C++ がすでに何でもありなところを、さらに C++/CLI でなんでもありになってるので好感もてない?ポインタがふたとおりあるとか。

713:デフォルトの名無しさん
07/12/16 01:27:01
ポインタじゃないよトラッキングハンドルだよ

714:デフォルトの名無しさん
07/12/16 02:35:25
C++ のネイティブ・クラスをマネージドに委託できると嬉しいんだよな
普通にクラス作って gcnew したらマネージドになってくれるような機能

715:デフォルトの名無しさん
07/12/16 10:15:37
BCCで使えるの?

716:デフォルトの名無しさん
07/12/16 10:37:32
gcc-cil はどうなったん?

717:デフォルトの名無しさん
07/12/18 01:30:20
なあ、Windowsアプリ作るならC#のほうが楽じゃね?
C++にマネージコードが混ざるとうっとおしい。

718:デフォルトの名無しさん
07/12/18 08:43:23
つ C++ Builder

719:デフォルトの名無しさん
07/12/18 11:58:38
おまえらがC#に移行しない理由は何?

720:デフォルトの名無しさん
07/12/18 13:10:26
いつまで待ってもドトネトが必要とされない。


721:デフォルトの名無しさん
07/12/18 13:40:58
Managed DirectX が消滅した

722:デフォルトの名無しさん
07/12/18 13:44:58
というか C++/CLI と C# は使う場所がちがうだろ、常識的に考えて ...

723:デフォルトの名無しさん
07/12/18 13:46:48
 ( <●><●>)   C丼だけで全部を作れないということは分かってます
  (U      )つ  
    u  u

724:デフォルトの名無しさん
07/12/18 15:54:40
C#でC++よりも効率のいいデバイスドライバーって作れるの?

725:デフォルトの名無しさん
07/12/18 17:18:28
ここC++/CLIスレなんだけど

726:デフォルトの名無しさん
07/12/18 17:24:39
C#は.NETを必要とする代わりに便利な環境を提供するものだけど
C++/CLIはどうしても.NETが必要な人のためのものだからな

727:デフォルトの名無しさん
07/12/19 01:40:55
.NETが必要なこと自体に遭遇したことがない



728:デフォルトの名無しさん
07/12/19 10:06:30
リッチなGUIを簡単に作れるのは魅力的なんだが

729:デフォルトの名無しさん
07/12/19 11:23:58
.NETは美しいんだよ。
APIのドキュメントと長時間睨めっこしなくて済む


730:デフォルトの名無しさん
07/12/19 11:39:59
それなんてDelphi/VCL?

731:デフォルトの名無しさん
07/12/19 14:20:22
某は見苦しさを極めてるからなw

732:デフォルトの名無しさん
07/12/25 21:21:14
>>724
そもそもC#で作ったデバイスドライバなんてあるの?

733:デフォルトの名無しさん
07/12/26 00:46:25
マネージド、アンマネージドのクラスや配列の解放について質問があります。

なるべく使い終わったクラスを即時メモリ解放したくて、
delete しているのですが、タスクマネージャで確認しても、解放しているようには見えません。
マネージもアンマネージも、deleteしたタイミングでメモリ解放されるのでしょうか?
それとも、マネージはGCに頼るしかなく、アンマネージはdeleteのあるタイミングでメモリ解放されるのでしょうか?



734:デフォルトの名無しさん
07/12/26 00:50:47
アンマネージドでも確保したメモリをプールして使いまわしてるだけだから、
deleteしたからといって、即座にメモリがOSに返還されるわけではないよ。

735:デフォルトの名無しさん
07/12/26 09:49:21
既定の new や malloc から先はどうやってるのか
追いかけたことないけど,「必要なら持っていっても
いいよ」っていうマークでもつけておいて必要に応じて
OS が回収できるようにしているのかな?

736:デフォルトの名無しさん
07/12/26 11:36:14
newやmallocはHeap系APIに丸投げでねーの?

737:デフォルトの名無しさん
07/12/26 12:43:27
>>736
ん?システムコールに丸投げ?
もっと,こう,自前でヒープを管理していると思うんだけど.

738:デフォルトの名無しさん
07/12/26 12:50:54
>>737
ちょいと階層は深いけど最終的にはそうなってるようだね>VC2005で確認。
そうなると500KB以上は個別にVirtualAlloc/VirtualFreeで、
小さいのは一元管理で縮小せずに再利用だろう。

もしかしてLINKオプションの/HEAPオプションは使われてないかも?

739:デフォルトの名無しさん
07/12/26 18:04:01
>>737
Win32APIはシステムコールではないよ。
Windowsのシステムコールは非公開でげすよ。

740:デフォルトの名無しさん
07/12/26 18:06:00
URLリンク(ja.wikipedia.org)

システムコールとは、オペレーティングシステム (OS)
(より明確に言えばOSのカーネル)の機能を呼び出すために使用される機構のこと。
実際のプログラミングにおいては、OSの機能は関数 (API) 呼び出しによって実現されるので、
OSの備える関数 (API) のことを指すこともある

741:デフォルトの名無しさん
07/12/26 21:10:12
>>739
Windows においてはシステムコールはサブシステムの裏に隠れて
いて直接呼び出すことはできないってこと?
Win32 API って POSIX レイヤと同じレイヤ?

742:デフォルトの名無しさん
07/12/27 15:37:07
基本的に同じ。ただ、GDI関係は性能の都合でWin32 APIはカーネルのほうまで突っ込んでいたはず。
これをシステムコールというのかはわからないけど、
そういうサブシステムの下に位置するネイティブAPIと呼ばれるがNTDLL.DLLから公開されている。

9xの場合はVxDをDeviceIOControlで呼び出すことがシステムコールに相当するといっていいと思う。

743:デフォルトの名無しさん
07/12/27 22:22:48
ファイナライザって要らない子?

744:デフォルトの名無しさん
07/12/27 22:31:21
Disposeし忘れたときに必要

745:デフォルトの名無しさん
07/12/31 00:50:26
C++/CLIくだすれって消えてる?あるならそちらに誘導してもらえれば嬉しいです(’・ω・)
おとなしくC#いけって話かなぁ。。。

URLリンク(homepage3.nifty.com)

ここを参考にしながらForm1_Paintが呼ばれたときに
DrawlineとかDrawRectangleで描画するプログラム書いてるんですが、
その処理がとても重いので(他の理由もあるのですが)ボタンを押されたときだけ画面を更新するようにしたいんですが、どうしたら良いでしょうか。
(Form1_Paintだとウィンドウの移動などでも更新されてしまうので、それを避けたいということです。)

button1ってボタン作って、button1_Clickに全部書きゃ良いじゃんとか思ったんですが、
引数が(System::Object^ sender, System::EventArgs^ e)なのでe->Graphicsを使えなくて困ってます。



746:デフォルトの名無しさん
07/12/31 05:08:13
メンバにBitmapとか描画バッファを用意して
button1_Clickで描画、PaintでBitBltが妥当じゃね?

747:デフォルトの名無しさん
07/12/31 10:55:55
>>745
Form.CreateGraphicsは?
.NET使うならC#は読み書きできるようになった方がいろいろ便利だよ

748:デフォルトの名無しさん
08/01/01 10:16:58
あけおめです。
>>746-747
レスありがとうございます。
まず>>747のようにbutton1_Clickに
Graphic^ g=CreateGraphics();
としてボタンでの描画は成功したんですが、今度はForm1_Paintが呼ばれたときに描画されたものが消えてしまったので
>>746の方法をとろうとしたんですが、ドキュメント見たりググったりしてもいまいち描画バッファ→画面のBitBltのやり方が
分からなかったので、
URLリンク(www.atmarkit.co.jp)
を見ながら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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/01/13 10:05:33
ガベージコレクションが走るスレッドっていうのは、どのスレッドかは確定してないんですよね?
ということは、ガベージコレクションが走る際に呼び出すアンマネージリソースの処理は
スレッドセーフにしておかなければならないということかな?

具体的には参照カウントオブジェクトのラッパーをC++/CLIで作って.NETで使おうとしてるんだけど
Release関数をスレッドセーフにしなきゃならんのかなと。
(Interlockedにすればいいだけの話なんで、それ自体はどうってことないのですが)

751:デフォルトの名無しさん
08/01/13 11:45:06
ファイナライザスレッドは独立したスレッドなのでどのみちスレッドセーフは必要だろう

752:デフォルトの名無しさん
08/01/13 13:40:31
ファイナライザ中でthisに属するオブジェクトも生存は保証されていないしね
本当に最後の手段なんだから、基本的にはGC任せにしない方がいいよ

753:デフォルトの名無しさん
08/01/13 13:43:49
値型メンバは確実に生存してるぜ? その値型が持つ参照型はともかく

754:デフォルトの名無しさん
08/01/13 13:48:15
>>751-752
ありがとうございます。

明示的にDisposeてことになると思うんですが、
そうなるとDisposeしなければならないインスタンスを持つクラスがデータ構造の奥深くにあると
どんどんDispose呼び出しが感染していって親クラスのとこまで行ってしまいますよね。

面倒くさいなぁと思いつつも、仕方が無いなぁとも感じてるんですが
やっぱりそんなもんですかね…

755:デフォルトの名無しさん
08/01/13 23:19:17
アンマネージリソースを取り扱う以上、これは仕方ねっス。
頭切り替えるしかねっス。
ちなみにアンマネージリソース絡みでSafeHandleてのもあるんスが、
これの経緯とか調べるとさらに頭痛のタネが増えるのでオススメっす。

756:デフォルトの名無しさん
08/01/19 09:08:52
C++/CLIのメソッド引数に%をつけることについて質問があります。
マネージ型の配列や構造体をメソッドに渡すとき、”^”をつけますが、 この渡し方で配列や構造体の”ポインタ”が渡されると思っていました。
”^”の引数があるメソッドを持ったクラスライブラリをVBで参照したら “ByVal”となっていました。

ここで質問ですが、”^”でなく”^%”としなければ配列や構造体が 値渡し(配列全体がCopy?)になるのでしょうか?%をつける、 という概念がC++/CLIで現れたため悩んでいます。
できるならば 配列や構造体は値渡しでなく、アドレス渡し、配列渡しをしたいのですが・・・


757:デフォルトの名無しさん
08/01/19 09:13:22
^は参照型 そのまま渡すと参照をコピー
%はC++の&、C#のref/outに当たる参照渡し
「参照型 参照渡し」で調べればいいよ

758:デフォルトの名無しさん
08/01/19 09:54:02
>>757
ありがとうございます。調べてみました。参照型の^引数はアドレスをコピー、参照型の^%渡しはアドレスを参照渡しする、ということですね。
ということは参照型の場合、どちらの方法で渡してもパフォーマンスに大きな影響はないということでしょうか。
参照型と参照渡しの違いを理解しないといけないのですね。

759:デフォルトの名無しさん
08/01/19 10:52:27
.NETで参照渡しはあんまり使わないよ
参照で渡すことが多いんだったら初めから参照型にする

760:デフォルトの名無しさん
08/01/20 22:59:01
TryParseとかあるじゃん

761:デフォルトの名無しさん
08/01/22 21:33:21
スレ立ったのが2006年とかC++/CLIは使われてないの?
今からやるならC#のがいいかね?

762:デフォルトの名無しさん
08/01/22 22:06:34
アンマネージC++もC#も使えるようになった上で、
もしも必要に迫られたときにやっと登場する言語だからね

763:デフォルトの名無しさん
08/01/22 22:54:30
俺は間違っても#なんか使わん。意地でCLI

764:デフォルトの名無しさん
08/01/22 22:55:23
シーナンバー

765:デフォルトの名無しさん
08/01/26 16:42:52
>>761
そりゃ今からやるならC#だな
それよりVB.NETがいいに決まってるけどw
少なくともC++/CLIなんて論外だ
まあ.NETやること自体が間違いかもしれないが・・・

766:デフォルトの名無しさん
08/01/29 01:51:49
なぜVBを推すのか

767:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/03 23:52:38
>767
そりゃ、混合型は駄目だろ
ネイティブはネイティブ、マネージドはマネージドで扱わないと

769:デフォルトの名無しさん
08/02/04 00:25:09
あ、hoge_wrapper::_hoge の型は
gcroot<hoge ^> _hoge;
って宣言してました。転記ミスです。


770:デフォルトの名無しさん
08/02/04 00:59:04
いや、そこもそうだけど、gcnew しているイベント・ハンドラにネイティブの
ポインタ this を渡してるだろ?
マネージドでイベントアダプタみたいな物を作ったら?

771:デフォルトの名無しさん
08/02/05 01:13:10
MAKE_DELIGATE っていうのを見つけて、試してみたら意図したとおりに動くみたいです。
中身を見てみたら 770 さんの言うとおりの動きなのかな?

とりあえず解決しましたー。ありがとです。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch