[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 03/28 10:59 / Filesize : 176 KB / Number-of Response : 772
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++/CLI について語ろうぜ Part2



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


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 さんの言うとおりの動きなのかな?

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






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<176KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef