C++/CLI part3

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
おそらく、.NET開発でデファクトスタンダードに最も近い
であろうC++/CLIについて語ろうぜ!

このスレはC++および.NET Frameworkについて一定以上の知識を持っている人が対象となります。
.NETのクラスライブラリの使い方といった質問は姉妹スレ「くだすれC++/CLI(初心者用)」に
お願いします。

前スレッドはこちら
(p)http://pc11.2ch.net/test/read.cgi/tech/1142147319/
(p)http://pc8.2ch.net/test/read.cgi/tech/1126450441/l50

姉妹スレ
くだすれC++/CLI(初心者用)
(p)http://pc8.2ch.net/test/read.cgi/tech/1142144110/l50
managed C++ やろうぜ!! 002
(p)http://pc8.2ch.net/test/read.cgi/tech/1139043535/l50
2デフォルトの名無しさん:2008/03/25(火) 22:32:54
おつ
3デフォルトの名無しさん:2008/03/26(水) 00:54:20
いらんたせろ
4デフォルトの名無しさん:2008/03/26(水) 15:15:12
dataGridView等で、選択されてる行を消すって処理を
エレガントに描くにはどうすればいいですか?

今のところ
for( int i = 0 ; i < this->dataGridView->Rows->Count ; ++i )
{
     System::Windows::Forms::DataGridViewRow^ row = this->dataGridView->Rows[i];
     if( row->Selected )
     {
        dataGridView->Rows->Remove( row );
         i=0;
     }
}
です
5デフォルトの名無しさん:2008/03/26(水) 15:40:32
それって最終的に全部消さないか?
6デフォルトの名無しさん:2008/03/26(水) 16:06:45
>>5
selectedの時しか消さない(i=0)から問題なし
selectedしてない場合、ループの最後まで行くお
7デフォルトの名無しさん:2008/03/26(水) 16:12:40
自動選択は?
8デフォルトの名無しさん:2008/03/26(水) 16:17:19
自動選択って何?
上のコードでとりあえず動いてるから問題ないというか
質問を質問で返さないで
9デフォルトの名無しさん:2008/03/26(水) 16:28:02
あああ、デフォルトでそんな機能あるやんね
10デフォルトの名無しさん:2008/03/26(水) 20:12:53
List<Scene^> scenes;
// いろいろ
for each(Scene s in scenes)
{
 delete s;
}

何か問題はありますか?
11デフォルトの名無しさん:2008/03/26(水) 20:24:45
いろいろの最中に例外が投げられたらオワタ\(^o^)/になる。
といってもGCとファイナライザで救済されるから
ネイティブC++のときほど気にかける必要はないかもしれない。
12デフォルトの名無しさん:2008/03/28(金) 15:20:34
System::Collections::Generics〜のコンテナ郡に
auto_handleは入れられますか?
13デフォルトの名無しさん:2008/03/28(金) 15:22:51
はい
14デフォルトの名無しさん:2008/03/28(金) 15:48:18
入れたところで、自分でauto_handleのデストラクタを呼ばない限り、
auto_handleの中身のインスタンスのデストラクタは呼ばれないぞ。
中身のデストラクタはauto_handleのデストラクタ (Dispose)から呼ばれるのだが、
BCLのコレクションは要素のDispose(デストラクタ)を呼ばないため。
15デフォルトの名無しさん:2008/03/28(金) 15:54:16
意味ね〜
16デフォルトの名無しさん:2008/03/28(金) 15:57:17
おとなしくGCに従うのだ ははは
17デフォルトの名無しさん:2008/03/28(金) 16:07:33
STL/CLRのコンテナでも無理なの?
18デフォルトの名無しさん:2008/03/28(金) 16:14:24
無理。
19デフォルトの名無しさん:2008/03/28(金) 16:20:33
無理ですかorz
20デフォルトの名無しさん:2008/03/28(金) 20:55:35
ref class Banana;
List<Banana^> bananas;

for each (Banana^ b in bananas)
{
 delete b;
}
21デフォルトの名無しさん:2008/03/28(金) 21:01:32
Disposableなコンテナつくればいいじゃない
22デフォルトの名無しさん:2008/03/28(金) 21:15:31
value型でauto_handleみたいの作ろうとしたらデストラクタが定義できなかった。
23デフォルトの名無しさん:2008/03/28(金) 21:17:13
STLのコンテナだってstd::auto_ptr入れられないしね。
24デフォルトの名無しさん:2008/03/28(金) 21:18:27
>>23
それとこれとは関係ないだろ。
25デフォルトの名無しさん:2008/03/28(金) 23:44:30
でもさーGCはモノが使われなくなったら消えるんだから。
Vector<boost::shared_ptr<Hoge>>
と一緒じゃね?
26デフォルトの名無しさん:2008/03/29(土) 02:16:39
25はわかるけど、それと23とのつながりがわからない。
27デフォルトの名無しさん:2008/03/29(土) 08:41:05
>>25
タイミング
28デフォルトの名無しさん:2008/03/29(土) 10:58:40
COMにすればよくね?
29デフォルトの名無しさん:2008/03/29(土) 13:24:49
COMにもリリースのタイミングがあってだな
30デフォルトの名無しさん:2008/04/01(火) 21:59:31
過疎
31デフォルトの名無しさん:2008/04/02(水) 21:46:36
  踏んだら孕んだ!
  孕んだ振る降る般若だ!
  童貞擦る無駄、フン出る春巻きはむ無理!
  チン毛ちぎり、看板塗る飛騨!
  安眠煮る焼酎!
  安打!?半田ゴテ適時打!!
  原チャリ盗んだ!
  よくちょん切れるハサミだ!
        ∧__∧   ________ 
      <丶`Д´>/ ̄/ ̄/ 
      ( 二二二つ / と)
32デフォルトの名無しさん:2008/04/08(火) 06:12:29
const参照で受け取ったref classのプロパティって触れないの?

ref struct Foo
{
property int Bar;
static void Hoge(const Foo% foo)
{
foo.Bar;
}
}

error C2662: 'Foo::Bar::get' : 'const Foo' から 'Foo %' へ 'this' ポインタを変換できません。

const外すとコンパイル通ります。
getterちゃんと書いて、 int get() const とかやろうとすると
const 付けんなって怒られるし…
33デフォルトの名無しさん:2008/04/08(火) 10:30:03
追跡参照の中身が固定されたらGCが起きたとき、追跡できないだろ
34デフォルトの名無しさん:2008/04/08(火) 14:59:36
単にCLIにconstの概念がないから、
マネージ型にconst使おうと考えるなということ。
3532:2008/04/08(火) 18:12:22
>>33
え?それは Foo * const foo とした場合の話じゃないの?
「中身」っていう言葉が何を指してるのかよくわからないけど…。

C++だったら、そもそも参照自体がポイント先の変更を許さない概念なわけだけど、
CLIで%なんてもの導入したからには、そのへんは宜しくやってるんじゃないの?
const参照はあくまでポイント先のメンバの不変性を宣言するものだと思うんだけど

>>34
CLIでは「このメソッドは引数のメンバフィールドを変更しません」って
明言する事はできないの?
C++常習者としては、それってすげー不安なんですけど…
36デフォルトの名無しさん:2008/04/08(火) 22:10:35
>>33
とんでもないかんちがいをしている椰子w
37デフォルトの名無しさん:2008/04/09(水) 16:56:50
VC++2008のexpressでmsclr/marshal.h が見あたらないんですが、
もしかしてこれStandard以上にしか付いてないんですか?
38デフォルトの名無しさん:2008/04/09(水) 22:00:49
error C4959: アンマネージ struct 'Microsoft::DirectX::PrivateImplementationDetails::_D3DPRESENT_PARAMETERS_' は、そのメンバへのアクセスによって検証不可能なコードを生成するため、/clr:safe で定義できません
とエラーが出ます。
39デフォルトの名無しさん:2008/04/09(水) 22:13:02
>>35
というか.NETの参照渡しは呼び出し側に変更してほしい時にしか使わないお約束
40デフォルトの名無しさん:2008/04/09(水) 22:27:20
^だけだと nullptr渡されない?
41デフォルトの名無しさん:2008/04/09(水) 22:29:39
そうだよ。それで困るメソッドはArgumentNullExceptionを投げてくる。
42デフォルトの名無しさん:2008/04/09(水) 23:30:38
モノ渡したら4バイト超えてたら遅くなるんじゃないの?
43デフォルトの名無しさん:2008/04/10(木) 00:05:45
いや、^のハンドル型の実態はGC追跡付ポインタ。
引数や戻り値でも4/8バイトのアドレス値が受け渡されるだけ(少なくともCLRでは)。

.NET Frameworkのライブラリのクラスに、
コピーコンストラクタや代入演算子が定義されていないのは、
そういうわけで不要だから。
44デフォルトの名無しさん:2008/04/10(木) 00:06:05
実際、XNAの算術ライブラリなんてガイドラインと逆走してるよ。
45デフォルトの名無しさん:2008/04/14(月) 22:39:17
(一般ゲーム) [050325] [工画堂スタジオ] 蒼い空のネオスフィア -Neosphere of The Deep-blue Sky- (bin+cue).rar
46デフォルトの名無しさん:2008/04/15(火) 23:23:14
このスレの住人なら知っていますね、あの糞開発ツールのことを

・自分のプログラムのバグなのかコンパイラのバグなのかわからない
・他の仕事に応用できない糞開発ツールの独自世界を必死に学習している
・テキストエディタで書いたほうが効率的なのに糞UIツールを懸命に使っている
・糞開発ツールを批判すると「性格が悪いから糞ツールを批判するんだ」と言われる

糞だけど、政治的な理由で無理やり使わされているんですよね。
もう、あんな厨の作った糞ツールを我慢して使うのはやめましょう。

・糞開発ツールを部下に押し付ける上司の命令は無視しましょう。
 上司は糞開発ツールが使われる実績を作ることであの会社のごきげんをとっているのです。
・糞開発ツールを使わせる上司の下では働けません、と上司の上司に直訴しましょう。
・あの糞開発ツール提供会社には「おたくの糞開発ツールは話にならない」と突き放しましょう。
 バグレポートなどしてはいけません。改善要求などもってのほかです。
 あの会社はあなたたちのことをテスター/モルモットとしか思っていません。
・あの会議で「糞開発ツールを使ったら生産性がxx%アップしました」
 なんて話が出たら力強く机を叩き、会議室を出ましょう。
 あの人たちは糞開発ツールをマンセーすることで立場を確保しているのです。

糞な開発ツールを糞だと言える、そんな当たり前の環境をみんなの力で取り戻しましょう。
47デフォルトの名無しさん:2008/04/15(火) 23:25:01
VisualAge のことですね。わかります
48デフォルトの名無しさん:2008/04/20(日) 15:16:43
VisualAge
49デフォルトの名無しさん:2008/05/15(木) 12:45:00
過疎るな
50デフォルトの名無しさん:2008/05/15(木) 15:20:37
C++/CLIの達人になる意味って、ある?
51デフォルトの名無しさん:2008/05/15(木) 15:54:40
「C++/CLIの達人」⊂「C++の達人」
だから考えるまでもなく意味はあるだろ
52デフォルトの名無しさん:2008/05/15(木) 16:22:00
C++の達人とはまたベクトルが違うような
53デフォルトの名無しさん:2008/05/15(木) 17:39:28
/ってorの意味じゃないの?
包含関係逆だろ!?
54デフォルトの名無しさん:2008/05/15(木) 18:28:36
withの意味だよ。
55デフォルトの名無しさん:2008/05/16(金) 23:33:06
「C++/CLIの達人」=「C++の達人」 ∩「CLIの達人」
「C++/CLIの達人」⊂「C++の達人」
「C++/CLIの達人」⊂「CLIの達人」
56デフォルトの名無しさん:2008/05/17(土) 03:40:44
下二つ反対だろ(w
57デフォルトの名無しさん:2008/05/17(土) 03:43:38
上も反対
58デフォルトの名無しさん:2008/05/17(土) 08:55:34
           おっぱい!
       おっぱい! おっぱい!
    おっぱい おっぱい! おっぱい!
  おっぱい! ∩   ∩ ノ)   おっぱい!
 おっぱい!  川 ∩ 川彡'三つ  おっぱい!
おっぱい! ⊂ミ∩、⊂ミ∩彡⊃    おっぱい!
おっぱい!⊂三ミ( ゚∀゚)彡三彡三⊃ おっぱい!
おっぱい! ⊂彡川⊂彡川ミ⊃    おっぱい!
おっぱい!⊂彡川∪⊃ U川彡⊃   おっぱい!
 おっぱい! (ノ ∪  川 ∪ミ)  おっぱい!
  おっぱい!      ∪     おっぱい!
    おっぱい! おっぱい! おっぱい!
        おっぱい! おっぱい!
            おっぱい!
59デフォルトの名無しさん:2008/05/17(土) 20:32:41
C++/CLIの達人ってのが
C++ or CLIの達人だったら、
標準C++だけ知ってる達人とか、CLIのことだけ知ってる達人も
C++/CLIの達人になるけどいいの?
60デフォルトの名無しさん:2008/05/17(土) 20:47:46
/clr:safe の達人というのがいるとすれば、C++が使えるかどうか怪しいよな。
61デフォルトの名無しさん:2008/05/17(土) 23:23:05
それじゃ、C#使え、だよな
62デフォルトの名無しさん:2008/05/18(日) 15:14:16
C++/CLIのメリットってなんだろな。
safeで使いたいならC#だし、でなければC++でいいだろうし。
C++とmanagedのオブジェクトを両方使うのもあまり使い勝手が良くないし。
63デフォルトの名無しさん:2008/05/18(日) 16:00:41
C++でしか使えない(使いにくい)ライブラリをラップするぐらいしか
64デフォルトの名無しさん:2008/05/18(日) 17:23:00
だから>>55が正しいと思わんか?
65デフォルトの名無しさん:2008/05/19(月) 10:55:20
C#でusingの嵐に嫌気がさした人にはC++/CLIは悪くない。
66デフォルトの名無しさん:2008/05/19(月) 12:20:12
だらだらと長い名前空間を書かされるとしてもか?
67デフォルトの名無しさん:2008/05/19(月) 12:35:56
using namespace書いとけばってのはC#だって一緒だが…。
ひょっとして、名前空間のインポートするときのusingディレクティブの話と、オブジェクトーのスコープを
定義する場合のusingステートメントの話をごっちゃにしてないか?
68デフォルトの名無しさん:2008/05/20(火) 12:58:28
C++で作ったやつが
簡単?に.Netな画面のアプリで動かせるんだよ
69デフォルトの名無しさん:2008/05/20(火) 16:30:17
printf()とか関数の呼び出しを書いたとき、
それがネイティブなのか違うのか、
コンパイラは、どうやって判断してコードを吐いてるのだ?
70デフォルトの名無しさん:2008/05/20(火) 16:50:22
C++ではプロトタイプのない関数は呼べない。
71デフォルトの名無しさん:2008/05/20(火) 19:03:52
>>69
リンク時に解決する。
実際にILからネイティブの呼び出す部分はJITで生成される。
72デフォルトの名無しさん:2008/05/20(火) 19:26:59
この言語最高!
73デフォルトの名無しさん:2008/05/20(火) 20:11:17
普通のクラスや関数とrefクラスが混ざったDLLを作るとわけわかめ全開になるよね。
74デフォルトの名無しさん:2008/05/20(火) 20:34:58
確かに冗談みたいな汚さw
75デフォルトの名無しさん:2008/05/21(水) 12:22:19
>>68
簡単だったらな。
76デフォルトの名無しさん:2008/05/21(水) 18:01:48
簡単じゃないの?
77デフォルトの名無しさん:2008/05/21(水) 18:23:20
78デフォルトの名無しさん:2008/05/22(木) 18:56:45
Sizeをいちいち、System::Drawing::Sizeって書くのがめんどくさいんだけど、
どうにかならんの?
なんで型名なのに、メンバのSizeが優先されちゃうの?
79デフォルトの名無しさん:2008/05/22(木) 19:40:44
namespace dr = System::Drawing;
これでdr::Sizeってできる。

<windows.h>をインクルードして、Windows APIの名前と
.NETクラスライブラリの名前が被るときにも使える。
80デフォルトの名無しさん:2008/05/25(日) 12:47:41
C# と比較して C++/CLI ってやってる人少いの?
81デフォルトの名無しさん:2008/05/25(日) 13:09:03
C#とC++の橋渡し以外使う価値無いから、少ないだろ
82デフォルトの名無しさん:2008/05/25(日) 13:35:04
C#かVBと組み合わせて初めて価値が出る言語だし
83デフォルトの名無しさん:2008/05/25(日) 17:56:15
俺はCLIがメインw
84デフォルトの名無しさん:2008/05/26(月) 01:54:15
すいません、WebBrowserで選択中のテキストを取得する方法はありますでしょうか?
WebBrowserやDocumentクラスにないですし、ExecCommandにも該当する方法はないみたいです。

クリップボードにコピーして取得する方法もないではないですが、クリップボードの内容を壊したくないので・・・
85デフォルトの名無しさん:2008/05/26(月) 05:33:06
selection
createRange
text
86デフォルトの名無しさん:2008/05/26(月) 07:46:28
>> 83
おれは、全部、C++ or C++/CLI でいいのにって思ってしまう
87デフォルトの名無しさん:2008/05/26(月) 14:18:34
^
88デフォルトの名無しさん:2008/05/27(火) 09:26:26
C#のP/Invokeめんどくせ。
この言語って、windows.hインクルードすれば、APIそのまま呼べるようになる?
89デフォルトの名無しさん:2008/05/27(火) 09:32:36
呼べる
90デフォルトの名無しさん:2008/05/27(火) 09:37:06
MFC で UI 周り作って、/clr オプションつけて内部で .net fx 使ってるけど、かなり楽
C++0x もいいけど、便利なライブラリフレームワークも重要だと思うんだ
91デフォルトの名無しさん:2008/05/27(火) 12:02:26
MFCランタイムと.NETランタイムを両方使ってると思うだけで萎えるわ。
92デフォルトの名無しさん:2008/05/27(火) 12:16:27
使い方が逆だろう
93デフォルトの名無しさん:2008/05/27(火) 22:54:03
まあCWinFormsControlとかあるくらいだし、
そういう使い方も想定されてはいると思う。
主目的は移行用だろうけど。
94デフォルトの名無しさん:2008/05/28(水) 05:12:11
CLIでDirectXとか使えんの?
95デフォルトの名無しさん:2008/05/28(水) 05:42:15
XNA FrameworkはC++/CLIで書かれている
96デフォルトの名無しさん:2008/05/28(水) 06:17:25
Managed Direct Xはどこにいったよ?
97デフォルトの名無しさん:2008/05/28(水) 06:43:21
>>89
thanks
本格的に移行しようかな。

罠とかある?
98デフォルトの名無しさん:2008/05/28(水) 09:17:47
.NET Frameworkがないと動かない。
あと罠ではないが、ハンドルの扱いは
SafeHandle が使いやすいぶんC#のほうが楽だと思う。
C++/CLIで確実にハンドルが解放されるようにするのは
ちょっと面倒なんだよね。
どっかで SafeHandle 使うようにした Win32API の DllImport集
公開されてないかなあ。
99デフォルトの名無しさん:2008/05/28(水) 09:32:06
>97
ヘッダで定義されたdefineの衝突に注意。後、enum を混在させない
リソースの管理は、マネージドはマネージド、ネイティブはネイティブで管理する
.net fx をライブラリとして使える C++ と言う位置付けを忘れない
こんなところかな
COM の扱いが、com::ptr で済むのが楽だね
10098:2008/05/28(水) 10:16:11
ごめん。やってみたら C++/CLI でも
C# と同じやり方で SafeHandle 使えたわ。
検索してもC#とVBの資料しか出てこないからできないもんだと思ってた。
コールバック関数要求するアンマネージド関数に
delegate 渡すこともできるな。
なんでこういうの紹介してるページがないんだ。
C#のコードばっか載せやがって。

ただし、こういう小技を使おうとすると結局自分で
DllImport書かなきゃいけないので windows.h との親和性は低いけど。
こういうの全部取り込んだ windows.h があればいいのに。
101デフォルトの名無しさん:2008/05/28(水) 13:05:09
>>98−100
ありがとうございます。

API?STL?NET?
なんでもドンと来い。サクッと受け止めてやる!

って感じの言語みたいだね。
なんでもこいは諸刃の剣なので気をつけないと・・・
102デフォルトの名無しさん:2008/05/28(水) 18:03:35
>>95
全部C++/CLIじゃなくて,C#を併用してるっぽい
103デフォルトの名無しさん:2008/05/28(水) 18:29:52
>>100
Marshal.GetFuctionPointerForDelegate使えば、<windows.h>を活かせる。
ただreinterpret_castをしないといけないから、結局ラップしたくなる罠。
104デフォルトの名無しさん:2008/05/28(水) 19:37:11
C# でできて C++/CLI でできないことは、あんまりない
105デフォルトの名無しさん:2008/05/28(水) 21:47:27
WPF使えないしたぶんSilverlightも同じだろうね
106デフォルトの名無しさん:2008/05/29(木) 00:46:31
WPF は普通に使えるだろ
XamlReader 使ってもよし、普通にコードで GUI 使ってもよし

Silverlight だって、アセンブリは C++/CLI の Safe コードで書けるんじゃないかな
試してみるか
107デフォルトの名無しさん:2008/05/29(木) 09:25:26
あげるならXNAか
108デフォルトの名無しさん:2008/05/30(金) 11:07:30
>>106
それで使おうと思う?
WPF自体が糞とかいうのは置いといて
109デフォルトの名無しさん:2008/05/30(金) 11:10:08
WTL を使うのに比べれば、インテリセンスが標準で効くだけまし
110デフォルトの名無しさん:2008/05/30(金) 14:46:01
マニアックな人しか使わんのかこれは
111デフォルトの名無しさん:2008/05/30(金) 15:06:25
必要になったら使う、って感じじゃないか?
112デフォルトの名無しさん:2008/05/30(金) 15:43:54
マネージ埋め込みリソースの参照がかなり面倒なんだけど、
なんでC#みたいに、Properties.Resources.リソース名で
一発アクセス出来ないの?
11384:2008/05/31(土) 22:12:20
>>85
遅レスですが、
Document->DomDocumentを取得後に
その手順でできました。

ありがとうございます。
114デフォルトの名無しさん:2008/06/01(日) 01:56:08
仕事で他の人間に頼まれて、何日かCLIでバリバリ書いた後、
C++に戻ると、ついつい"gcnew"を連発してしまう
115デフォルトの名無しさん:2008/06/02(月) 17:32:52
C#のあとの配列newみたいなもんですね

わかります
116デフォルトの名無しさん:2008/06/03(火) 15:50:13
C#のあとのfor eachみたいなもんですね

わかります
117デフォルトの名無しさん:2008/06/03(火) 16:22:02
それは無い
118デフォルトの名無しさん:2008/06/03(火) 19:09:28
あるあry
119デフォルトの名無しさん:2008/06/04(水) 00:21:57
^←これなに?
ポインタモドキ?
120デフォルトの名無しさん:2008/06/04(水) 00:39:41
それはハット
121デフォルトの名無しさん:2008/06/04(水) 08:21:37
マネージドアプリを C++/CLI で作るのは邪道ですか?
12298:2008/06/04(水) 08:46:51
あんまりメリットはないと思う。
123デフォルトの名無しさん:2008/06/04(水) 18:00:03
MS的には事実上非推奨
124デフォルトの名無しさん:2008/06/04(水) 20:36:39
C++/CLIのメリットって何?
125デフォルトの名無しさん:2008/06/04(水) 20:44:05
C++でしか使えないライブラリを.NET用にラップするのが簡単になることじゃないか?
126デフォルトの名無しさん:2008/06/04(水) 23:19:21
あとはCOMのインターフェースを扱うときとかな
OSが実装しているCOMのインターフェースをC#やVB.NETで書き直すのは馬鹿らしい
127デフォルトの名無しさん:2008/06/04(水) 23:22:01
逆にC#のメリットって何?
128デフォルトの名無しさん:2008/06/04(水) 23:56:57
書きやすい
129デフォルトの名無しさん:2008/06/05(木) 00:28:30
情報(サンプルソースなど)が豊富。
130デフォルトの名無しさん:2008/06/05(木) 00:35:15
ヘジたんが好きです
131デフォルトの名無しさん:2008/06/05(木) 14:05:42
なんか、この手の質問ループしてないか?
132デフォルトの名無しさん:2008/06/06(金) 15:58:50
過疎るな
それ以外の話題がないのかwwwwwwww
133デフォルトの名無しさん:2008/06/06(金) 18:56:24
.NET各言語のまとめ

C++/CLI  闇ナベ言語
C# ヘルスバーグ萌え言語
VB 建て増しを繰り返した温泉旅館言語
J# J++手切れ金言語
JScript.NET (´・∀・`)ゲンゴ
F# 趣味言語
134デフォルトの名無しさん:2008/06/06(金) 19:58:55
Spec#とSing#……勝手に☆拡張!
135デフォルトの名無しさん:2008/06/06(金) 21:30:05
>>133
F#ってFortran#かForth#のどっち?
136デフォルトの名無しさん:2008/06/06(金) 21:40:18
>>135
OCamlのクローン

スレ立ってるよ
http://pc11.2ch.net/test/read.cgi/tech/1186030985/l50
137デフォルトの名無しさん:2008/06/06(金) 21:53:12
JScript .NETスレがこのスレより伸びているのは不思議でいけない
http://pc11.2ch.net/test/read.cgi/tech/1194001483/l50
138デフォルトの名無しさん:2008/06/06(金) 22:01:12
見に行ってみたけどあれは伸びてるって言っていいのか?w
139デフォルトの名無しさん:2008/06/09(月) 10:26:58
で、どうしろと?
140デフォルトの名無しさん:2008/06/10(火) 22:09:43
Thread^ jisure = gcnew Thread("C++/CLI part4");

jisure->build("プログラム板");

for(int i=0; i<1000; i++) {
  // TO DO
}

jisure->Close();
141デフォルトの名無しさん:2008/06/11(水) 18:11:10
ヘッダーのみで書いてるけど

生のC++と比べて
C++/CLIだとコンパイルが数倍速い気がする。
142デフォルトの名無しさん:2008/06/12(木) 19:00:13
>>141
ほとんどref classだけで書くとコンパイル速度は速くなる。
C#のコンパイルが早いのと同じ理由。
生のC++で書いてただそれを/clr でコンパイルしただけの場合はかわらない。
143デフォルトの名無しさん:2008/06/15(日) 15:36:54
c++/cliでxnaって使えるんですか?
ウィンドウを出すまでは出来たって人がいるみたいですけど
144デフォルトの名無しさん:2008/06/15(日) 17:17:46
少なくとも/clr:safeは必須だろうな。
145デフォルトの名無しさん:2008/06/15(日) 17:34:19
>>143
Xbox 360で動かすなら/d1clr:nostdlibも必要になるかも。
146デフォルトの名無しさん:2008/06/16(月) 19:35:50
Windowsなら普通に使えるけど意味ないわな
147デフォルトの名無しさん:2008/06/28(土) 13:39:34
STL/CLIでIntellisenseの効きが悪すぎる
148デフォルトの名無しさん:2008/07/01(火) 20:08:34
メインのフォームに
別のフォームを
・タスクバーのアイコン無し
・閉じるボタンをなくす、もしくはCloseじゃなくSW_HIDEみたいにしたい
んですが
どうすればいいのでしょうか?
149148:2008/07/01(火) 20:17:29
事故しました
150デフォルトの名無しさん:2008/07/01(火) 20:28:19
メインフォームのLoad〜

サブフォームを作成(gcnew してShow)

サブフォームを閉じてしまった場合、
再度表示するには、どうすればいいでしょうか?

もしくは、そのオブジェクトが閉じられてるかどうかを確認するには何をチェックすればいいのでしょうか?
151デフォルトの名無しさん:2008/07/01(火) 21:15:41
CloseしないでHideすればいいんじゃね
152デフォルトの名無しさん:2008/07/01(火) 21:20:20
MSDN で、Visible プロパティとShowメソッドを10遍読んでこい
153デフォルトの名無しさん:2008/07/03(木) 16:48:57
hideの身長は何センチですか?
154デフォルトの名無しさん:2008/07/03(木) 20:07:21
hydeだろ
155デフォルトの名無しさん:2008/07/09(水) 16:15:57
ネイティブのDirectX使いたいんですけど、
初期化時に必要なフォームのウィンドウハンドルはどうやって取得すればいいのでしょうか?
156デフォルトの名無しさん:2008/07/09(水) 16:21:24
(HWND)this->Handle.ToInt32();
157デフォルトの名無しさん:2008/07/09(水) 16:28:57
>>156
ToPointerだな
158デフォルトの名無しさん:2008/07/09(水) 17:09:56
どっちでもいけたお
159デフォルトの名無しさん:2008/07/09(水) 17:54:50
64bit
160デフォルトの名無しさん:2008/07/14(月) 17:45:14
FormやPictureBoxのイベントハンドラを見ても出てないのですが、.
net 2003ではMouseWheelイベントは定義されていないのでしょうか?
161デフォルトの名無しさん:2008/07/14(月) 17:52:14
隠されてんじゃね
基底であるControlで定義されてるから存在しないわけじゃない
162160:2008/07/15(火) 16:47:11
>>161
ありました。VB以外だと自分で定義してやらないといけないのですね。
163デフォルトの名無しさん:2008/07/16(水) 07:28:12
別のイベントが連鎖的におきてそちらのイベントを使うことが多いから
[Browsable(false)] にしてあるのだろう。

164デフォルトの名無しさん:2008/07/16(水) 21:47:24
関数ポインタ配列の宣言がどうしてもコンパイル通らないんです。
よかったら何がだめなのか教えてください。

public ref class Form1 : public System::Windows::Forms::Form
{
public:
...
  int fn1(int,int);
  int fn2(int,int);
  int fn3(int,int);
  int (*fp[])(int,int){
    fn1,
    fn2,
    fn3
  };
...


ちなみにerror C4368です。
165デフォルトの名無しさん:2008/07/16(水) 21:55:08
関数ポインタはアンマネージ
デリゲート使いな
166デフォルトの名無しさん:2008/07/16(水) 22:08:11
>>165

アンマネージだったんですか。ポインタはだめとかそんなことを聞いたきがします。
ありがとうございます。
167デフォルトの名無しさん:2008/07/17(木) 09:30:03
>>164
普通の関数とメンバ関数は、ポインタ型にすると別物だけど、
わかってるのかな?
168デフォルトの名無しさん:2008/07/17(木) 17:00:04
C#でやるより少々手間がかかりますな。
delegate int fd(int x, int y);
array<fd^>^ fp;
fp = gcnew array<fd^> { gcnew fd(this, fn1), gcnew fd(this, fn2), gcnew fd(this, fn3) }

ネイティブクラスの関数ポインタは ->* が出てきて泥沼に陥るからやめたほうがいい。
169デフォルトの名無しさん:2008/07/17(木) 21:20:42
>>167
わかっていないですorz調べてみます。ありがとうございます。
>>168
デリケートを使うことでコンパイルも通り,プログラムも完全はしましたが,>>168が何をいっているのかわかりませんorz
まだまだです…

本当にありがとうございました。
170デフォルトの名無しさん:2008/07/17(木) 21:25:59
>168
イベント使ったら?
171デフォルトの名無しさん:2008/07/18(金) 09:43:55
うん普通はイベント使うよね
172デフォルトの名無しさん:2008/07/18(金) 10:35:31
>>164
>関数ポインタ配列の宣言がどうしてもコンパイル通らないんです。 
という問いだからあえてデリゲートの配列にしたまでで、
そりゃ普通マルチキャストデリゲートとかイベント使うよ。
イベントでadd/remove/raiseを明示的に実装する場合は・・・まあ普通はコレクションだな。

言いたかったのはネイティブクラスもrefクラスの関数ポインタはthisを内包していないことと、
関数ポインタを使う場合やデリゲートにする場合はthisを明示的に指定する必要があること。

C#と比べてうんぬんというのはC#でデリゲートを作るときはthisを暗黙に補ってくれるので
気にしなくて良いということ。
173デフォルトの名無しさん:2008/07/22(火) 09:16:10
A classのメンバにB classの配列を加えるということはできないのでしょうか
174デフォルトの名無しさん:2008/07/22(火) 09:21:39
array<T^>^なら入れられるよ
175デフォルトの名無しさん:2008/07/22(火) 09:33:38
ref class A{
public:
static array<L_SAMPLINGDATA^>^ hoge;
};

ref class B{
public:
static int piyo;
};
---------------------------------
レスありがとうございます。
こんなかんじでしょうか。
176デフォルトの名無しさん:2008/07/22(火) 09:36:50
ref class A{
public:
static array<B^>^ hoge;
};

ref class B{
public:
static int piyo;
};
---------------------------------
まちがえました
177デフォルトの名無しさん:2008/07/23(水) 02:19:37
どういう意図があるのかわからんが static でいいのか?
178デフォルトの名無しさん:2008/08/20(水) 02:17:19
自分からテスト専門です、って宣言してる派遣テスターって何なの?

将来プログラマとかSEになりたい、とかならわかるけど。
向上心ないよね、頑固だし。
そういう派遣テスターって、仕様書は読めない、
テスト仕様書も作れない、テストプログラムも作れない
やれることは「テキトーにプログラムを触る」ことだけ。

俺は派遣プだけどさ、こういう派遣テスターがいると
派遣全体がバカにされるんだよ。
テスト専門派遣なんて氏んで欲しいよ、まったく。

今日も正社員の人が派遣テスターに仕様書を読んで
テスト仕様書を作ってください、って説教してたよ。
その派遣は頑固に「何故、仕様書が必要なんですか?」って
反論してたから、きっとテスト専門派遣テスターだな。
仕様書も読まず、テスト仕様書も作らず、ただテキトーに
プログラム触るだけで給料もらおうなんて頭おかしいんじゃねーの?

あ〜あ、あの派遣テスターが3ヵ月後に切られるまで、
仕様書も読まねーでテキトーにテストしたバグ票がまわってくんのかよ。
そんな糞なもん、読んで処理する派遣プの身にもなってくれよ。
うわ〜、しかもそいつが切られる3ヵ月以内に中間納品あるじゃねーか!
テスト仕様書もなしにテキトーにテストして納品か。
中間納品後にソッコウクレームでデスマ必至だな。俺の休みも返上かよ。

派遣専門テスターさんよ、少しは向上心持てよ!
頑固な性格直して仕様書読めよ!テスト仕様書作れよ!
179デフォルトの名無しさん:2008/08/28(木) 14:39:28
誘導されました

マネージコードでdllを作成することってできる?

dllのソース内でSytem::Stringを使おうとしたらC4747エラーがでちゃった
ソースの方に「#pragma unmanaged」宣言してるから仕方ないんだけどさ

なんかやり方あるんでしょうか?

環境はvc++2005でc++/cliでやってます
180デフォルトの名無しさん:2008/08/28(木) 14:44:01
どんなDLLが作りたいの?
181デフォルトの名無しさん:2008/08/28(木) 15:11:28
#pragma managedができない差し迫った理由でもあんのけ?
ちゅーかCLRでプロジェクト作ればまんまマネージアセンブリができるはずだが。
182デフォルトの名無しさん:2008/08/28(木) 15:21:07
>>179
#pragma unmanagedなしでも__declspec(dllexport)な関数は作れるぞ。
183デフォルトの名無しさん:2008/08/28(木) 16:04:26
関係ないけど、C++/CLIでSusieプラグインのコールバック書いたらすごく遅くてビビった。
何回も呼ばれるとアンマネージ-マネージ間のオーバーヘッドも馬鹿にならんな。
184デフォルトの名無しさん:2008/09/07(日) 23:04:10
既存のNativeのC++コードをC++/CLI
でくるんでC#から呼び出す方法がいくつか検索できるけど
(MicrosoftのC++開発チームもそれを奨励しているみたい)、
これって実際に余程、腕が習熟してないとトラブルに見舞
われそうだと思うけどどうですか?

もう、MFCなんか使ってnativeのC++で押し通した方が
良いように思うけど。とくに、カーネルの数値計算部
がNativeコードでできている場合
185デフォルトの名無しさん:2008/09/08(月) 00:15:06
それでいいんじゃない?
その時、/clr 付けておけば、.net framework も使えるし
C# のライブラリも使える
186デフォルトの名無しさん:2008/09/08(月) 00:21:19
http://pc11.2ch.net/test/read.cgi/gamedev/1210701179/
749 名前:名前は開発中のものです。[sage] 投稿日:2008/09/07(日) 13:50:13 ID:TzkL+YXR
C++/CLIなら.NETの便利なクラスライブラリやビジュアルデザイナを
C++から都合よく使えるとか思ってるなら大間違い
187デフォルトの名無しさん:2008/09/08(月) 00:32:05
は? GUI は MFC か WTL だろ
>184 もそう言ってるじゃないか
188デフォルトの名無しさん:2008/09/08(月) 01:49:41
>>184
別にネイティブコード呼び出すだけならC#からP/Invokeでも良いじゃん。
一度C#+WinForms+ビジュアルデザイナの開発に浸っちまうとMFCとか戻りたくない。

というかC++/CLIは使うかどうか迷うようなもんではないだろ。
C++/CLIのプロジェクト自体ほとんど見たことないが、
例えばアンタがXNAやSlimDX(DirectXのマネージラッパー)
みたいなアセンブリを作ろう思った時に、欲しい言語はどんな感じになると思う?
189デフォルトの名無しさん:2008/09/08(月) 09:20:33
dllimport並べたC#
190デフォルトの名無しさん:2008/09/08(月) 10:33:14
>>189
DirectXインターフェイスみたいなクラスのメンバ関数はどうするの? 
FBX SDKみたいなバイナリ提供しかされていないライブラリが沢山ある場合は?

C#+DllImportにこだわって関数テーブルからのオフセット調べたり
API変換のみのネイティブDLLをライブラリ毎に作るくらいなら
C++/CLIでマネージクラス書いた方が多少はマシだぞ思うぞ。
191デフォルトの名無しさん:2008/09/08(月) 11:05:30
すでにC++のコードがある場合、それをC#から使うのにいいな。
192デフォルトの名無しさん:2008/09/08(月) 11:09:30
>>190
>DirectXインターフェイスみたいなクラスのメンバ関数はどうするの?

DirectXインターフェイスならCOM準拠なんだからCOM Interopでいいじゃん。

>FBX SDKみたいなバイナリ提供しかされていないライブラリが沢山ある場合は?

Interop Assistantでヘッダファイルを構文解析して、P/Invoke定義をコード生成する。
ttp://blogs.msdn.com/bclteam/archive/2008/06/23/p-invoke-interop-assistant-justin-van-patten.aspx
193デフォルトの名無しさん:2008/09/08(月) 11:11:31
FBX SDKってもしかして*.libのみ提供?
194デフォルトの名無しさん:2008/09/08(月) 12:10:02
>>192
>DirectXインターフェイスならCOM準拠なんだから
DirectShow以外は準拠しとらんよ。tlbもidlもない状態からinteropできたっけ?
まぁDirectXに限らずCOM以外のC++クラスライブラリは無理だわな。

>Interop Assistantでヘッダファイルを構文解析して、P/Invoke定義をコード生成する
言葉足らずで悪かったが、スタティックライブラリのみの提供の場合ね。
195デフォルトの名無しさん:2008/09/08(月) 21:18:14
>>194
>DirectShow以外は準拠しとらんよ。tlbもidlもない状態からinteropできたっけ?

できるよ。tlbやidlはコードジェネレータの種に使っているだけで、
実行時にはMSILのメタデータしか使ってないから。
同じものをC#で書ける。
196デフォルトの名無しさん:2008/09/08(月) 22:30:35
そもそもAPIからIUnknown弄ればどうとでもなる
197デフォルトの名無しさん:2008/09/08(月) 23:01:19
C++もC#も理解していて、さらにC++/CLIをやってやろうという意気込みがあれば、
DllImport並べたりCOMInteropでどうにかするより楽に感じると思う。
つまりそれくらいの意気込みがないとつらいかなとも思う。
198デフォルトの名無しさん:2008/09/09(火) 23:04:31
実現したい機能がリフレクションを使わないと書けないかめんどくさい
・Type.getType()相当のプリミティブ
・Invoke()相当のプリミティブ
 があれば文字列をえっちらおっちらこさえれば.NET Frameworkのコードが呼べるはず。
 これならスタック二段増えるだけなので手間じゃないはず。(文字列こさえるのはともかくとしてね……)
 大本のプリミティブの下に積んでやれば下位互換性も保たれる。
199デフォルトの名無しさん:2008/09/14(日) 07:17:54
447 名前:デフォルトの名無しさん[] 投稿日:2008/09/14(日) 01:09:45
Express 2005で3連休プログラマーなんだけど、

 String^ folderName;

の ^ ってなに?
200デフォルトの名無しさん:2008/09/14(日) 07:27:27
マネージドオブジェクトの参照。それ基本だから入門サイトで勉強しなおせ。
201デフォルトの名無しさん:2008/09/14(日) 14:24:38
.NETでiniファイルの読み書き詳しく
202デフォルトの名無しさん:2008/09/14(日) 14:27:51
C++/CLIならAPIをじかに呼べる。/clr:safeやC#などからならP/Invokeを使う。
その前にini使うようなデザインはもうするな。
203デフォルトの名無しさん:2008/09/14(日) 17:31:54
仕様に書いてあるから訊いているのであって
お前ごときが意見するのはおこがましいちは思わんかね?
204デフォルトの名無しさん:2008/09/14(日) 17:35:18
クスクス クスクス
205デフォルトの名無しさん:2008/09/14(日) 17:37:55
このレベルのことはプログラマの権限の範疇だろ。
そうじゃなかったらプログラマでなくお前はコーダーだ。
206デフォルトの名無しさん:2008/09/14(日) 17:40:57
あげてるし釣りだろ
そろそろ後釣り宣言が来るかもね
207デフォルトの名無しさん:2008/09/14(日) 20:48:40
iniファイルは釣りでした。
起動してるプロセス(リスト)の取得教えて
208デフォルトの名無しさん:2008/09/14(日) 20:49:53
起動時にPIDをファイルに書いとけ
209デフォルトの名無しさん:2008/09/14(日) 21:36:58
そもそもC++/CLI関係なくね
210デフォルトの名無しさん:2008/09/14(日) 21:59:34
くだすれ.NET逝け
211デフォルトの名無しさん:2008/09/14(日) 23:36:22
>>197
しかし DllImport, COMInterop にも利点があってアセンブリが
AnyCPU に出来るという一部受けする魅力が
パワーがあるんならだからそっちのほうがと思うとやっぱり
C++/CLI って移行移行言っているのはそういう話なのではと。
言語的な話もあれども。
212デフォルトの名無しさん:2008/09/15(月) 01:40:00
日本語ぎりぎりだな
213デフォルトの名無しさん:2008/09/15(月) 17:30:40
もうやだこの世界
214デフォルトの名無しさん:2008/09/15(月) 17:42:28
C++/CLIこそ.NET
215デフォルトの名無しさん:2008/09/19(金) 15:24:08
自分以外のユーザのマイドキュメントのパスを取るAPIってない?
21698:2008/09/19(金) 15:38:38
なぜここで訊く
217デフォルトの名無しさん:2008/09/19(金) 15:46:18
c++/cliでやってるもんで・・・
フレームワークにうまいのがないかなと
218デフォルトの名無しさん:2008/09/19(金) 20:48:41
>>215
基本的にアクセスできない & プロファイルのロードは重いのでないん
じゃない。
というか偽装してプロファイルロードしてとりゃいいんじゃないかなぁ。
219デフォルトの名無しさん:2008/09/22(月) 14:31:38
>>218
返信遅くなったんだが教えてくれ

ユーザプロファイルを読み込んで後はどうやってマイドキュメント取ればいいの?
後、ユーザプロファイル取れてるかも自信ないんだが、下で合ってる?

IntPtr lt = IntPtr::Zero;
PROFILEINFO pfi;

LogonUser(L"test", L"", L"test",
 LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
 (PHANDLE)<)

::ZeroMemory(&pfi, sizeof( PROFILEINFO ));
 pfi.dwSize = sizeof( PROFILEINFO );
 pfi.lpUserName = L"test";

LoadUserProfile((HANDLE)lt, &pfi);
220デフォルトの名無しさん:2008/09/22(月) 23:47:22
>>219
C++なんだから、IntPtrよりHANDLEとか適切な型を使おうぜ。
それはともかく、SHGetFolderPathがトークンハンドルを引数を取る。
もしかしたら、ユーザプロファイルを読み込まなくても使えるかもしれない。
221デフォルトの名無しさん:2008/09/24(水) 09:13:10
>>221
レスあり
ユーザプロファイルのロードはしなくても取れました
222デフォルトの名無しさん:2008/09/24(水) 20:36:52
というかそのコードだと LogonUser で自動的にロードしてるな>プロファイル
223デフォルトの名無しさん:2008/10/01(水) 17:16:46
C++/CLIでprintDialogが開くのが遅くて、
printDocument->Print()してからプリントアウトが始まるのも遅いんですが早くする方法ってありますか?
224デフォルトの名無しさん:2008/10/03(金) 21:51:11
C#の
if(hoge is Nazo)
{
 // hogeはNazo型
}
みたいのはどうやって書くの?
225デフォルトの名無しさん:2008/10/03(金) 21:59:13
if (dynamic_cast<Naze^>(hoge))
{
}
dynamic_castはC#のas相当で、C#のisとasは同じILにコンパイルされるということから。
226デフォルトの名無しさん:2008/10/03(金) 22:12:10
できました
227デフォルトの名無しさん:2008/10/04(土) 12:35:06
as は safe_cast 相当じゃないの?
228デフォルトの名無しさん:2008/10/04(土) 12:50:42
safe_castはキャスト失敗した時例外投げる
229デフォルトの名無しさん:2008/10/05(日) 21:43:43
List<T>::Find(System::Predicate<T>(T))

あたりのやつってC++/CLIだと使えないの?
230デフォルトの名無しさん:2008/10/05(日) 21:48:12
別に使えないってこたーない
匿名メソッドやラムダ式が無いから使いづらいけどな
231デフォルトの名無しさん:2008/10/05(日) 22:02:12
匿名メソッドないから、
条件の数だけデリゲートの関数が要る。
232デフォルトの名無しさん:2008/10/05(日) 22:16:36
そこでBoost.Lambdaが……、使えない。
233デフォルトの名無しさん:2008/10/05(日) 22:25:28
比較対象を変数に仕込んだり…
234デフォルトの名無しさん:2008/10/05(日) 22:32:27
235デフォルトの名無しさん:2008/10/06(月) 00:14:38
collection_adapterにぶち込んで、cliext::find_ifを使うんだ。
bind1stとか使えるぞ。
236デフォルトの名無しさん:2008/10/08(水) 01:49:56
文字列スイッチはできないの?
237デフォルトの名無しさん:2008/10/08(水) 02:35:14
そこはC++ですから。
238デフォルトの名無しさん:2008/10/09(木) 22:18:18
ひんと はっしゅ
239デフォルトの名無しさん:2008/10/10(金) 14:52:36
C++/CLIのフォームデザイナのコード、あれなんとかならない…?
240デフォルトの名無しさん:2008/10/11(土) 09:10:20
まあそもそもフォームデザイナ使うようなところに使う言語じゃないしね
おまけと割り切るべき
241デフォルトの名無しさん:2008/10/13(月) 10:55:06
C#はISO,JIS承認されたけど、
C++/CLIはISOに蹴られてその後どーなったの?
242デフォルトの名無しさん:2008/10/14(火) 01:18:52
C++0x 待ちじゃね?
243デフォルトの名無しさん:2008/10/15(水) 10:47:55
Bette Cを標榜するならC99のコードは動作してもらいたい。
C++/CLIIはNGになってよかったけど、これに変わるとなると、もう素直にC++0x→D言語でいいんじゃないの?
244デフォルトの名無しさん:2008/11/11(火) 23:17:15
VSで開発してC++用のライブラリ使ってて、
内部で標準C++ライブラリが使われてmsvcr80.dllとかが要求されるんだが、
完成間近にいざ別の環境に持っていくと動かなかった。
.net入れてたら動くかと思ったんだが・・・
CRTオプションが/clrだから/MT(without DLL)が併用できないと怒られたし。
どうしよう(・ω・`)
正味CLRの実装レベルの話分かってない俺を誰か助けてくれ。
245デフォルトの名無しさん:2008/11/11(火) 23:19:24
>>244
それはランタイムが足りないから。
Visual C++ 再頒布可能パッケージってのをインストールするんだ。
バージョン(SPの有無も)、x86/x64/IA64で別々だからそこんとこ間違えないように。
246デフォルトの名無しさん:2008/11/12(水) 06:20:13
xp以降はおなじmsvcr80.dllでもビルドやリビジョンが下位の場合は読み込まない。
.NET2.0を導入すると.NET2.0が使ってる8.0.50727.42(or163?)が、
.NET3.0を導入すると.NET3.0が使ってる8.0.50727.1833がインストールされるが、
VS2005の最新パッチ状態でコンパイルしたものは8.0.50727.3053を必要とする。
このために.NET2.0が入っていてもmsvcr80.dllがあっても見つからないというエラーが発生する。
247デフォルトの名無しさん:2008/11/12(水) 07:52:30
別に .net 関係ない話だし
248デフォルトの名無しさん:2008/11/12(水) 08:46:47
CRTを使ってるからたまたま一緒にインストールされるという話だね。
インストーラーやClickOnce、または再配布モジュールで導入するのが筋だろう。
.NETでCRTを使ってるのはCSC.EXEとかMSCORWKS.DLLあたりだね。
249デフォルトの名無しさん:2008/11/12(水) 08:53:36
C++/CLIでCRTを使いたくないなら、/clr:safeにする必要がある
250デフォルトの名無しさん:2008/11/12(水) 20:22:04
ねーよ
251デフォルトの名無しさん:2008/11/12(水) 22:01:08
CLIの機能(プロパティやGC)は使用したいけれど.net frameworkは使用しない場合で、
.net frameworkのランタイムが入っていない環境で動作する様にできるんですか?
252デフォルトの名無しさん:2008/11/12(水) 22:16:09
Monoでも入れてみるかね
253デフォルトの名無しさん:2008/11/12(水) 23:48:07
CLIって.NET Frameworkの仕様のことなんだが
254デフォルトの名無しさん:2008/11/12(水) 23:58:02
>>253
おそらくC++/CLIのつもりなんだろ
255デフォルトの名無しさん:2008/11/13(木) 00:10:24
CLIの機能を使いたいが、.NETは嫌だというなら、>>252しかないな。
256デフォルトの名無しさん:2008/11/13(木) 00:19:45
そういえばなんでSTL/CLRはCLIじゃなくてCLRなんだろう
仕様を定めてるんじゃなくて、あくまでCLR用のライブラリそのものを指すから?
257デフォルトの名無しさん:2008/11/13(木) 20:18:48
Mono調べてみました
・・・素直に. netを使おうかと思います^^;

C++/CLIは独自仕様で直接.net frameworkとは関係ない所なので
C++/CLIだけ利用できないかな?と思ったので質問しました。
258デフォルトの名無しさん:2008/11/13(木) 20:37:48
C++/CLIっていうのは文字通りCLI(.NET Frameworkのコア仕様を定めるもの)
をサポートしたC++なんだよ?
その点C#は言語仕様が直接CLIに依存してないから
C++/CLIに比べて.NETとの繋がりがむしろ弱いともいえる
259デフォルトの名無しさん:2008/11/13(木) 21:54:38
まあ現実にはCLIなしのC#なんて考えられないけどな。
260デフォルトの名無しさん:2008/11/13(木) 22:01:39
コンパイラとGCとBCL一通りさえ実装すればC#と名乗れるんでしょ?
誰かやりそうだけど誰もやらないね
261デフォルトの名無しさん:2008/11/13(木) 22:09:01
そうなんですか、それでもやっぱりC++/CLIだけ使用して
.net frameworkを使用しないっていうことはできないんですよね。残念です
262デフォルトの名無しさん:2008/11/13(木) 22:21:49
>>260
mono
263デフォルトの名無しさん:2008/11/13(木) 22:38:24
プロパティに夢見てCLIにソースコピペ

プロパティ追加したらアンマネージにマネージは作れないと怒られる

クラスをマネージにしてみる

処理速度激減。なぜかインライン展開できてないorz

アンマネージクラスにプロパティとか新しい列挙とか作る方法ってないの?
マネージ系はインラインできないの?
264デフォルトの名無しさん:2008/11/13(木) 23:03:44
マネージコードでのインライン展開はJITの仕事。

ネイティブでのプロパティはCOM対応のおかげで昔からあったが別構文。
http://msdn.microsoft.com/ja-jp/library/yhfk0thd.aspx
265デフォルトの名無しさん:2008/11/13(木) 23:06:46
遅くなってるのは、インライン展開やマネージコードになったことよりも、
アンマネージコードとマネージコードの境界を意識してなくて行き来が多発しているのが原因だと思う
266デフォルトの名無しさん:2008/11/14(金) 08:16:06
まぁ、素人はネイティブをメインに gcroot でも使ってろってこった
267デフォルトの名無しさん:2008/11/14(金) 08:42:35
monoでのC++/CLIの対応状況。
コンパイラのサポートはなし。
Microsoft.VisualC.Dllは存在していてsafeモードでコンパイルされたものは動く。
その内訳。
 mono2.0.1現在ではVS2005でコンパイルしたものは動く。
 vs2008でコンパイルしたものは動かない。STL/CLRも未サポート。
mix, pureモードでコンパイルされたものは動かない。
268デフォルトの名無しさん:2008/11/15(土) 20:47:23
VC2008EEで勉強してます。
アップウィザードの自動生成が嫌なので、
空のCLRプロジェクトを選択して
int main()
{
Application::Run(gcnew Form());
return 0;
}
という最小限のプログラムを作ってみました。
プロンプトを表示させないようにするには
どうすれば良いのか教えて下さい。
269デフォルトの名無しさん:2008/11/15(土) 21:01:33
まず普通のWinFormプロジェクトを作ってみてそれを参考にすれば良いよ
270268:2008/11/15(土) 21:04:17
プロジェクト->プロパティ->リンカ->システム
で Windows(/SUBSYSTEM:WINDOWS)
を設定。

int main()を
int __stdcall WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdLine, int cmdShow)
に置き変えて,
#include <windows.h>
を書いたらできました。

でも、なんか違う気も。。
CLR用のやり方があるんだろうか?
271268:2008/11/15(土) 21:10:32
>>268
やってみてます。
Form1クラスの
System::ComponentModel::Container ^components;
メンバって使われてます?
272268:2008/11/15(土) 21:11:51
>>269
だった。。 自分に返信 ORZ
273デフォルトの名無しさん:2008/11/15(土) 23:03:06
>>270
それでいいと思う。

どうしても気になるなら、リンカ→詳細のエントリポイントを書き換えろ。
サブシステムが/SUBSYSTEM:WINDOWSにさえなっていれば大丈夫。
例えば、mainCRTStartupにすればint main(int argc, char **argv)で始められる。
?mainCRTStartupStrArray@@$$FYMHP$01AP$AAVString@System@@@Zだと
int main(array<System::String^>^ args)になる。
CRTの初期化が要らなければ、自分の関数を直接指定する。
274268:2008/11/16(日) 10:17:18
>>273
ありがとうございます。

教えて頂いたところを試してみて、以下がわかりました。
・int __stdcall WinMain(HINSTANCE hInst ... )
 を使った場合には、サブシステム:設定なし で動くようです。
・int main(array<System::String ^> ^args)
 を使いたい場合には、サブシステム:/SUBSYSTEM:WINDOWS
 エントリポイントmainで動くようです。

アップウィザードはの設定は後者ですが、
メイン関数からの引数が不要なら前者の方が楽ですね。
275268:2008/11/16(日) 10:58:51
自分で作成したフォームクラス(MyForm.h, MyForm.cpp)
に対して,デザイナを使えるようにしようとしています.

とりあえず新しい項目の追加でWindowsフォームを選び,
作成されたFoo.hとFoo.cppの内容をMyForm.hとMyForm.cpp
に全て変更したら動きました.

デザイナで編集して,MyFormのコンストラクタから
InitializeComponent();を呼んでいます.

でもこれもやり方が違う気が..
276デフォルトの名無しさん:2008/11/16(日) 15:36:02
何がいいたいの?
277268:2008/11/16(日) 18:57:42
MyForm.resx というXMLファイルを追加し,
ProjectName.vcproj というXMLファイルに変更を加えたら
MyForm.hがデザイナから認識され,編集できました.

既存のMyFormクラスに対して上記のXMLファイルの
設定を自動で行ってくれる方法は無いみたいです.
278デフォルトの名無しさん:2008/11/16(日) 19:51:31
日記は自分の blog にでも書いたらいいんじゃないか
279デフォルトの名無しさん:2008/11/16(日) 19:58:39
何の情報も提供せずに教えてくれってのよりは良いんじゃない?
280デフォルトの名無しさん:2008/11/16(日) 20:31:19
この人、自分がやってることをぼそぼそ呟いて、自己満足してるだけだろ
ウィザードがやってることを見もせずに、ウィザードと同じことやってりゃ世話無い罠
281デフォルトの名無しさん:2008/11/18(火) 23:52:34
自動的に作成されるメソッドに日本語が入らないようにするにはどうすればおk
282デフォルトの名無しさん:2008/11/20(木) 20:59:21
過去の資源を再利用できること以外にC++/CLIがC#より優れてる点はどこですか?
283デフォルトの名無しさん:2008/11/20(木) 21:09:52
Disposeパターンが言語に組み込まれてる
テンプレートが使える
マクロが使える

一番目は相互運用絡みだから除外するべきかも
284デフォルトの名無しさん:2008/11/20(木) 22:09:49
__fastcallが使えないのが痛い
285デフォルトの名無しさん:2008/11/20(木) 22:55:26
#pragma unmanaged
286デフォルトの名無しさん:2008/11/21(金) 09:27:31
C#(検証可能アセンブリ?)はリバースエンジニアリングが簡単という話を聞いたんですが
C++/CLIの混在アセンブリ、純粋アセンブリや検証可能アセンブリも同じなんですか?
287デフォルトの名無しさん:2008/11/21(金) 09:46:21
マネージコードで書かれた部分は読み放題
Reflectorでほぼ完璧に逆コンパイル可能
C#ほどILが綺麗じゃないから若干読みづらいかも
288デフォルトの名無しさん:2008/11/22(土) 17:46:58
>>285
#pragma unmanaged
int __fastcall func( int a, int b)
{
return a + b;
}
#pragma managed

これじゃ駄目なようですが
289デフォルトの名無しさん:2008/11/28(金) 02:10:49
MSの常
・勝手に仕様拡張する
・なかなか、正規仕様に準拠しない

どやしつけられたのがJ++
総スカン食らったC++/CLI

J#でどやしつけられ、性根入れ替えてC#はよかったのに
またC++/CLIで汚点。
J#はみあたらんぞ
290デフォルトの名無しさん:2008/11/28(金) 02:13:24
忘れてた
・勝手にサポートを打ち切る
291デフォルトの名無しさん:2008/11/28(金) 10:56:03
今どうしても必要なときに必要なところだけ使う言語だもん
中途半端なフォームデザイナなんか付けたりするから勘違いする奴がいる
292デフォルトの名無しさん:2008/11/30(日) 11:55:31
property TKey First;
のような省略記法って、何の意味がありますか?
アクセサを使わない場合と比べて、何か利点はあります?
293デフォルトの名無しさん:2008/11/30(日) 12:07:44
記述を省略できる
294デフォルトの名無しさん:2008/11/30(日) 12:15:20
generic< typename TKey, typename TValue >
public ref class Pair
{
public:
property TKey First;
property TValue Second;
//TKey First;
//TValue Second;

Pair(){}
};

stl::pairのようなクラスを作ったのですが、propertyを使うと、
テンプレートの型によって、代入出来たり出来なかったりするようです。
propertyを削除すると、代入出来るようになります。
何か理由わかりますか?
(続く)
295デフォルトの名無しさん:2008/11/30(日) 12:19:11
(続き)
public value struct ValueTypeStruct
{
unsigned int A;
unsigned int B;
};

array< Pair< unsigned int, ValueTypeStruct >^ >^ arry;
arry = gcnew array< Pair< unsigned int, ValueTypeStruct >^ >(10);

for each( Pair< unsigned int, ValueTypeStruct >^% inv in arry)
{
inv = gcnew Pair< unsigned int, ValueTypeStruct >();
inv->First = ...; // <- OK
inv->Second.A = ...; // <- NG
inv->Second.B = ...; // <- NG
}

>>293
記述を省略して、デフォルトのアクセサを作ったとして
それのメリットは何ですか?
別にget、setに別にアクセサビリティを設定出来る訳ではないし、、
メンバ変数のアドレスを取れなくさせるとかですか?
296デフォルトの名無しさん:2008/11/30(日) 13:06:46
>>290
いやいや、RedHatにはかなわんよ。
新版のLinuxパッケージをリリースしたら、旧版は即日サポート終了だからな。
あれには驚いた。
297デフォルトの名無しさん:2008/11/30(日) 13:08:30
> inv->Second.A = ...; // <- NG
> inv->Second.B = ...; // <- NG
プロパティは実質的にメソッドなので値型だとコピーが作られる

> 記述を省略して、デフォルトのアクセサを作ったとして
> それのメリットは何ですか?
ILレベルじゃまったく別物
途中で検証が必要だからフィールドからプロパティに変えるか、ってほど気楽な変更ではない
そもそもインスタンスフィールドを公開するのはガイドラインに逆らってるしな

> 別にget、setに別にアクセサビリティを設定出来る訳ではないし、、
これは単にコンパイラの実装の手抜きだろ
C#じゃ設定できるし
298294:2008/11/30(日) 13:08:31
自己解決しました。
inv->Second.Aとした場合、Secondはメンバではなく
get()の戻り値である一時変数であった為でした。
299デフォルトの名無しさん:2008/11/30(日) 13:19:08
>>297
理解しました、ありがとうございました。
300デフォルトの名無しさん:2008/11/30(日) 13:20:21
valuetypeは変更不可で設計したほうがこの手の間違いが少なくてすむよね。
301デフォルトの名無しさん:2008/11/30(日) 13:33:23
>>300
値型と参照型の違いもそうなのですが、
プロパティの

inv->First = ...; // <- OK

inv->Second.A = ...; // <- NG
が、表面上は同じ代入なのに

内部的には、
inv->set_First( ...);

inv->get_Second().A = ...;
と、正反対の関数に分かれるってのは
デンジャラスだなーと思いました。
propertyのgetには、何か足りてないものがあるような感じです。

302デフォルトの名無しさん:2008/11/30(日) 13:51:03
値型とプロパティは相性が悪いのよ。参照型のクラスだと問題ないでしょう。
だからP/Invokeのような特殊な用途を除いてイミュータブルにするルールになってる。
・・・のだけど、WindowsFormのPointやSizeはしっかり変更可能になってる(笑
ヘジたんの目が届かなかったのだろう。
303デフォルトの名無しさん:2008/11/30(日) 13:52:10
>>302
ここで言う値型はプリミティブ型を除いたユーザー定義型の構造体のことです。念のために。
304デフォルトの名無しさん:2008/11/30(日) 13:55:09
WinFormじゃなくてGDI+だな
その辺はむしろラップしてるアンマネージドとの兼ね合いじゃないか
305デフォルトの名無しさん:2008/11/30(日) 14:03:29
WPFの構造体だってたいがい変更可能だよ
そのへんは割り切り設計
ちゃんとわかってたら問題ない
306デフォルトの名無しさん:2008/11/30(日) 23:05:30
C++/CLIっていうか、.NETって
typedefのようなエイリアスって無いんですかね?
これじゃ何も作れないような、、皆さんはどうしてるんですか?
307デフォルトの名無しさん:2008/11/30(日) 23:12:46
何を作りたいんだ?
308デフォルトの名無しさん:2008/11/30(日) 23:20:20
マクロでも書けば委員者ね?
309デフォルトの名無しさん:2008/11/30(日) 23:21:35
トリビアル・プロパティとトリビアル・イベントの存在意義はロック処理を自動でしてくれること
だった気がする
310デフォルトの名無しさん:2008/11/30(日) 23:25:52
>>307
何か特定のソフトウェアに依存する話ではなく
一般的なものだと思います。

typedef classA< classB< classC > > > arg_type;
void func( arg_type a );

C++ではこう出来ていたものが、

void func( classA< classB< classC > > > a );

.NETではこれしか出来ないというのは
利用者側は、いちいちclassA< classB< classC > > >型のオブジェクトを宣言しろってことですか?

311デフォルトの名無しさん:2008/11/30(日) 23:30:57
で、それだけで何も作れなくなるの?
312デフォルトの名無しさん:2008/11/30(日) 23:33:12
>>310
アセンブリ横断ではその機能はないが、C++/CLIつまり同じソースか
includeするHeaderファイルの範囲なら使えると思うけど。
C#の場合は using xxx = System.YYY.ZZZ; 同じソースないなら出来る。
313デフォルトの名無しさん:2008/11/30(日) 23:34:09
今のC#とVB.NETにはローカル変数の型推論もあるし、
常にclassA<classB<classC>>>と書かねばならないわけでもなかろう。
(もちろんクラスメンバや戻り値など、その必要性がある場面も依然として存在するが)
314デフォルトの名無しさん:2008/11/30(日) 23:34:48
C++/CLIはtypedef使えるぞ。
315デフォルトの名無しさん:2008/11/30(日) 23:39:54
>>310
むしろ出来ないってデマをどこで教わったんだ?
2,3行書けば検証できる話だぞ?
その例から「でもBoostのようなメタプログラミングが〜」とか飛躍しないでくれよ。
316デフォルトの名無しさん:2008/11/30(日) 23:45:16
>>311
激しく意欲を削がれます。
他にも、const参照が出来ないとか、
ちょこちょこ退化してる?みたいな部分が見え隠れするんで。
いろんなサイトの紹介文ではマンセー意見しか書いてなかったんで
余計にです。

>>312
CLRで使えないと、C++/CLI使う意味ないです。

>>314, >>315
>>312のいうアセンブリ横断のことです。
もちろん書いて試したし、検索もしました。
317デフォルトの名無しさん:2008/11/30(日) 23:48:47
>>313
型推論について調べてみます。
アドバイスありがとうございます。
318デフォルトの名無しさん:2008/12/01(月) 00:04:36
C++のconst参照みたいなコンパイラを騙くらかすだけのまがい物ではなく
実際に参照されているオブジェクトを変更不可として扱うconst参照を導入しようとすると
オブジェクトの検証にパフォーマンス上の問題が発生するのであえて採用してないそうだ。
319デフォルトの名無しさん:2008/12/01(月) 00:28:26
オブジェクト指向では、内部の実装を隠蔽するわけだが、
それによって、一見読み取りだけのメソッドでも内部では何か状態を
更新してるかもわからないし。
const参照は、なんちゃってオブジェクト指向のC++と違って現代的な
オブジェクト指向とは相性悪いってことだな。
320デフォルトの名無しさん:2008/12/01(月) 00:54:17
基のC++でもmutableとかあるしね。

逆に、.NETで表現するとしたら、IReadOnlyHogeとIHogeって2本立てにするのが落としどころだと思う。
321デフォルトの名無しさん:2008/12/01(月) 20:19:45
複雑なジェネリック型を晒すなと.NETのガイドラインに書いてあるんだよね
322デフォルトの名無しさん:2008/12/01(月) 20:31:51
Native C++の2次元配列から、C++/CLIの2次元配列に値をコピーしたいのですが、1つ1つの要素を代入する以外の、
一発でコピーできる方法が分からなくて困っています。
1次元配列の場合は、
double nativeVec[3] = {1, 2, 3};
array<double> ^cliVec = gcnew array<double>(3);
System::Runtime::InteropServices::Marshal::Copy(IntPtr(nativeVec), cliVec, 0, cliVec->Length);
でコピーできますが、
2次元配列の場合はどうすればいいのでしょうか?
以下のコードでは動きませんでした。
double native2DVec[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
array<double> ^cli2DVec = gcnew array<double, 2>(3, 3);
System::Runtime::InteropServices::Marshal::Copy(IntPtr(native2DVec), cli2DVec, 0, cli2DVec->Length); // ここでエラー
エラーは、
error C2665: 'System::Runtime::InteropServices::Marshal::Copy' : 16 オーバーロードのどれも、すべての引数の型を変換できませんでした
です。
323デフォルトの名無しさん:2008/12/01(月) 21:08:52
ピンしてmemcpyでどうだ。
#include <cstring>

double native2DVec[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
array<double, 2> ^cli2DVec = gcnew array<double, 2>(3, 3);
pin_ptr<double> p = &cli2DVec[0, 0];
std::memcpy(p, native2DVec, sizeof native2DVec);

std::copyでもできたけど、書くのが面倒だった。

ところで多次元配列の要素の連続性の保証ってあるよね?
324デフォルトの名無しさん:2008/12/01(月) 21:52:35
>>323
できました!
連続性の保障は怪しい気もしますが、とりあえずは手元で動くのでokということにしておきたいと思います…
325デフォルトの名無しさん:2008/12/02(火) 00:28:22
マネージ多次元配列はメモリレイアウトに関してなんら保障してなかったような・・・
ジャグ配列にして一行ずつコピーした方がいいんでね?
マーシャリングはともかくアクセスはジャグの方が速いし。
326デフォルトの名無しさん:2008/12/02(火) 03:54:37
>>325
3x3行列なので、ジャグ配列にするのもなんかなあ、という気分なのです。
最悪2重forでコピーかなあ。
327デフォルトの名無しさん:2008/12/02(火) 20:04:50
小さい行列を大量に扱うんだったら>>322-323みたいなのはかなり非効率だと思うよ
3×3と決まってるなら手打ちでいいじゃん
328デフォルトの名無しさん:2008/12/12(金) 00:25:00
MFCのダイアログアプリで質問です。
画面上のボタンを押すとWindowsForm画面を開いています。
こんな感じです

ボタンの処理
Form1 ^ fm = gcnew Form1;
fm->Show();

画面は普通に開きますが
別プロセスみたいにメイン画面の下に隠れます
親ハンドルを指定すればいいのかな?と思い
下のようにしても裏に隠れます

Form1 ^ fm = gcnew Form1;
fm->Show(fm->FromHandle(GetSafeHwnd()));

親子関係にするにはどうやればいいのかわからないです。
fm->Parentやfm->Ownerを設定してもダメでした

MFCダイアログとWindowsForm画面の親子関係は無理なんでしょうか?
やりたいことはMFC画面上に.NETコンポーネントである
グラフコントロールを表示したいだけです。
素ではダイアログに組み込めないのでWindowsForm画面に組み込み
子画面として特定の位置に固定させようとしています。
画面は表示できたのに位置合わせだけがダメです。

329デフォルトの名無しさん:2008/12/12(金) 08:05:01
MFC 側で Window Activate 時に Form を前にしてやればいいんじゃね?
330デフォルトの名無しさん:2008/12/12(金) 08:07:09
後は、ホストするか
http://msdn.microsoft.com/ja-jp/library/676cbawx(VS.80).aspx
331328:2008/12/12(金) 08:28:12
レスありがとうございます。
少し進展がありました。

ラッパーというのを作って
public ref class HwndWrapper : public IWin32Window
{
public:
HwndWrapper(HWND handle)
{
this->handle = static_cast<System::IntPtr>(handle);
}

virtual property System::IntPtr Handle
{
System::IntPtr get()
{
return handle;
}
}

private:
System::IntPtr handle;

};

332328:2008/12/12(金) 08:29:03
Showのところでこうやると親子関係できました。

HwndWrapper ^ww = gcnew HwndWrapper(GetSafeHwnd());
fm->Show(ww);

ただ、親が動いても子は元の位置のままなのでちょっと不便です
ウインドウ上にボタンが乗ってるように一緒に移動してくれません。
MFC側でコントロールするとどうしても遅れが生じるので不自然っぽいです。

どうもうまくいかないので教えていただいた
「MFC ダイアログ ボックスとしての Windows フォーム ユーザー コントロールのホス」
の方をやってみます。
333デフォルトの名無しさん:2008/12/12(金) 10:02:59
子ウィンドウとownedウィンドウの区別も付いてないのか
334328:2008/12/12(金) 10:52:09
ホストの方法でいけました
ありがとうございました
335デフォルトの名無しさん:2008/12/13(土) 18:30:25
ぬこでも〜のwindows SDK編のイントロダクションのコードが
cygwinでコンパイルで通りませぬ・・・
VSでも無理だったんですが原因わかりますか?

http://www.kumei.ne.jp/c_lang/sdk/sdk_00.htm
336デフォルトの名無しさん:2008/12/13(土) 18:38:46
スレチ、winAPIスレへ行け
337デフォルトの名無しさん:2008/12/13(土) 18:53:26
char使ってるからunicodeがらみだろうが
すれ違いの上エラーの内容も書かない阿呆か。
338デフォルトの名無しさん:2008/12/15(月) 01:57:38
VS2005の環境でプログラム書いていたのですが、
テキスト形式のデータを読みだそうとすると以下のエラーが出てきてしまいました。

System.ObjectDisposedException' のハンドルされていない例外が mscorlib.dll で発生しました。

追加情報: 閉じている TextReader から読み取ることはできません。

System.ObjectDisposedExceptionのことを調べてもいま一つどういうことなのかがわからなかったので、
何がダメだと言われているのか教えていただけないでしょうか?
初心者なので意味不明な質問になってしまっているかもしれませんが、よろしくお願いします。
339デフォルトの名無しさん:2008/12/15(月) 02:03:39
端的に言えば、Close/Disposeを読んだ後に、まだ何かやろうとしてるということ。
自分でそれらを呼んでいるか、自動変数のスコープを抜けるときに自動的に呼ばれたか。
340デフォルトの名無しさん:2008/12/15(月) 10:29:08
元のコードに原因がある。
341デフォルトの名無しさん:2008/12/15(月) 13:12:47
>338
こっち池

くだすれ.NET(超初心者向け)
http://pc11.2ch.net/test/read.cgi/tech/1160209713/
342デフォルトの名無しさん:2009/01/04(日) 04:35:53
参照クラスって、使用しなくなったインスタンスを自動開放してくれるって
ことでいいんだよね?
343デフォルトの名無しさん:2009/01/04(日) 14:11:08
そんな単純なものじゃない
住む世界が違う
344デフォルトの名無しさん:2009/01/11(日) 01:45:20
この言語でMFCは使えるんですか?
345デフォルトの名無しさん:2009/01/11(日) 01:46:21
使える
346デフォルトの名無しさん:2009/01/11(日) 02:07:07
フォームアプリからMFCサポートに変更
MFCアプリから.NET使用&フォームアプリダイアログ作成
できるんですか?
347デフォルトの名無しさん:2009/01/11(日) 02:08:36
できる。聞くばかりじゃなくて、やってみればいいだろ
単純な MFC アプリケーション作って、そこで CLR サポート有りにすればいい
348デフォルトの名無しさん:2009/01/11(日) 02:11:00
MFCウィンドウ内に.NETコントロールを置くほうはCWinFormsControl/View/Dialgのクラスもある。
349デフォルトの名無しさん:2009/01/11(日) 16:10:30
全然わかりません、MFCで共通言語ランタイムサポートを選ぶと/MTと一緒はダメと言われます。どの項目を選んでもダメです。
これはどうすればいいんですか?
350デフォルトの名無しさん:2009/01/11(日) 16:38:36
MFC の共有DLLを使えよ。どの項目を選んでも駄目ですって条件反射で書いてるんじゃねぇ
351デフォルトの名無しさん:2009/01/12(月) 11:22:55
VS2008を再インストールしたら治る可能性があります。とかいうからやったらほんとに治った
共通言語ランタイムサポートにできました!
352デフォルトの名無しさん:2009/01/18(日) 05:10:12
アンマネージからrefクラスの関数を呼び出すにはどうすればいいんですか?
353デフォルトの名無しさん:2009/01/18(日) 05:36:03
managed -> managed で呼び出すのと同じ
354デフォルトの名無しさん:2009/01/18(日) 05:39:11
>>352
静的メンバなら>>353の言うとおり。
非静的メンバの場合、#pragma unmanagedや/clrなしの領域から直接呼ぶことは不可能。
#pragma managedな領域にそれを呼び出すだけのラッパー関数を置くしかない。
インスタンスの保持だけは、<msclr/gcroot.h>してmsclr::gcroot<>で可能。
例えばこんな感じ。
#include <msclr/gcroot.h>
msclr::gcroot<System::Object^> CreateObject()
{
return gcnew System::Object;
}
int GetHashCode(msclr::gcroot<System::Object^> const& h)
{
return h->GetHashCode();
}
#pragma unmanaged
#include <iostream>
int main()
{
msclr::gcroot<System::Object^> h = CreateObject();
std::cout << GetHashCode(h) << std::endl;
}
355デフォルトの名無しさん:2009/01/18(日) 05:40:25
ラッパーはmanaged領域でのネイティブクラスでも可能。ただし、依然としてmsclr::gcrootは必要。
#include <msclr/gcroot.h>
class XObject {
public:
XObject() : o(gcnew System::Object) {}
int GetHashCode() {return o->GetHashCode();}
private:
msclr::gcroot<System::Object^> o;
};
#pragma unmanaged
#include <iostream>
int main()
{
XObject o;
std::cout << o.GetHashCode() << std::endl;
}
356デフォルトの名無しさん:2009/01/18(日) 05:51:22
はっきり言って全然わかりません。同時に使うのは厳しすぎますね
じっくり解読しますありがとうございます。
357デフォルトの名無しさん:2009/01/18(日) 07:01:49
354と355のコードでは、refクラス = System::Object、関数 = GetHashCodeとして書いてある、一応。
358デフォルトの名無しさん:2009/01/30(金) 01:24:35
なぜに、MFC+.NETなんて使う必要があるんだ?
.NETが許される案件なら.NETで押し通せばいいじゃん

大抵の案件は、.NETは拒否られる

359デフォルトの名無しさん:2009/01/30(金) 01:28:02
自分の狭い世界で語られてもな
360デフォルトの名無しさん:2009/01/30(金) 02:06:05
.NETは遅い
361デフォルトの名無しさん:2009/01/30(金) 02:35:18
そーだね
でもrubyよりは速いよ
起動以外は
362デフォルトの名無しさん:2009/01/30(金) 21:08:41
Visual Studio 2008がやたら、重いんで
ちょっとしたテストプログラムはテキストエディタで作成して
コマンドラインからビルドしたいんですけど、どうすればいいのかしらん?
363デフォルトの名無しさん:2009/01/30(金) 21:16:08
nmake か VCBuild を使う
364デフォルトの名無しさん:2009/01/30(金) 22:18:18
C++/CLIのString型とC言語のchar文字列は、
どのようにデータをやり取りさせればいいのでしょう?

char c_str[]="1234";
String ^cli_str;

cli_str = c_str; // cli_strに"1234"をコピー

と言った事をやりたいのですが。

365デフォルトの名無しさん:2009/01/30(金) 22:31:23
cli_str = gcnew String(c_str);
366デフォルトの名無しさん:2009/01/30(金) 22:34:52
2008以降ならmarshal_asおよびそのソースコード
367デフォルトの名無しさん:2009/01/30(金) 22:40:43
バカ正直にやるならASCIIEncoding
368デフォルトの名無しさん:2009/01/30(金) 22:46:30
その実体はMultiByteToWideChar
369デフォルトの名無しさん:2009/01/30(金) 22:49:20
ありがとうございます。
コンパイルやってみて上手く動きました。

String型文字列をchar型にコピーするのについても質問したいのですが、

c_str[0]=cli_str[0];

というのを繰り返す事でコピーできる事まで調べました。
これを行う為の関数のようなものはあるのでしょうか?
370デフォルトの名無しさん:2009/01/30(金) 23:00:33
・・・みんないっぱい検索キーワード出してるじゃん
まじめに探したの?
371デフォルトの名無しさん:2009/01/30(金) 23:08:35
marshal_contextを使うか、CString/CStringA/CStringWを使うか。
どっちもexpress edtionだと使えなかったと思う。
裏技的にはsprintfを使う方法がある。
372デフォルトの名無しさん:2009/01/30(金) 23:12:30
だから、WideCharToMultiByte があるじゃないか
373デフォルトの名無しさん:2009/01/30(金) 23:17:04
>>372
それは単なるUNICODE-ANSI変換でない?

残りの方法はこんなとこ、使い方はぐぐってね。
Marshal::StringToHGlobalAnsi
Marshal::StringToHGlobalUni
PtrToStringChars
374デフォルトの名無しさん:2009/01/30(金) 23:18:12
>>369
それ仮名・漢字が入ると死ぬよ。
375デフォルトの名無しさん:2009/01/30(金) 23:19:24
Encodingが一番確実か
376デフォルトの名無しさん:2009/01/30(金) 23:25:26
>>373
Unicode -> MBCS変換だろうけど
WideCharToMultiByteは変換に使えないの?
377デフォルトの名無しさん:2009/01/30(金) 23:28:02
>376
そのまえにToArrayしてpin_ptrして、サイズ計算して、領域確保して変換だから
ほかの方法のほうが断然楽
378デフォルトの名無しさん:2009/01/31(土) 01:33:06
>>377
ToArrayよりPtrToStringCharsだろ。
いずれにせよ、pin_ptr<const wchar_t>化してしまえば、
既存のライブラリが使えるので、持ち合わせがあればそんなに悪くない選択肢だと思う。
379デフォルトの名無しさん:2009/01/31(土) 14:04:04
C++/CLIで書いたプログラムって
Monoで動く?
380デフォルトの名無しさん:2009/01/31(土) 14:09:57
動くのもあるし、動かないのもある
381デフォルトの名無しさん:2009/01/31(土) 14:23:46
/clr:safeのものは動く。
ただしSTL/CLIのサポートはまだのようだった。
382デフォルトの名無しさん:2009/02/01(日) 01:06:00
cl.exe でコマンドラインからコンパイルすると
〜.exe.manifest
なるものも生成され、削除すると〜.exeが起動しなくなります。

exe単体で起動できるようにするにはどうしたらいいのですか?
383デフォルトの名無しさん:2009/02/01(日) 01:13:32
>>382
mt -manifest HOGE.exe.manifest -outputresource:HOGE.exe;#1
これやると、manifestがexe内に埋め込まれるので、manifest無しで動く。
384デフォルトの名無しさん:2009/02/01(日) 01:29:08
>>383
ありがとう

できました。多謝です
385デフォルトの名無しさん:2009/02/01(日) 23:49:39
CLIスレ伸びませんねw

実際に使ってるところある?
386デフォルトの名無しさん:2009/02/02(月) 00:27:50
仕事で事前調査用に使ったが、周りに理解されず、本番はVC++6.0でMFC4.2ときたもんだwww

なんか、布教にいい道具があればいいのだけど…。
387デフォルトの名無しさん:2009/02/02(月) 01:41:31
WPFとかに対応しない限りまず消滅すると思った方がいいだろうね。
388デフォルトの名無しさん:2009/02/02(月) 02:25:50
WPFが俺の思ってる物と同じなら、対応するとかナニ言ってるんだって感じ。

まあ、Cのポインタ全部絶滅させられるならどっちでもいいがw
389デフォルトの名無しさん:2009/02/02(月) 02:27:19
>>388
絶滅させられないからこそのC++/CLIじゃないの?w
390デフォルトの名無しさん:2009/02/02(月) 08:48:55
今のところMFCのCArchive使ってファイル保存していた古いデータを
.NET側から簡単に読み込むためのモジュールを作るのに重宝してるってぐらいだなぁ。


391デフォルトの名無しさん:2009/02/02(月) 19:55:31
WPFみたいなほとんどマネージコードによるマネージコードのための超高レベルフレームワークを
わざわざC++で使う意味がわからない
392デフォルトの名無しさん:2009/02/03(火) 01:32:22
まぁP/InvokeやCOWだけじゃ困る場面もたまにはあるわけだし。
やってることは凄いんだが評価されないC++/CLI。

とりあえず「C++屋のための.NET言語」という勘違いをされ気味なのはなんとかすれ。
393デフォルトの名無しさん:2009/02/03(火) 02:17:17
進化したMS版C++Builderくらいにしか思ってませんでしたw
394デフォルトの名無しさん:2009/02/03(火) 02:20:41
使いやすいGUIライブラリ付きのC++という捉え方は誤解の元だね
395デフォルトの名無しさん:2009/02/03(火) 02:27:14
どうして誤解なのか解説しちくりくり
396デフォルトの名無しさん:2009/02/03(火) 03:16:05
使いやすくないからな。
GUI部分はC#でいいべ。
397デフォルトの名無しさん:2009/02/03(火) 09:07:45
C#の「#」は、++++ で C++++の略でしたっけ?
398デフォルトの名無しさん:2009/02/03(火) 09:21:42
>>396
まあそうなんだが、GUIだけ分けるのもかえって面倒だったりするしな。
399デフォルトの名無しさん:2009/02/03(火) 15:51:47
>>389
何言ってんだお前
400デフォルトの名無しさん:2009/02/04(水) 00:28:07
>>397
別に略ではないな
401デフォルトの名無しさん:2009/02/04(水) 15:17:24
で、どうしろと?
402デフォルトの名無しさん:2009/02/04(水) 21:50:29
とりあえずチンコでも揉んでみたら
403デフォルトの名無しさん:2009/02/04(水) 22:13:08
チンコとかの話しかしない人に必要な言語は
C++/クリ(ry

C++/CLIは地味だけど、商用デスクトップアプリで
.NET使う場合はよけて通れない言語じゃないかなぁ。
.NETなアプリはまだ本家MS様も出してないよね?
Expression もハイブリッドだし。
404デフォルトの名無しさん:2009/02/04(水) 22:18:08
ネイティブとマネージドのミックスタイプのアプリはMSのプロダクトに増えたけど、
基本的にホスティングがおおいな。
C++/CLIはあまり見かけない。
405デフォルトの名無しさん:2009/02/04(水) 22:53:46
>>404
あ〜。ホスティングだったのか。
勘違いを正してくれてありがトン
406デフォルトの名無しさん:2009/02/04(水) 22:59:00
XNAのWindows向けアセンブリくらいだろうなぁ。
407デフォルトの名無しさん:2009/02/04(水) 23:36:35
俺の言ったカンファレンスじゃ、ベンダーがC++/CLI がベストと言って楽しそうだった
408デフォルトの名無しさん:2009/02/04(水) 23:51:11
WPFも一部C++/CLIだな
XNAのフレームワーク部分はC#だよ
409デフォルトの名無しさん:2009/02/05(木) 00:03:15
>>408
んー? Reflectorで眺めた結果で予想してるだけだが、
Microsoft.Xna.Framework.Game.dll以外はほぼC++/CLIのアセンブリでしょ。
FBXインポータが3MB超なのも、もろにfbxsdkのバイナリとマージしてるからかと。
410デフォルトの名無しさん:2009/02/05(木) 01:17:05
ネイティブとマネージドのミックスタイプのアプリは現在、どの程度可能
なのか?

C++Builderでは、確かDelphi(Object Pascal)のコードがコンパイルできたと思う
が、こういうことがネイティブとマネージドの間で透過的にできるのか?

もちろん、マネージドコードとネイティブコードの混在ははるかに難しいと
思うが、これを簡単に実現できる方法を提示してもらわないとマネージドは
使う気になれない。

大体、トラブルがリンカエラーで出てくるというのは、エラー箇所の特定が
非常に難しく、最悪の状態ではないか?






まぁ、C#が良いみたいだけど、結局、VBだろが、VC++だろが、C#だろが
Windowsプログラミングになるとどの言語だろが関係ない。

結局、MIcrosofが決めた訳の分からん取り決めに振り回されることになる
から。
411デフォルトの名無しさん:2009/02/05(木) 01:18:58
日記もつけたし今日は寝る。お休み。
412デフォルトの名無しさん:2009/02/05(木) 01:29:23
>>410
その混在を実現しているのが今のところC++/CLIだけ。

#pragmaでネイティブとマネージドどっちのコードを吐くか切り替えられる。
ネイティブクラスとマネージクラスの混在(has Aでの包含)は
透過的ではないものの、手段は用意されている。
413デフォルトの名無しさん:2009/02/05(木) 02:22:24
http://blogs.msdn.com/bclteam/archive/2006/06/23/644343.aspx

ただのネイティブ関数呼び出しであるP/Invokeですら
導入した瞬間にこんだけの「隙」が出てきてしまうのだから
簡単に実現できる方法って言われてもお花畑だよなぁ。

理想に対する泥臭い現実解としてはイイ線いってると思うけどねぇC++/CLI。
414デフォルトの名無しさん:2009/02/05(木) 02:58:44
とりあえずガンガン使っていくので今後ともよろしく>C++/CLI

使って情報を出さないとね。ググった結果に引っかかるサンプル増やせば
ちったあ底辺広がるだろうし。
415デフォルトの名無しさん:2009/02/10(火) 09:57:12
バイナリフォーマットで100MBほどのデータを
シリアライズしようとしているのですが、
デシリアライズするときにメモリを数倍も消費して
ロードできないのですが、

デシリアライズをカスタマイズしないとできないのでしょうか?

GC::Collectするとメモリがいっぱい回収できます。
416デフォルトの名無しさん:2009/02/10(火) 20:58:03
諦めてXmlReaderかストリーミングでLINQ to XML使った方がいい
417415:2009/02/10(火) 23:00:48
結局、自前で読み書きするようにしました。
418デフォルトの名無しさん:2009/02/11(水) 13:54:41
>>392
> やってることは凄いんだが評価されないC++/CLI。

MSがC#を前面に押し出したから見向きされなくなったよね。
それにC++はもともと敷居が高い言語だけど、
マネージドが入るとさらに敷居が高くなるからね。
員数仕事じゃ使うの無理じゃない?
419デフォルトの名無しさん:2009/02/11(水) 13:58:36
>>418
>MSがC#を前面に押し出したから見向きされなくなったよね。
その頃はまだmanaged C++といってほとんど試作品」だったよ
420デフォルトの名無しさん:2009/02/11(水) 13:59:16
C++/CLIのコンパイラのソース出してくれないかなあ。
CLIじゃなくて、JVMのバインディング、面白そう。
421デフォルトの名無しさん:2009/02/11(水) 14:00:00
>>419
「その頃」違いです。
422デフォルトの名無しさん:2009/02/11(水) 17:01:01
そもそも、.NETはお金を頂くソフトウェア作るには不向き
・遅い
・ソース丸見え
・フレームワークインストール必須
・FAでは絶対に無理

枚挙に暇がない
423デフォルトの名無しさん:2009/02/11(水) 17:35:54
今時そんなのが問題になるのか?
424デフォルトの名無しさん:2009/02/11(水) 17:48:12
>・ソース丸見え
あっちこちでネガネガしてる奴のようだ。ほっとくに限る。
425デフォルトの名無しさん:2009/02/11(水) 18:58:12
組込みでC言語、VB6を少々

しかやった事無いけど、CLRでデータロガ作ってみた。
Windowsの知識はほとんど無いけど、すごく簡単ね

Win32Apiでやろうと思ってたけど、自分のツール程度ならCLRでいいかな。
とりあえず田舎で本が手に入らないからゴリ押し(ほぼC言語w)で作成中、
勉強すればもっと便利に使えると思うんだけど・・・。

皆さんはどうやってC++/CLRを勉強したの?
426デフォルトの名無しさん:2009/02/11(水) 19:00:29
勉強?
どこをどう勉強する必要があるんだ??
427デフォルトの名無しさん:2009/02/11(水) 19:17:43
>>425
C++の経験者が使う言語だと思ったほうがいい。
Win32APIやCのライブラリを使わないならVB.netやC#やったほうがいい。
428デフォルトの名無しさん:2009/02/11(水) 19:18:12
デフォルトでスマートポインタなCOMの一種と考えるとそれほどでもない
429デフォルトの名無しさん:2009/02/11(水) 21:36:59
C++とC#の経験があればそのまま使える
というか,そういう人にしか旨味のない言語
簡単だと思うのはC#やVB.NETを触ったことがないから
430425:2009/02/12(木) 03:33:22
>>426-429
ありがとう、意見を参考に、ずっとC#のサンプルコードいじってた。
とりあえず腹減ったので寝ようかな。

>>427
当初Win32APIをやろうと思ったけど、開発効率重視で諦めました。

*組込み屋なんで速度と柔軟な処理が可能かが気になりましたが、
そんな難しいもの作るわけじゃ無いので。
431デフォルトの名無しさん:2009/02/14(土) 19:15:48
E-mail欄ってほとんどE-mail欄の役割は果たしてないよね。
432デフォルトの名無しさん:2009/02/14(土) 21:38:35
果たしてるスレもあるよ、カードゲームのトレードスレとか
433デフォルトの名無しさん:2009/02/21(土) 13:57:06
良い時は悪い時。
悪い時は良い時。
434デフォルトの名無しさん:2009/02/22(日) 11:54:55
C++/CLI なんですが、教えてください。
(スレ立てるまでもないスレで誘導されてきました)

<NewDataSet>
 <OYA>
  <DATA1/>
  <KODOMO>
   <DATA2/>
  </KODOMO>
 </OYA>
</NewDataSet>

こんな感じの xml データを操作したいと思います。
DATA1 なら、 DataSet.Tables[ "OYA" ]->Rows[ 0 ][ "DATA1" ] で参照できるのですが、
DATA2 にはどのようにしたら参照できるのでしょうか。
435デフォルトの名無しさん:2009/02/22(日) 12:00:31
>>430
デスクトップでプログラム書く時は、組み込み脳は捨てろ。
436デフォルトの名無しさん:2009/02/22(日) 12:12:44
>434
それ C++/CLI と関係ないし

Schema はどう定義されているの? XML読み込んだDataSetからSchemaを見てみたら?
437デフォルトの名無しさん:2009/02/22(日) 12:13:36
そういう質問は軽くC#の書き方覚えてC#スレで聞いたほうが早いよ
438434:2009/02/22(日) 14:27:57
別の方法で解決できました。ありがとうございました。

>>436
こんな感じです。
(xs:schema とか xs:complexType など、なくてもわかりそうなところは消しています)

<xs:element name="OYA">
 <xs:element name="DATA1" type="xs:string" minOccurs="0" />
 <xs:element name="KODOMO">
  <xs:element name="DATA2" type="xs:string" minOccurs="0" />
 </xs:element>
</xs:element>

このスキーマ自体も DataTable.Add や DataColumn.Add などでプログラムで作成したモノを
ファイルに落としていました。

>>437
その言葉がヒントになり、System::Xml::XmlElement などを使って解決することを思いつきました。
意外なほど簡単でびっくりです。
439デフォルトの名無しさん:2009/02/22(日) 14:31:08
C#で試したらLINQに行っちゃう気が
440デフォルトの名無しさん:2009/02/22(日) 14:49:58
LINQ楽なんだよな〜
3.5に移行する気ないからテストプログラムでの使用オンリーだけど
441デフォルトの名無しさん:2009/02/22(日) 15:36:22
System.Xml.Linqの使いやすさは異常
言語としてのLINQサポートがなくても十分使いやすいと思う
442434:2009/02/22(日) 18:19:33
確認したらウチの 2008 standard にも C# 入ってたし、覚えようかな。。。
443デフォルトの名無しさん:2009/02/24(火) 23:47:48
覚えても使う機会が(ry
444デフォルトの名無しさん:2009/02/25(水) 18:13:15
おれ、がめついからVS2008EEを全部インストールしたけど
一番使わないと思ったVC++を今一番使ってる
445デフォルトの名無しさん:2009/02/25(水) 18:18:35
cl vjc fsi jsc ... やっぱり一番使うのはmlでっしょ
446デフォルトの名無しさん:2009/02/25(水) 19:16:16
いちばん使わんのはVBだな
447デフォルトの名無しさん:2009/02/25(水) 19:20:23
ILASM最高
448デフォルトの名無しさん:2009/03/01(日) 13:03:01
newとgcnewって
マルチスレッドでコンパイルすれば、
スレッドセーフですか?
449デフォルトの名無しさん:2009/03/01(日) 14:48:00
当然だ。でなきゃ使い物にならないだろ。
450デフォルトの名無しさん:2009/03/03(火) 23:00:37
早急に回答を頂きたいのですが、
テキスト(アスキー)をバイナリに変換する方法を教えてください。
本当に急いでいます。よろしくお願い致します。
悩んでいます。本当に。
451デフォルトの名無しさん:2009/03/03(火) 23:07:42
テキストもバイナリの一種ではあるのだが。とか言ってみる。w
なにをしたいの?
452デフォルトの名無しさん:2009/03/03(火) 23:07:56
エスパーさん
出番ですよー
453450:2009/03/03(火) 23:11:59
>>451

>なにをしたいの?
出世です。

bitconverterあたりを調べても何も出てきませんよ。ため息以外は。
本当に急いでいます。今日は寝ません。本当に。
454デフォルトの名無しさん:2009/03/03(火) 23:13:54
>>453

>>451

> >なにをしたいの?
> 出世です。

> bitconverterあたりを調べても何も出てきませんよ。ため息以外は。
> 本当に急いでいます。今日は寝ません。本当に。
455デフォルトの名無しさん:2009/03/04(水) 00:19:50
printfでいいじゃない。ヘキサダンプもバイト出力も自由自在。
456450:2009/03/04(水) 00:29:54
出力させても意味はないのです。
バイナリデータにしないといけないのですよ。
回答まだですかね? 眠くなってきましたわ。
本当に。
457デフォルトの名無しさん:2009/03/04(水) 00:47:16
だから冗談抜きでテキストはバイナリなんだけど
458デフォルトの名無しさん:2009/03/04(水) 00:50:25
じゃあfprintf
459デフォルトの名無しさん:2009/03/04(水) 01:00:36
適当に圧縮して保存すればおk
460デフォルトの名無しさん:2009/03/04(水) 01:42:09
charまたはstringをintにキャストしたいという意味だろうか
461デフォルトの名無しさん:2009/03/04(水) 02:09:17
ならばsprintfで
462デフォルトの名無しさん:2009/03/04(水) 05:20:49
C++/CLIではC#のようなAnyCPUのEXEやDLLは作れないんですか?
463デフォルトの名無しさん:2009/03/04(水) 08:22:34
>462
/clr:safe にすれば?
464デフォルトの名無しさん:2009/03/04(水) 10:05:25
あーそんなオプションがあったんですね
ありがとうございます
465デフォルトの名無しさん:2009/03/04(水) 10:09:17
C++/CLIを使う価値99.9%減だけどな
466デフォルトの名無しさん:2009/03/04(水) 10:20:32
/clr:safeだとコンパイル通りませんでした;;
467デフォルトの名無しさん:2009/03/04(水) 10:26:08
/clr:safeの場合はネイティブコードを混ぜられないからな
単なる劣化C#になっちゃうからC#使った方がいいよ
468デフォルトの名無しさん:2009/03/04(水) 10:42:40
0x1234 みたいなテキストをバイナリの2byteとかにしたかったのかな...

そんな事で出世できる会社がうらやましいわw

469デフォルトの名無しさん:2009/03/04(水) 13:24:29
何がしたかったんだろうな
エスパーじゃないからさっぱりわからん
470デフォルトの名無しさん:2009/03/04(水) 13:30:49
GZipStream でも使えばよかったのにな
471デフォルトの名無しさん:2009/03/04(水) 18:15:31
C++/CLIのコードで「reinterpret_cast」の部分を選択してコピー ( Ctrl + C ) したらVSが固まるのって俺だけ?
472450:2009/03/04(水) 23:48:34
>>468
まさに、それがしたかったのですよ。
やっと理解者が現れたか。
473デフォルトの名無しさん:2009/03/04(水) 23:57:01
>>468 の才能に嫉妬。w

sscanf とかでもいいんじゃないの。もっといいのあったと思うけど。
474デフォルトの名無しさん:2009/03/05(木) 00:05:52
Converter でいいんじゃね?
今度はエンディアンの違いとかで騒ぎそうだけどさwww
475デフォルトの名無しさん:2009/03/05(木) 00:20:51
C 互換の数値リテラルなら strtol() かな。
書き下ろしても大したこと無いように思うけど。
476デフォルトの名無しさん:2009/03/05(木) 12:48:19
>>472
そうかわかったぞ
GoogleのTwitterをいち早く読んで
出世にいかそうとしてるんだ・・・・なんてなw
477デフォルトの名無しさん:2009/03/05(木) 22:25:34
こんなこと言うのはなんだけど、そんなのC++/CLIでやる
ことじゃないよな・・・
しかも、C#とかJavaとかCとかならまだしも、なぜC++/CLI ・・・
478デフォルトの名無しさん:2009/03/06(金) 00:35:00
いままで MFC を主に使ってた人間が C++/CLI を使い始めようというときに、
よい参考書ってないかな? ネットで調べつつ、特に問題なく書くことは出来るんだけど、
なにか見落としてそうで怖い。

他のところでも聞いてみたんだけど。。。
479デフォルトの名無しさん:2009/03/06(金) 01:15:33
C++は初心者では無いけど、.NETは全くの初心者というのなら多分無い

既に知っているかもしれないが、C++も.NETも使いこなせるような人がその両方を活かすために選択するのがC++/CLI
C++を勉強するために選択するべきものではないし、.NETを勉強するために選択するべきものでもない
480デフォルトの名無しさん:2009/03/06(金) 10:10:56
>478
現状で特に問題がないなら、むしろ .net framework の癖というか、ライブラリの作り方が
載っている C# の本を買ったほうがいいお
そこらに載っていることをC++/CLIで表現できれば十分じゃない?
481デフォルトの名無しさん:2009/03/06(金) 11:10:11
C++/CLIで書かれてる情報だけを調べて特に問題なく書けてきたなら尊敬に値する
482デフォルトの名無しさん:2009/03/06(金) 11:40:00
ttp://msdn.microsoft.com/ja-jp/library/ms235289(VS.80).aspx
とりあえずこれ読むといいよ。

前にマネージ型の実行時型情報の扱いでちょっと苦労したな。
SomeClass::typeid でType型が返ることさえ分かってしまえば
全部解決なんだが、なかなかそこに辿り着けなかった。
つーかなんでIntelliSenseで出ないんだこれ。
483デフォルトの名無しさん:2009/03/06(金) 11:44:05
それアンマネージC++→C++/CLIじゃなくてManaged C++→C++/CLIだよ
ひたすら表記の違いだけが書いてあるだけ
.NET初めてなら実行時型情報なんてそもそも何のことかわからんでしょ
484デフォルトの名無しさん:2009/03/06(金) 12:04:54
あのぅ、RTTIは…
485デフォルトの名無しさん:2009/03/06(金) 12:51:46
>>483
そうだけど、ManagedとCLIでほとんど全部変わってるので、
結果的にC++/CLI構文の端的な解説みたいになってる。
まあマネージドの概念とかeventみたいな特殊なのは
他のところで頑張って覚えてもらうしかないが、
その場合もここで出てきたキーワードでMSDNライブラリ引けば
だいたい解説があるし。

あと実行時型情報なんて必須知識ではないし、
他のも必要なものだけ覚えりゃいいと思うよ。
人によっては value class や enum class も必要なかろう。
486478:2009/03/06(金) 23:02:03
たくさん、ありがとう。
とりあえず >>482 さんの教えてくれたサイトを読んでみます。

自分でも調べているところですが、>>479 さんも仰られているように .NET を
まず覚えないといけなさそうですね。いただいたレスの中にさえ見覚えのない
単語がある状況からしてなんとかしないと。

>>481
意外となんとかなるモノですよ。
まあ、C++/CLI そのものではないけど、ちょっとずついろいろと触ってきてるし。
487デフォルトの名無しさん:2009/03/06(金) 23:05:34
最低限C#は読めないと話にならないよ
488デフォルトの名無しさん:2009/03/07(土) 17:56:55
ネット上のサンプルコードの量はVBが一番多い気がする
でもVBのよさが分からない。
489478:2009/03/07(土) 19:08:36
調べていての感想は
「‥‥なんか VB みたい」
でした。w


C# は読むだけなら別に問題なくできたりします。
(ネットで拾った C# のコードを C++/CLI に置き換えたりしてお勉強してます)

一番戸惑うのは、自分が欲しい機能を持った関数がどこにあるのか見当が付けづらいことですね。
基本的な手順などは Windows の API や MFC を使う場合と大差ないような気がするので、
既存のコードを読む場合には VB でも C++/CLI でも C# でもわかるのですが、自分で書く場合に
どこにその関数があるのかわからず途方に暮れるというか。w

昨日も、マネージ拡張でちょっとしたツールを書いてたのですが、書いてる時間よりも
必要な関数の情報を集める方に圧倒的に時間を要してました。むー。
490デフォルトの名無しさん:2009/03/07(土) 22:09:50
C++/CLIは異なるアーキテクチャを混ぜただけだからややこしくなる。

APIやMFCを使いたいならC++の方が制約なしに使えるし。
.NETフレームワークを使いたいならC#だろうし。
初めのうちはどちらかを選んで情報を収集したほうがいいよ。
491デフォルトの名無しさん:2009/03/07(土) 22:54:05
C#やVBなら慣れてくるとインテリセンスでテキトーにメンバ探せる
だまされたと思ってちょっとVC#触ってみたら?
異次元の使いやすさでアホらしくなるからw
492デフォルトの名無しさん:2009/03/17(火) 17:03:00
畑を荒らしてるのはモグラじゃないよ。
モグラの穴を利用しているネズミだよ。
モグラは肉食だから野菜は食べないよ。
493デフォルトの名無しさん:2009/03/18(水) 17:00:28
穴掘る時点で荒らしてます。
494デフォルトの名無しさん:2009/03/23(月) 19:03:10
アンマネージのコードで作成されたウィンドウにマネージコードのコントロールを乗せる方法ってないですか?
495デフォルトの名無しさん:2009/03/23(月) 20:13:41
あります。
496デフォルトの名無しさん:2009/03/23(月) 21:07:38
>>495
出来ればヒントだけでもお願いします。
あるソフトのプラグインで複雑なGUIを組みたいのですがC++ CLIの情報自体が少ない上に
こんなニッチなことをしている人はいないみたいなので。
497デフォルトの名無しさん:2009/03/23(月) 22:41:29
>496
上の方のスレ読んだ?
498デフォルトの名無しさん:2009/03/24(火) 05:01:11
>>497
ありました。
MFCですか。使ってないけどなんとかやってみます。
499デフォルトの名無しさん:2009/03/28(土) 14:31:53
いま、C++/CLI の勉強中なんですが、C# との連携をやってみたくなりました。

C# で画面系を作って、それ以外を C++/CLI でやってみるとか考えているのですが、参考になりそうな HP とかないですかね。
自分でも調べ始めたところなんだけど、間違った方向に行かないようにするためにも最初だけは他力に縋ってみたくて。
500デフォルトの名無しさん:2009/03/28(土) 15:10:23
春休みかあ
501デフォルトの名無しさん:2009/03/28(土) 22:47:42
>499
C++/CLI は普通にアセンブリを作れるから、C++さえわかっていればC#からそれほど
離れている訳じゃなく、構文上の癖だけ理解すればいいんだけど、C++はできるんだよね?
502デフォルトの名無しさん:2009/03/28(土) 23:53:08
>>501
C++ は特に問題ないす。
C# とかもたぶん問題ないです。書かれているのを読むだけなら普通に出来ます。

C++/CLI を調べるときに MSDN を読むとほとんど常に C# とか VB とかの関数も併記されているので
一緒に使えるんだろうな、とか思ったのが連携させたいと思ったきっかけでした。

「アセンブリ」、調べてみます。


>>500
まあ、あの質問の仕方ではそう思われるすね。たしかに。
503デフォルトの名無しさん:2009/03/28(土) 23:56:18
まあ参照設定すれば見える。
それも同じソリューションなら適宜やってくれるはずだし。
504デフォルトの名無しさん:2009/03/29(日) 00:28:25
>502
ほれ。これで充分じゃね
ttp://vene.wankuma.com/ecma372/08_overview.aspx

アセンブリはメタデータ付きのDLLのことだお。.NETでは EXE と DLL は両方ともアセンブリで
違いはスタートアップの有無だけ。だから、EXE も参照することができるんだお
505デフォルトの名無しさん:2009/03/30(月) 09:07:35
従来のC関数もEXEからエクスポートできたりするわけだが。
506499:2009/04/03(金) 22:25:42
返信をくれた方、ありがとうございます。
アク禁を食らってました。(某報道機関所属じゃないですw)

いただいたアドバイスを元に試験用プロジェクトをいじり倒した結果(そこまではしてないけど)、
普通に C# と C++/CLI でプログラムを組めるところまで来ることが出来ました。

‥‥ほんっとに便利な世の中になったモノです。
文字コードの変換も数行で終わっちゃうんだもの。(´・ω・`)
507デフォルトの名無しさん:2009/04/17(金) 09:39:44
ageさせてもらいます。
C#の方からC++/CLIを経由(ラッパ)してアンマネージのMFCクラスを使う方法で困っています。
C#→C++/CLI→CWndのCreate()を呼ぶと、内部のAfxGetInstanceHandle()でassertが出ちゃうんです。
どうもMFCの初期化をしてやらなくちゃならない様なのですが、さっぱり情報がありません。
508デフォルトの名無しさん:2009/04/17(金) 12:15:00
509デフォルトの名無しさん:2009/04/17(金) 14:14:21
解決しました。
MFC拡張DLLをひっつけるのではなく、単なるクラスライブラリにしたら
うまく行きました。
お騒がせしました。
510デフォルトの名無しさん:2009/04/18(土) 00:48:46
CLIはヘッダーに実行コード書くのに違和感が...
511デフォルトの名無しさん:2009/04/18(土) 00:52:27
それは、単にVC++の新規プロジェクトで作成されるコードがそうであるというだけのことだろ。
512デフォルトの名無しさん:2009/04/18(土) 09:03:44
そうだけど、いちいち書き直すのめんどくさいんだよな。
普通に宣言と実装に分けてくれればいいのに、
なんでこんなことになってんだろう。
513デフォルトの名無しさん:2009/04/18(土) 11:09:53
C# とか他の .net 開発言語?でそうだからなんじゃない。
ヘッダとコードが別々な C/C++ の方が珍しいってどこかで聞いた。

そんな分離の話よりも、ひとつのフォームとかのコードをすべて同じファイルに記述する
人が多いことの方が気になる。ちょっと規模が大きくなるとごちゃごちゃして分かりづらいことこの上ない。
そのほかにも VB6 の頃に不満に感じてたことを、いまここでまた目にするとは。。。
514デフォルトの名無しさん:2009/04/18(土) 11:43:50
VBは知らんが、今のC#はデザイナで作ったコードと
ユーザーが実装したコードは別になってる。
あれと同じようにしてくれればそれでいいんだが。
VS2010でC++に大きく手が入るってことになってるが、
ぜひ変更して欲しいところだ。
515デフォルトの名無しさん:2009/04/18(土) 20:45:17
むしろヘッダに実装全部書いても問題のない言語デザインに変更してほしい
516デフォルトの名無しさん:2009/04/18(土) 21:21:25
プロパティなんていちいち分離して書いてられないもんな
ただでさえ面倒な文法なのに
517デフォルトの名無しさん:2009/04/18(土) 21:43:11
>>515
むしろ、ヘッダを書く必要のない言語にだろう。
D言語ではコンパイラがコンパイルするときにヘッダファイルを自動生成してくれるらしい。

テンプレートとかどうなってるのかは知らんけど。
518デフォルトの名無しさん:2009/04/18(土) 22:03:28
よく知らないけど n1778 とか
519デフォルトの名無しさん:2009/04/18(土) 23:57:24
まあC++はC++の文法であることが存在意義だからな。
嫌ならおとなしく最近の言語を使うしかあるまい。
520デフォルトの名無しさん:2009/04/19(日) 19:31:20
そうかなあ
521デフォルトの名無しさん:2009/04/19(日) 23:03:28
C++/CLIは進化したC++として使うための言語じゃないでしょ
逆に「C#アンマネージ拡張」でよかったのに
522デフォルトの名無しさん:2009/04/21(火) 08:50:34
ヘッダとソース分けると
using namespaceがうざいことになる。

まーヘッダだけフルパスで書けばすむんだが。
523デフォルトの名無しさん:2009/05/11(月) 10:57:13
過疎スレに質問。

C#やVB.NETってdecompiler使うと生ソース丸出しになっちゃうけど、
C++/CLI で clrsafeでないソース書いてもやっぱ丸出しになっちゃう?
524デフォルトの名無しさん:2009/05/11(月) 11:18:22
マネージド部分は当然
525デフォルトの名無しさん:2009/05/11(月) 16:29:59
しかし何で、見えるのを気にする奴がいるんだ。
はっきり言ってどうでもいい。どうせ見てもわかる奴は見ないし。
見たい奴はわからないだろうから。
526デフォルトの名無しさん:2009/05/11(月) 16:39:17
.NETの場合はメタ情報がしっかり残ってるというのがポイントだな。
それと逆コンパイルのツールが手軽に手に入るといったところか。
ソースが逆生成できるというならそれなりのツールを使えばCからでも
相当の精度で可能なのだが、マクロやテンプレートの展開でソースが
スパゲッティになったり関数やクラス名など型情報が抜け落ちるので
その分解析しづらい。
.NETでもクラス名や関数名のメタ情報を書き換える程度の
難読化ツールを使えば解析しづらくなるから使ったらいい。
527デフォルトの名無しさん:2009/05/11(月) 16:42:57
実際ある程度の規模のソースになると、仕様書もコメントもないソースを提示されても
見る気も起きないのが普通。
見られて困るといってるのはパスワードを入れるとエロ画像が拝める系のしょうもない
シェアウエアの作者と相場は決まっている。
528デフォルトの名無しさん:2009/05/18(月) 16:58:48
表記法がまるで入れ替わっていて美しくないと思うけど、
仕様でミスった方はC#でいいよね。

C#
ファイナライズ ~MyClass()
ディスポーズ IDisposable.Dispose()

C++/CLI
ファイナライズ !MyClass()
ディスポーズ ~MyClass()
529デフォルトの名無しさん:2009/05/18(月) 17:58:59
>>528
C#使ったことあるの?
530デフォルトの名無しさん:2009/05/18(月) 18:02:26
あったらこんなこと書かないでしょw
531デフォルトの名無しさん:2009/05/18(月) 18:52:35
C#でもディスポーズを~MyClass()と定義するべきだったと思う。
532デフォルトの名無しさん:2009/05/18(月) 19:11:06
>>531
ヒント:経緯。順番。
533デフォルトの名無しさん:2009/05/19(火) 23:57:42
C#のディスポーズは歴史的な失敗作
534デフォルトの名無しさん:2009/05/20(水) 00:11:45
って、いうかGCに対応する為に
覚えなきゃならない概念が増えるのがイヤだ。
弱い参照だのトラッキング参照だのファイナライズだの
535デフォルトの名無しさん:2009/05/20(水) 08:20:08
VS2010ベータが出たので入れてみたがC++/CLIでIntelliSenseが使えなかった。
536デフォルトの名無しさん:2009/05/20(水) 11:35:35
>535
C++って0x対応とIntelliSense強化がメインじゃなかったっけ?
537デフォルトの名無しさん:2009/05/20(水) 12:02:59
CLIじゃないC++ではIntelliSense使えるし、
C#にあったコンパイル前にエディタ上でエラー表示する機能も追加されてる。

なのになぜかC++/CLIでは
IntelliSense: 'Unavailable for C++/CLI'
と表示されてしまう。
538デフォルトの名無しさん:2009/05/20(水) 15:40:46
助けてくだちい
C#からC++のクラスライブラリを使いたいので、
C++/CLIでラップするクラスライブラリを作っていたら、
何かC++のクラスのインスタンスをC++/CLIでnewすると、
例外が出てしまいますーorz
アンマネージコードのデバッグを有効にするとセーフ
回避する方法ありますか?
539デフォルトの名無しさん:2009/05/20(水) 17:46:50
別のDLLのクラスをnewしようとしてるんじゃねぇ?
540デフォルトの名無しさん:2009/05/20(水) 18:23:56
>>538
gcnew
541デフォルトの名無しさん:2009/05/20(水) 22:05:06
>538
人にものを聞くときは例外ぐらいコピペしろよ、このデコ助野郎
542デフォルトの名無しさん:2009/05/21(木) 11:16:43
>> 541

すみません。
例外は以下の通り。

System.Runtime.InteropServices.SEHException はハンドルされませんでした。
Message="外部コンポーネントが例外をスローしました。"
ErrorCode=-2147467259(0x80004005)

>> 540
アンマネージの実体は、newで作るんですよね?

>> 539

C++のクラスライブラリは、static libです。
dllにしても変化なし。
C++のクラスに、virtualの関数が無ければOKです。
何故??
543デフォルトの名無しさん:2009/05/21(木) 11:45:45
InteropServices の例外?
COMオブジェクトでもコンストラクタで生成してるの?
ライブラリの実績はあるんだよね
544デフォルトの名無しさん:2009/05/21(木) 13:39:10
>> 543
C++の方は、DirectShow(COM)を使いに行きます。
ライブラリの方は、C++ではちゃんと動いてます。

自分も、COM辺りが怪しいのかなと思って、COMを一切アクセスしない
空のクラスをテストで作ってみたのですが、それでもダメでした。

上で書いたvirtualというのは間違いで、今色々試したところ、
クラスにメンバ変数があるとダメの様です。意味不明。

ただ、DirectShowのサンプルにあるBaseClassesというlibを流用しています。
それが引っ付いてるのですが、グローバルでstaticな変数定義とかがあるので、
その辺りで何か問題があるのかもしれないですね。
545デフォルトの名無しさん:2009/05/21(木) 13:56:01
> 外部コンポーネントが例外をスローしました。
と書いてあるとおり、COM内部で例外を投げている。
原因はいろいろあるが、何れにしてもCOM内部での話なのでCLRには関係ない。
546デフォルトの名無しさん:2009/05/21(木) 14:00:42
>>545
わかりました。
COMが例外出しているのですね。
有難うございましたm(__)m
547デフォルトの名無しさん:2009/05/25(月) 20:02:57
DataGridViewで、下のコードで、コンボボックスをセルの中に入れたいんだが、
デフォルトが必ずブランクになる。
アンマネージの時みたいに、デフォルトのIndexって、設定できないの?

//---create a new bindingsource control---
BindingSource^ bindingsource = gcnew BindingSource;

//---add the items into the control---
bindingsource->Add("Type A");
bindingsource->Add("Type B");
bindingsource->Add("Type C");


//---create a combobox column---
DataGridViewComboBoxColumn^ comboBoxCol = gcnew DataGridViewComboBoxColumn;

//---set the header---
comboBoxCol->HeaderText = "Types";

//---data bind it---
comboBoxCol->DataSource = bindingsource;

//---add a combobox column to the DataGridView control---
dataGridView1->Columns->Add(comboBoxCol);


548デフォルトの名無しさん:2009/05/25(月) 22:19:11
アンマネージの時みたいってのがさっぱりわからないが
DataGridView::RowAddedイベントかBindingSource::ListChangedイベントで
549デフォルトの名無しさん:2009/06/04(木) 06:24:44
俺はVisual Stidio 2003なので、CLIは使えん。
マネージ拡張C++だけになるが、そのタイトルのスレは無いので、ここに書いても
かまわないか、それともだめか。
550デフォルトの名無しさん:2009/06/04(木) 09:13:45
ここは今無き ManagedC++ スレの直系だからおけー
551デフォルトの名無しさん:2009/06/04(木) 10:24:36
/clr:oldSyntax で今でも一応使えるが、もうすっかり忘れてしもーた。
552デフォルトの名無しさん:2009/06/05(金) 01:20:50
愚痴。

VC6ソースなアンマネージDLL内の関数が、FLIE*な引数を要求してくるんだ。
で、C++/CLI内でラッパークラスを作ってそこでfopenした結果を渡してやると
書き込み時に例外 System.AccessViolationException が出て使えない。

この手のストリームをアンマネージな相手に渡すときに注意することは
なにかあったかなぁ...。
553デフォルトの名無しさん:2009/06/05(金) 01:58:27
そのDLLはVC6でビルド済みなの? 
だったらCRTのバージョン非互換の可能性もあるけど。
554デフォルトの名無しさん:2009/06/05(金) 02:29:44
愚痴とか言わずに、素直に 「誰か知ってたら教えて!!」 って言えばいいのに
555デフォルトの名無しさん:2009/06/05(金) 02:33:21
そしてお前が次に言う台詞は
ググレカス
556デフォルトの名無しさん:2009/06/05(金) 22:22:04
>>552
CRT境界を超えるなあほう
557デフォルトの名無しさん:2009/06/05(金) 23:28:39
くり
558デフォルトの名無しさん:2009/06/07(日) 01:40:19
>>556
いやまあしかし、逆方向には渡せるし使えるからなぁ。
この辺のやっていい事か否かの判断は難しいね。
559デフォルトの名無しさん:2009/06/07(日) 03:11:04
俺もね、CRTで悩んでるのよね。
DLLの中にグローバル変数置いてるんだけどさ、
CRTのデバッグ系DLLをリンクすると問題ないのに
リリース系DLLをリンクすると、アプリケーションの
初期化に失敗しましたってなっちゃうんだよね。
何なんだろうねコレCRTかんけーねーじゃん。
つーかC++/CLIにも関係ないか。
560デフォルトの名無しさん:2009/06/07(日) 13:21:48
これからC++/CLIを学ぼうとおもっているのですが、
なにが良いサイトを紹介していただけますでしょうか・・・。
561デフォルトの名無しさん:2009/06/07(日) 14:13:00
いまのスペックは?
562デフォルトの名無しさん:2009/06/07(日) 14:17:09
500000です
563デフォルトの名無しさん:2009/06/07(日) 14:21:46
私なんて52万ですよ。ホホホ
564デフォルトの名無しさん:2009/06/07(日) 14:40:53
VBの関数を使えると聞いたのですがどうやって使うのでしょうか?
若しくは解説しているページはありますか?
くだスレというスレで聞きたかったのですが、dat落ちしてしまったようです
565デフォルトの名無しさん:2009/06/07(日) 14:55:32
VBがVB.NETであることと、C++/CLIが何か分かっていての質問?

プロジェクトの右クリックで参照...の「新しい参照の追加」でMicrosoft.VisualBasic追加すればいい。
using namespace Microsoft::VisualBasic;
で探すといくつかサンプルあるかもよ。
566デフォルトの名無しさん:2009/06/09(火) 12:58:38
>>558
出来るとやっていいは違うべ
DllMainでMessageBox呼ぶのだって同じだろ
567デフォルトの名無しさん:2009/06/12(金) 01:41:29
品薄みたいなのでボランティア出品しました。必要な方どうぞ
業者さんには悪いですが、1万ほど値を下げさせてもらいました
すごく安いと思います。
amazonです
568デフォルトの名無しさん:2009/06/18(木) 22:37:07
int send_data_[64];
char buf[128];
memset(buf, 0, sizeof(buf));
memcpy(buf, reinterpret_cast<char*>(send_data_), sizeof(send_data_));
これがやりたいんですが

array<int>^ send_data_;
send_data_ = gcnew array<int>( 64 );
array<Byte>^ sendBytes;
sendBytes = gcnew array<Byte>( 128 );
sendBytes->Clear( sendByte, 0, sendByte->Length );
このあとどうすればいいんでしょうか?
569デフォルトの名無しさん:2009/06/18(木) 22:53:48
>>568
コピー元と先のサイズが一致してないぞ
System::Buffer::BlockCopy
あとarray<T>^は初期化されるのが保証されてるからClearはいらない
570デフォルトの名無しさん:2009/06/19(金) 00:21:25
あとは、pin_ptr 刺して memcpy でいいんじゃないか?
571デフォルトの名無しさん:2009/06/19(金) 12:46:11
テンプレート使ったときのメモリー処理を超低レベル関数と組み合わせるのって心情的に怖いなぁ
572デフォルトの名無しさん:2009/06/19(金) 14:19:21
テン・・・プレート・・・だと?

array は int[] と書く代わりに array<int> と書いているだけで、メモリの直列性は保証されて
いるから問題ない
573568:2009/06/19(金) 23:02:54
System::Buffer::BlockCopy( send_data_, 0, sendBytes, 0, send_data_->Length * sizeof(int) );

解決しました。レスありがとうございました。
574デフォルトの名無しさん:2009/06/21(日) 22:03:43
checkedListBoxでフォーカスされたアイテムのテキストをTextboxに設定したいのですが
GotFocusで飛んできたときにSystem::Object^ sender, System::EventArgs^ eからどうやって
検索なり変換なりをして扱うのかわかりません、どなたかわかれば教えてください。
575デフォルトの名無しさん:2009/06/21(日) 22:18:46
そもそもGotFocusはコントロール自身がフォーカスを得るときに発生するんであって
現在のアイテムが変更されたときには発生しないんだが?
576デフォルトの名無しさん:2009/06/22(月) 04:27:56
いや現在のアイテムが変更されたときではなく複数のアイテムがあって
そのアイテムの選択が変わったときにTextboxの内容を変えたいだけ。
577デフォルトの名無しさん:2009/06/22(月) 04:48:08
まず用語を明確に定義して
アイテムって何
現在のアイテムの変更って何
複数のアイテムって何
アイテムの選択って何
フォーカスはどこ消えた
578デフォルトの名無しさん:2009/06/22(月) 08:03:07
アイテムは
int sCount = 0;
checkedListBox_A->Items->AddRange(gcnew cli::array< System::Object^ >(1) {L"A" + sCount});
で増やした項目のことをさしてます。そのアイテム(A,B)が複数あった場合にBからAに選択された時に
Aが選択されたときにAが選択されてることを知りたいです。
579デフォルトの名無しさん:2009/06/22(月) 09:37:30
GotFocus 事態は発生してるんだろ?
sender のオブジェクトは何が入っているのか、中身を確認すればいいだけじゃね
580デフォルトの名無しさん:2009/06/22(月) 11:54:06
>>579
GotFocusは他のコントロールから移ってきたときに発生するイベントだって

CheckedListBox::SelectedIndexChangedイベント
CheckedListBox::Itemsプロパティ
CheckedListBox::SelectedIndexプロパティ
この辺
SelectedItemを直接変更はNG
581デフォルトの名無しさん:2009/06/22(月) 12:33:05
神の焦点?
582デフォルトの名無しさん:2009/06/22(月) 14:00:41
>580
なるほど。WPFとかだとItemsにLabelを入れてLabelのGotFocusにdelegate食わせれば
いけるんじゃね。WinForm の場合も、Object にLabelを放り込んでできないか?
583デフォルトの名無しさん:2009/06/22(月) 22:53:15
>>580 のイベントを拾うのが一番普通な気がする
584デフォルトの名無しさん:2009/06/23(火) 06:13:33
http://118.82.122.42/products/
で使われてるみたいな左にウィンドウの幅が変更可能なTreeViewと
右に別のやつみたいなことをしたいのですがこの構成は何かにはめ込んで
実現されてるのでしょうか?
585デフォルトの名無しさん:2009/06/23(火) 10:01:09
なんだかこないだから、これの宣伝でもしてるのか?
C++/CLIのスレで聞くってことはフォームの範囲で聞いてるのかな。
586デフォルトの名無しさん:2009/06/23(火) 12:53:06
WinFormの質問なら.NET汎用かVB,C#すれで聞いたほうが早い。
おそらく宣伝だろうね。
587デフォルトの名無しさん:2009/06/23(火) 23:17:38
VC2008 C++/CLI
UDPClient マルチキャスト通信です、MSNのサンプルのままですがReceiveからかえってきません。

 UdpClient^ rClient = gcnew UdpClient( RemoteIpEndPoint );
 try
 {
  data = rClient->Receive( RemoteIpEndPoint );
 }
 catch( Exception^ e )
 {
  Console::WriteLine( e->ToString() );
 }

Sendは問題なくできています。何か他に設定が必要なのでしょうか?
588デフォルトの名無しさん:2009/06/23(火) 23:34:59
リモートホストが何も送ってこないだけじゃね?
589587:2009/06/23(火) 23:57:49
>>588
1台のPCで複数アプリ間での通信なんです。
Socketを使って確かめたけど、送られてはいるんですよ。
590デフォルトの名無しさん:2009/06/24(水) 00:45:58
JoinMulticastGroup
591デフォルトの名無しさん:2009/06/25(木) 22:11:11
Form1とForm2のように複数のフォームがある場合での質問です。
Form2で定義したテキストボックスのテキストをForm1でボタンを押したときに変更したいんですが
どういう風にすれば違うフォームのオブジェクトを操作できますか?
592デフォルトの名無しさん:2009/06/25(木) 22:15:18
593デフォルトの名無しさん:2009/06/25(木) 22:17:02
winforms以前の問題だ
悪いことは言わん
C#からやりなさい
594デフォルトの名無しさん:2009/06/25(木) 23:44:21
>>591 やり方は幾つか(てか、いくらでも)ある。質問の仕方が悪すぎる。
595デフォルトの名無しさん:2009/06/26(金) 11:03:32
C++/CLIってやっぱ素のC++は使えない?
例えばポインタとか。
596デフォルトの名無しさん:2009/06/26(金) 11:08:19
使えるよ。何でそう思ったの?
597595:2009/06/26(金) 11:09:24
managed C++だと、素では使えなくて、
unsafeだとか要ったキガス
598デフォルトの名無しさん:2009/06/26(金) 11:20:26
unsafeってそれC#
/clr:safe としない限りは使える。
ただしマネージドオブジェクトに対しては参照を使用する必要がある。
599595:2009/06/26(金) 11:25:56
つまり、マネージドオブジェクトを参照しない限り、通常のC++プログラムと実行ファイルになるんだ。
600デフォルトの名無しさん:2009/06/26(金) 11:40:41
>>599
C++/CLIを選択した時点でそうはならんよ。あくまでマネージコード上で実行されるネイティブコードだ。
実行時の構造はObjective-Cあたりとは逆のイメージだな。

てゆーか質問してんのか自分の思い込みに賛同してほしいのかどっちなんだよ。
601600:2009/06/26(金) 11:45:43
>マネージコード上で実行されるネイティブコード
あ、間違えた。C++だけで書いても#pragma unmanaged指定しない限り基本的にマネージコードだった。
602595:2009/06/26(金) 11:46:35
.NET調査です。
解析系ライブラリはC++なのでC#やVB.NETは_。
今までのC++アプリに.NET混ぜれば良いのかなと思うのですが、
どの部分に.NETを使えば良いのか調査。
603595:2009/06/26(金) 11:50:44
>C++だけで書いても#pragma unmanaged指定しない限り基本的にマネージコード

C++で開発しておいて、.NETバイナリが欲しくなったら、ドットネットコンパイルすればおk?
604デフォルトの名無しさん:2009/06/26(金) 11:55:45
DLL か COM のラッパー作った方がいいんじゃねぇの?
605デフォルトの名無しさん:2009/06/26(金) 12:00:48
その用途ならCLRのホスティングだな。ネイティブアプリからCOMで.NETの呼び出し。
CorBindToRuntimeExあたりでググれ。

もうひとつのパターンはネイティブアプリのルーチンをライブラリ化して.NETアプリから呼び出す。
C++/CLIはこれの橋渡しみたいなもんだ。C#+P/Invokeなどでも可能。
606595:2009/06/26(金) 13:11:14
>ネイティブアプリからCOMで.NETの呼び出し。

解析処理はC++で書かれてるので呼び出す.NETって何だろう?

>.NETアプリから呼び出す。

.NETアプリは現状無い。。。
607デフォルトの名無しさん:2009/06/26(金) 13:19:19
C++で書かれてて、それで使えていて、あえて.NETとMIXしたい理由ってナニ?
よくあるのは画面とか入出力を.NETで簡便に作りたいというのが多いけど。
608デフォルトの名無しさん:2009/06/26(金) 13:35:39
>606
解析処理で使うんだから、あえて処理の実態をC++/CLIで作る必要はないだろ
解析部はDLLかCOMにしておいて、C++/CLIからそれを呼べばいい
なんか変な夢を見て、どっかんと大きく変えて失敗した責任をC++/CLIに押しつける羽目に
なりそうだな
609595:2009/06/26(金) 13:55:12
最近、会社に来る人材派遣系とか中途応募してくる人的に.NET経験者が多いということから、.NETとの関わり方を調査することとなりました。

単純思考でC++&.NETと考えたのですが、”将来○○だから、.NETと折り合いが必須」みたいなビジョンを模索中。

会社的にはITRON系OSを使ってるのでソース共有の観点から、C++をC#に書き変えたくない。
610デフォルトの名無しさん:2009/06/26(金) 14:23:02
>609
あのさ、正直、あんまりちゃんと領域を考えていないだろ
たとえば漏れの知っている例で言うと、解析エンジンをクラウド上に乗せて管理周りやUIを
.Net でと言う話とかも聞くよ。だがな、解析エンジンというのはある意味ノウハウの結晶さ
強制的に置き換えても、今までと結果が変わったり、初期依存周りのパラで挙動が
変わったりするさ。そういうことを考えずに、安易に両方できるから C++/CLI とか
手を出したら痛い目に遭うよ
まずやるべきことは、既存エンジンに影響が出ないよう、DLLやCOMでラッピングして
.Net からインターフェイス経由でやりとりできるよう、エンジン周辺をきれいに設計する
ことじゃね?
611595:2009/06/26(金) 15:06:21
なるほど、エンジンはC++にしておいて、
実行環境が.NETが有利な環境で画面でも.NETで作れば良いですか。

Winで.NETは少し抵抗があるが、LinuxやMac、泥井戸ではありかも。
612デフォルトの名無しさん:2009/06/26(金) 17:56:54
いやWinだからこそ.NET
特にC++/CLIはWinでしか使えない
613595:2009/06/26(金) 18:01:04
>C++/CLIはWinでしか使えない

そうなんかorz

GUIに関しては、C++ Builderでペタペタやってるので、超快適だお
614デフォルトの名無しさん:2009/06/26(金) 18:30:00
ネイティブコードさえ混ぜなければ他の環境で動かないこともないよ
ただその場合はそれこそポインタすら使えないのでC#で全部書き直した方がマシなレベル
615デフォルトの名無しさん:2009/06/26(金) 18:37:58
そんなこと、このスレで言われても。。。
616デフォルトの名無しさん:2009/06/26(金) 19:17:45
やる気ないのに調査しろと命令されて、仕方なく2chに丸投げした感じだな。
617デフォルトの名無しさん:2009/06/26(金) 22:26:41
なんかたまたま C# のDLLImport を調べてたら・・・ 実は Wikipedia の記事が一番シンプルで
わかりやすかった

http://ja.wikipedia.org/wiki/P/Invoke
618デフォルトの名無しさん:2009/06/26(金) 22:28:53
地味に誤爆しました
619デフォルトの名無しさん:2009/07/04(土) 18:24:19
C#2008を使い始めました
CLIのenum型を一個ずつ追加していくにはどう書いたら
いいのでしょうか?
具体的にはRegexOptionsをNoneの状態から追加して
いきたいのですが・・。
620デフォルトの名無しさん:2009/07/04(土) 18:27:38
質問の意図が読み切れんが、|=
621デフォルトの名無しさん:2009/07/04(土) 18:40:44
むむ
RegexOptions^ Option = gcnew RegexOptions();
Option |= RegexOptions::CultureInvariant;
これでコンパイルエラーerror C2676が出てしまいました・・。

622デフォルトの名無しさん:2009/07/04(土) 18:50:26
それはこれと意味的に大体同じ 見るだに意味不明だろう
int* x = new int();
x |= 3;
623デフォルトの名無しさん:2009/07/04(土) 19:04:53
enumってそもそも静的に定義を列挙して使うものじゃないのかな?
リフレクション関連を駆使すればenumの内容を動的に追加とか出来るかもしれないけど・・・。
624デフォルトの名無しさん:2009/07/04(土) 19:10:38
フラグを立ててるだけで別にメンバを追加してるわけじゃない
ごく普通の使い方
列挙型は値型だから^はいらない
625デフォルトの名無しさん:2009/07/04(土) 19:14:21
なるほど・・。
*Option = *Option | RegexOptions::CultureInvariant;
でコンパイル通りました。
ありがとう!

626デフォルトの名無しさん:2009/07/04(土) 19:16:18
斜め上だなー……
627デフォルトの名無しさん:2009/07/04(土) 19:17:06
そっちの勘違いをしてたのか。
C++/CLIでは値型をgcnewするとBoxingされた状態で生成されてしまう。

RegexOptions Option = new RegexOptions(); // C#
RegexOptions^ Option = gcnew RegexOptions(); // C++/CLI
は同じ意味じゃない。
628デフォルトの名無しさん:2009/07/04(土) 19:20:23
基本的に値型に^は付けない
パフォーマンスが落ちるし、C#など他のほとんどの.NET言語ではサポートされてないので良くない
629デフォルトの名無しさん:2009/07/07(火) 21:49:30
2008 でコンパイルした dll とか exe を 2003 のプロジェクトで参照って出来ないよね?
両環境用に作ってやらないとダメかな。。。
630デフォルトの名無しさん:2009/07/07(火) 23:42:26
できるけど必ずしも完全な互換性があるわけではないので
可能なら避けるべき
631デフォルトの名無しさん:2009/07/07(火) 23:51:11
ん〜。やっぱりそう?
プロセス間 I/F のクラスを作ってそれぞれで共用しようと思ったけど、
同じ仕組みのを 2003/2008 別個に作ることにするよ。
632デフォルトの名無しさん:2009/07/14(火) 04:10:47
http://www.webtech.co.jp/sstudio/pro/img/f_time/f_chart.png
の右にあるようなものをC++/CLIで表現したいのですが似たようなものが見付かりませんでした。
何かそれに近いものや組み合わせればいけそうなものがあれば教えていただけますか。
633デフォルトの名無しさん:2009/07/14(火) 04:29:24
要素の数が多そうだからコントロールを並べるより、
Graphicsで直接書いたほうがいいかも。
C++/CLIはあんまり関係ないな。VBかC#からはじめなよ。
634デフォルトの名無しさん:2009/07/17(金) 23:25:44
教えて欲しい。

VS2008 の C++/CLI でメール関連のプログラムを書いているんだけど、
System::Net::Mail::Attachment を使って添付ファイルをつけると、プログラムが
終了するまで添付ファイルに使用したファイルを操作することが出来なくなる。

で、調べて、System::Net::Mail::Attachment は使い終わった後に、Dispose すると
ヘルプにもネットの記事にも書かれているようなんだが‥‥コンパイルすると C2039 エラーで
そんなメンバはないと怒られる。

エラーメッセージを読むと「代わりにデストラクタと呼べ」とあるので試しに delete してみたら
使用したファイルを普通に操作できるようになった。

マネージ環境では delete はしないモンだと思ってたんだけど、これでいいんだろうか?
期待通りに?動くからいいんだけど。。。
635デフォルトの名無しさん:2009/07/17(金) 23:32:08
Destructors and Finalizers in Visual C++
に書いてる
636デフォルトの名無しさん:2009/07/17(金) 23:37:05
C++/CLI では C# のDisposeパターンはデストラクタで実装されている
637デフォルトの名無しさん:2009/07/17(金) 23:38:58
そんなもんC++/CLIで作るなよ
638デフォルトの名無しさん:2009/07/17(金) 23:39:38
deleteを直接呼ぶのはDisposeを直接呼ぶのと同じだから避けるべき。

C#ではusingを使うのが常識だけど、C++/CLIで同じことをやるには、
自動変数の形で使うか、それが無理ならauto_handle/auto_gcrootを使う。
639デフォルトの名無しさん:2009/07/17(金) 23:51:18
delete を・・・直接、呼ぶ?
ざわ・・・ざわ・・・
640デフォルトの名無しさん:2009/07/18(土) 00:00:31
別におかしくない
C#でもDisposeの呼び出しを単独で書くことはしない
絶対にusingを使うかfinallyの中で呼ばないといけない
641デフォルトの名無しさん:2009/07/18(土) 00:09:01
classのメンバにDispose持ちがいたら普通に単独で呼ぶが
642デフォルトの名無しさん:2009/07/18(土) 00:14:34
その呼び出しの発端は単独ではないだろ
643デフォルトの名無しさん:2009/07/18(土) 00:17:49
>>641
でもその場所はどうせデストラクタ・ファイナライザの内部以外に有り得ないでしょ。
それくらいだったらいいと思うけど。

でも、C++/CLIならauto_handleをクラスメンバにできなかったっけ?
644デフォルトの名無しさん:2009/07/18(土) 00:23:20
でも、単独での呼び出しを書くことがあるというのは事実だよねって話

>>643
そいやC++/CLIってメンバに^付きで書かなきゃメンバのDisposeも勝手に読んでくれるんだよね
645デフォルトの名無しさん:2009/07/18(土) 00:24:29
ファイナライザでDisposeは絶対ダメ
ファイナライザでメンバのマネージオブジェクトにアクセスするのは原則禁止
646デフォルトの名無しさん:2009/07/18(土) 00:29:22
誤解を招くなぁそれ。C++/CLIのファイナライザ構文なんて
勝手にDispose呼び出しを生成してんぞ。

引数付きのDisposeパターンを守れってだけでしょ。
647645:2009/07/18(土) 00:36:47
すまん言葉足らずだった
ファイナライザで"メンバの"Disposeはダメ
648634:2009/07/18(土) 11:29:44
thx
こんなに沢山の人がいたんだ。。。

だいぶ慣れたと思ってたけど、まだわかってないことが多いみたい。
もっとお勉強するよ。
今回のは >>638 の auto_gcroot を使ってみようと思う。

>>637
C++ が好きなんだもん。w
649デフォルトの名無しさん:2009/07/18(土) 15:01:37
auto_handleはマネージクラス・マネージコード内、
auto_gcrootはネイティブクラス・ネイティブコード内で使う。
650デフォルトの名無しさん:2009/07/18(土) 15:51:27
C++好きなのはいいけど.NETに慣れる意味でも一度はC#やってみたほうがいいよ
なぜ本スレでさえアンマネージコードとの相互運用という本来の目的以外での
C++/CLIの使用に否定的な人が多いのか理解できるはず
651デフォルトの名無しさん:2009/07/18(土) 15:57:56
相互運用ならC++/CLIはいい。もうC#でDllImportする気が起こらない。
652デフォルトの名無しさん:2009/07/19(日) 00:02:11
653デフォルトの名無しさん:2009/07/19(日) 00:13:08
いや、DllImportさえ簡単に貼り付けられればC#で問題ない、という程度のことではないから。
654634:2009/07/19(日) 00:54:11
>>649
thx
勘違いして入れ替わってたよ。

auto_gcroot は変数定義した後に代入できるけど、auto_handle は変数定義の時の
初期化でしか代入できないとか、多分、何かの都合があるんだろうけど、面白いね。

>>650
どっちでも一応書ける。
だいたい画面系に C# 、それから呼ぶライブラリ関連に C++/CLI を。(最初にそうお勧めされた)
いまいち「目的外での C++/CLI に否定的」ってのがよくわかってないんだけど。。。
感覚的にはわかるような気もするけど、言語として C# の方に抵抗を感じたりして。
655デフォルトの名無しさん:2009/07/21(火) 12:12:27
>>650
やっぱ、CLIは無意味?
656デフォルトの名無しさん:2009/07/21(火) 18:51:25
>>655
ブリッジ
657デフォルトの名無しさん:2009/07/21(火) 18:56:51
ドトネトにブリッジする理由は???
658デフォルトの名無しさん:2009/07/21(火) 21:47:10
.NET開発の補助として使うものであって、決して
「.NETが使える便利なC++」ではない
659デフォルトの名無しさん:2009/07/21(火) 23:02:04
適材適所という言葉があってだな(ry
660デフォルトの名無しさん:2009/07/22(水) 08:06:27
この天気、日食どころじゃねーな。
661デフォルトの名無しさん:2009/07/22(水) 09:19:19
それ食えるのか?
662デフォルトの名無しさん:2009/07/22(水) 10:12:57
ドトネト材の適所って何?
663デフォルトの名無しさん:2009/07/22(水) 10:35:54
Java+JNIと比べるとはるかに優れているな。
だれか、javaVM用のC++/CLI?を作ってくれ。
664デフォルトの名無しさん:2009/07/22(水) 10:41:19
ハンドルの指すアドレスの最初の4バイトは何のデータですか?
昔.NETを勉強したときに、
オブジェクトヘッダーは同期ブロックインデックスと
クラス定義へのポインタで構成されてると
読んだ記憶があるんですが
665デフォルトの名無しさん:2009/07/22(水) 12:55:00
>>664
知ってどうするんだよ?
666デフォルトの名無しさん:2009/07/26(日) 16:56:25
おしえて。

フォームアプリのテキストボックスとかにデータバインディングで、
DataTable の要素を関連づけて入力値を管理したい。

ここで、テーブル中のレコードが1つの場合はいいんだが、複数あって
かつ、バインドするレコードを動的に変更したい場合ってのはどうすれば
いいのだろうか?

よくわからなかったので、

・バインド用に同じ構造のテーブルを用意して
・そこにレコードをひとつだけ作り
・そのレコードに元テーブルの任意のレコードの値をコピーする
・フォーム終了後にもとのテーブルのレコードに値をコピーし直す

方法で使おうとも思ったのだけど、もっと直接的な方法がありそうな気がする。
いかがだろうか。教示いただけると嬉しい。
667デフォルトの名無しさん:2009/07/26(日) 17:08:13
>>666
ここよりもC#、VB、ADO.NETスレあたりで聞いたほうが早いと思うよ。
668デフォルトの名無しさん:2009/07/26(日) 18:06:25
そう? じゃ、C# のスレに移動するよ。
thx
669デフォルトの名無しさん:2009/07/27(月) 23:44:45
質問です。
自転車って制限速度が無いと聞いたことがあります。
一方で、系車両は制限速度30km/hと聞いたことがあります。
自転車に関してはどうなのでしょうか。
自転車に速度計装着の義務付けが無い以上、
制限速度自体、無意味なことだと思うのですが。
670デフォルトの名無しさん:2009/07/27(月) 23:50:41
無料で難読化できるソフトはありますか
671デフォルトの名無しさん:2009/07/28(火) 00:34:28
ある
672デフォルトの名無しさん:2009/07/28(火) 10:55:16
>>669
軽車両には車両種別による速度制限はありません。標示の制限に従ってください。
673デフォルトの名無しさん:2009/07/28(火) 14:57:05
C++/CLI的には見られたくないところはネイティブコードで書けばいい
674デフォルトの名無しさん:2009/08/04(火) 06:16:44
PictureBoxの左上を座標(0,0)としてマウスでクリックしたときの
PictureBoxの左上からのオフセット座標を取得したいのですが
いい方法ありますでしょうか。
675デフォルトの名無しさん:2009/08/04(火) 06:47:44
>>674
取得したいも何も、MouseClickイベントで受ければ
MouseEventArgsに入ってるだろ。
676デフォルトの名無しさん:2009/08/06(木) 06:26:04
質問です。
初期化時にPictureBoxに格子上の線を描画したあと、PictureBox内をクリックした場所に図形を描画したんですけど
再度クリックしたときにその図形を消したい場合は一度RefreshやClearなどをしたあとに格子上の線・図形は再度描画
するしか方法ないですよね。
677デフォルトの名無しさん:2009/08/06(木) 06:27:14
___
←樹海| 
 ̄|| ̄ ┗(^o^ )┓三
 ||    ┏┗  三
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

678デフォルトの名無しさん:2009/08/06(木) 09:04:47
>>676
毎回描画し直します。
C++/CLIに限らない.NET Frameworkの使い方についてはC#かVB.NETのスレで質問することをお勧めします。
(C++/CLIにしかない機能を使わないならC++/CLIを使うこと自体お勧めしません)
679デフォルトの名無しさん:2009/08/12(水) 11:52:55
質問です。
プロジェクトの新規作成で自動的に作成されるFrom1.hですが、
簡単に一括で、それらしい名前(CalcMainForm.h等)に変換で
きる方法はありますか?(自動生成されるコード内のClass名称
なども追従したい)

今は、手作業でファイル名の変更後、コード内の名称を置換しています。
680デフォルトの名無しさん:2009/08/12(水) 12:10:44
VSのアドインとかでリファクタリングのツール探してみては
681デフォルトの名無しさん:2009/08/12(水) 18:06:34
ファイル名はファイルのプロパティの名前
クラス名はクラスのプロパティのName
簡単と感じるかは人による
682デフォルトの名無しさん:2009/08/15(土) 10:36:57
俺はウィザード直後に即削除。
新しく任意のFormクラスを作成→コードゴリゴリw
683デフォルトの名無しさん:2009/08/23(日) 00:11:09
クラスを参照渡しするときに、mainで渡すと問題なく実行できるのですが
クラスの中で渡すと下記のエラーが発生してしまいます。

"演算子 '%' は、値型または ref クラスのインスタンスにのみ適用できます"

このエラーを回避するためにはどのようにすればいいでしょうか?


おk:
main(){
A^ a;
B^ b;
b->(%a);
}

マズー:
ref class Z{
A^ a;
B^ b;
b->(%a);
}
684デフォルトの名無しさん:2009/08/23(日) 01:50:23
クラスの中に処理は直接書けない。メソッドの中に書く。
エラーを回避とかそういう次元の問題ではないのでまずはC#かC++を一通り勉強するべき。
685デフォルトの名無しさん:2009/08/23(日) 02:10:25
これからC++/CLIを勉強しようと思うんだけど
どんな本読んだらいいのかしら?^^
686デフォルトの名無しさん:2009/08/23(日) 02:21:17
VisualStudio2008ExpressEditionをイジリ倒す。
687デフォルトの名無しさん:2009/08/23(日) 02:24:20
C++とC# (またはVB7-)をどのくらい理解してるかでいろいろ違ってくる。
両方まだなら手を出さないほうがいい。
688デフォルトの名無しさん:2009/08/23(日) 06:57:30
というかC++もC#も両方使いこなせる人にしかC++/CLIを使う意味がないし使う必要もない。
689デフォルトの名無しさん:2009/08/23(日) 07:16:52
C++はGOF本を読むレベルっす。オブジェクト指向設計も任せてネ★
MFCはまぁそこそこ。ATLはさっぱり。WTLはみたこともない。

C#? なにそれ?
マイクロソフトローカルな糞言語になんてまったく興味ねぇんだよっ
690デフォルトの名無しさん:2009/08/23(日) 08:07:39
C++/CLIのスレで、よくそんなことがいえるな。
C++/CLIがよりいっそうマイクロソフトローカルな糞言語なのを理解しているのか?
691デフォルトの名無しさん:2009/08/23(日) 09:37:50
所詮はつぎはぎで緊急避難するときだけ使う補助言語だからな
692デフォルトの名無しさん:2009/08/23(日) 10:16:28
ワロタ
>>689は自分がどこに書き込んだのかもわかってないのか
693デフォルトの名無しさん:2009/08/23(日) 11:20:47
自分は C++/CLI については 実践C++/CLI 極めるための基礎と実用テクニック を読んだだけだな。
あとは C# まで含めてどうとでもなったよ。

ただ。最初のコードを見る限り、基本からわかってないと思うけど。
C++ がどうとかではなくて、プログラミングの基礎からって意味で。
ちゃんと基礎からやった方が、結局は時間の節約になると思う。
694デフォルトの名無しさん:2009/08/23(日) 22:41:47
つまり、。NETについて学ぶにはまずC#を習得して来い…と。
C#…なぁ。Javaならまだ学ぶ気あるんだけど。
(J++1.0が出た当時にちょろっとかじったから、基本はあるんだよ^^
 でも最近はJava5とかいうのらしいから、勉強しなおしかな^o^;)

どうせ5年もしないうちに「なかったこと」にされるような言語なんて
学ぶだけ資源の無駄だしなぁ。どうしようかなぁ。ああー。
695デフォルトの名無しさん:2009/08/23(日) 22:51:22
C#が世に出て既に8年ほどたつが、まだなかったことにはなってないな
C++/CLIのほうがよほど…
696デフォルトの名無しさん:2009/08/23(日) 23:00:41
これって何に使うの?
C++Builderの代わり?
697デフォルトの名無しさん:2009/08/23(日) 23:15:50
てか、基礎のある人間なら、わざわざ覚えるってほどのモンでもないだろ。
MFC わかるんだよね?
698デフォルトの名無しさん:2009/08/23(日) 23:20:23
J++のWFC、delegate、J/Directを理解してるならそれはそれですごいな。
delegateはC#のとも一味違うぞ。
699デフォルトの名無しさん:2009/08/24(月) 06:41:25
C#やったことなくてもC++/CLIは使えるかもしれないけど
C#で.NETの流儀に慣れてないと.NET的にはとんでもないコードが確実に出来上がる
700デフォルトの名無しさん:2009/08/24(月) 12:49:28
>>699
慣れてないせいか、Disposeルールが
なんか気持ち悪い。
701デフォルトの名無しさん:2009/08/24(月) 16:13:03
>>700
あれはネイティブなC++でいうところの単なるデストラクタなんだが……
702デフォルトの名無しさん:2009/08/24(月) 19:24:05
そう思っているなら確実に
>.NET的にはとんでもないコード
を書いてるな。
703デフォルトの名無しさん:2009/08/25(火) 21:04:58
MFCのDLLがあってCLIでラップしてVB.NetとC#で利用しようとしてるんですが
unsigned char *の配列データを受け渡しするところがあって
VB.NetだとこれはByte()になるんだろうけどどういう変換すればいいのでしょう?
Byte()の引数ってCLI側での表記方法も分からないし
704デフォルトの名無しさん:2009/08/25(火) 22:13:16
Byte[] に変換するなら、

 cli::array< System::Byte >^ a = System::Text::Encoding::GetEncode( "エンコードの種類" )->GetByte( "String型の文字列" );

ただ、Byte[] に変換したいのではなくて、String から char* に変換したいんだろうから、だったら、

 ::sprintf( a, "%s", "String型の文字列" );

‥‥本当に出来る。w
正しい?方法は StringToHGlobalAnsi でぐぐれ。
705デフォルトの名無しさん:2009/08/25(火) 22:25:20
いえ、画像データなんで本当にバイト列が必要なんです
706デフォルトの名無しさん:2009/08/25(火) 22:25:55
バイナリデータであるByte()やbyte[]を渡したいだけかもしれないぞ。
もしそうなら、cli::array<System::Byte>^型が対応するのでこれを使えばいいだけ。
自分はcli::array<unsigned char>^と書く方が好みだがまあどっちでも同じ。
707デフォルトの名無しさん:2009/08/25(火) 22:36:09
unsigned char* だから普通に byte 配列だろなんとなく。
分かりにくいので以下の説明は BYTE* で行くな。

まず、BYTE* -> byte[] はそのままでは無理。byte[] を
構築してコピーする。

BYTE source[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
array<Byte>^ arr = gcnew array<Byte>(10);
pin_ptr<Byte> p = &arr[0];
memcpy(p, source, 10);

次に、byte[] -> BYTE* は可能。上でやってるが、pin_ptr でおk。

pin_ptr<Byte> p = &arr[0];

ちなみに、VB だったら GCHandle で Pinned しなさい。IntPtr が
取れる

まとめ。なんで両方の方向の説明したかというと、コピー発生させ
たくないならマネージで byte[] なバッファ作成して(ここポイント)、
それ使うといいよみたいな。
708デフォルトの名無しさん:2009/08/25(火) 22:42:03
いやcli::arrayってByte()と同じ形なの?
双方向でやりとりするんだけどコピーではなくて共有して書き出すからポインタを変換しないといけない
例えば
DLL側
array<Byte> ^GetData();

VB側
dim bytes as Byte[] = dll.GetData()
bytes[0] = 255;

みたいな使い方がしたい

逆にVB側のByte[]を渡してDLLに中身を書き込ませるような処理もある

ポインタのキャストがうまくいかないんだけどどうすればいいの?
709デフォルトの名無しさん:2009/08/25(火) 22:54:02
cli::array< Byte >^ と Byte[] は同じ型だよ。
言語による表現の違いなだけ。

うまくいかないって、どんなエラーなわけ?
710デフォルトの名無しさん:2009/08/25(火) 22:56:11
エラーというかキャストの仕方が分からない
711707:2009/08/25(火) 22:56:55
>>708
・・・伝わってねぇかなぁ。その例なら

void Hoge(BYTE* p) {
 p[0] = 255;
}

void Piyo(array<Byte>^ arr) {
 pin_ptr<Byte> p = &arr[0];
 Hoge(p);
}

array<Byte>^ GetData() {
 array<Byte>^ arr = gcnew array<Byte>(10);
 pin_ptr<Byte> p = &arr[0];
 Hoge(p);
 return arr;
}

これで分かる?
712デフォルトの名無しさん:2009/08/25(火) 23:01:19
>>711
GetDataは元がunsinged char *なんで
それごどうにかしてarray<Byte>^にしないといけないんですが
713デフォルトの名無しさん:2009/08/25(火) 23:06:34
仮にarray<Byte>^にして渡した後ってVBのガーベージコレクタに殺されたりする?
それはまずいな
714デフォルトの名無しさん:2009/08/25(火) 23:09:10
ということはVB->DLLの方向の時だけByte[]で受け取って
DLL->VBの時はラッパーDLLでアクセスを仲介するような関数を容易するべき?
例えばWriteByteみたいな関数を入れてDLLの保持してるメモリはVBでは触れないようにした方がいいの?
715デフォルトの名無しさん:2009/08/25(火) 23:12:05
managed側のメモリはpinすればunmanaged側でいじれるが、
逆は出来ないんじゃないかなぁ。
基本はコピーになるはず。

unmanaged側でメモリを保持して、managedにはハンドルやクラスの形で
渡してやるのがセオリーだと思うよ。
716デフォルトの名無しさん:2009/08/25(火) 23:13:32
なんかdllの仕様まで変更できるような話になってるが
717デフォルトの名無しさん:2009/08/25(火) 23:20:04
メモリへのポインタを渡したいのか、ただデータを入れた配列を渡せればいいのかわかんね。
キャストの仕方っても、どんなところでなにをやろうとしてるのかわかんね。
dynamic_cast とかをキーワードにして調べてみたら? 自分で。
718デフォルトの名無しさん:2009/08/25(火) 23:23:42
>>715
じゃあGetDataの部分はIntPtrを返してVB側でMarshal.ReadByteするのが適切?

>>716
CLIのラップDLLはGCの影響は受けないでしょ

>>717
ポインタを渡して中身を双方で共有して直接いじりたい
メモリは確保した方が解放するというのがルール
719デフォルトの名無しさん:2009/08/25(火) 23:30:55
そう。

byte[](マネージバイト配列)ってのはマネージヒープに確保
されてそこにあるやつ。アンマネージで勝手に確保した
なぞの領域にあるところをさしたポインタってやつはそうじゃ
ないから当然変換できないしコピーするしかない。
マネージにあるやつのポインタ化(pin_ptr) は可能だが、逆は
無理。

結局シームレスにいじりたい領域はマネージ側で確保して
やるしかない。アンマネージポインタしかないんなら、コピーとか
マーシャリングとかしかない。

CLS 非準拠だと CLI は一応 T* みたいな形式も持ち運べは
するんだけどな。準拠させるためには IntPtr とかのやり取りと
なる。
…VB じゃなく C# ならそのポインタシームレスに使えるのだがな。
720デフォルトの名無しさん:2009/08/26(水) 00:12:20
とりあえずラップDLLに読み書き専用の関数を持たせることで解決しました
721デフォルトの名無しさん:2009/08/26(水) 14:58:37
プロパティの書き方で、ヘッダー(h)とソース(cpp)に分離する方法を教えてください

property float X
{
float get();
void set(float value);
}

ヘッダーにこのように書いたところ、
1>Vec3.obj : error LNK2020: 未解決のトークン (06000008) Fwm.Math.Vec3::get_X
1>Vec3.obj : error LNK2020: 未解決のトークン (06000009) Fwm.Math.Vec3::set_X

と言われたので、ソースに
float Vec3::get_X() { return 0; }

と定義してみたのですが書き方が間違っているようでコンパイルが通りませんでした
722デフォルトの名無しさん:2009/08/26(水) 15:02:46
Vec3::X::get
723デフォルトの名無しさん:2009/08/26(水) 15:10:32
そこかぁあああああああ!!!
ありがとう!!
724デフォルトの名無しさん:2009/08/26(水) 15:14:58
インテリセンスに出ると思うんだがな
725デフォルトの名無しさん:2009/08/26(水) 15:18:17
ところがどっこい出なかった
726デフォルトの名無しさん:2009/08/26(水) 17:44:34
CLRでも<summary>指定したらインテリセンスにでまつか?
727デフォルトの名無しさん:2009/08/26(水) 19:23:04
CLRが何だと思ってるのか詳しく聞かせてもらいたいな
728デフォルトの名無しさん:2009/08/27(木) 02:05:29
C++/CLIとC++ネイティブのコード共存で開発してるんですが、

C++ネイティブクラスのメンバーをDataBindingするのって不可能ですか?

こんな感じでやってみたいのですが、System::Object^型にsrcを変換できずに
コンパイルエラーを吐きます。。。

class src {
public:
int m;
};

src = new csrc;
textBox1->DataBindings->Add(gcnew Binding("Text", src, "m"));

※textBoxのTextプロパティにintの値を設定しようとしているのは、例なのでスルーしてください。
729デフォルトの名無しさん:2009/08/27(木) 06:51:20
中でリフレクション使ってるんだからできるわけがない
マネージクラスでプロパティとしてラップする
730デフォルトの名無しさん:2009/08/27(木) 09:06:34
C++/CLIでも<summary>指定したらインテリセンスにでまつか?
731デフォルトの名無しさん:2009/08/27(木) 09:20:42
出るよ
732デフォルトの名無しさん:2009/08/27(木) 09:29:31
/// <summary>
/// クラス解説
/// </summary>
public ref class Test

って書いたら
<summary>
クラス解説
</summary>

って出た。<summary>消したら
クラス解説

って出た。なんか違うかな・・・
733デフォルトの名無しさん:2009/08/27(木) 14:50:40
XMLドキュメントを出力するオプションは有効になってる?
734デフォルトの名無しさん:2009/08/27(木) 16:29:59
ありがトン
なってませんでした
有効にしたら隣に〜.xmlってのが出来たけど
やっぱりインテリセンスには出てこねぇ
735デフォルトの名無しさん:2009/08/30(日) 12:38:18
デリゲートで関数のポインタを変数に渡そうとしてるんだけど
うまくいかない。

delegate void startCallback();
startCallback^ cb_start;

cb_start = gcnew startCallback(start);
fn = &cb_start;
cb_startがデリゲートの変数なのですが。
どうしたらいいでしょう?
736名無しさん@そうだ選挙に行こう:2009/08/30(日) 12:40:23
&はいらん
^の意味解ってる?
737735:2009/08/30(日) 12:50:37
>>736
確か似そうでした。
で、&を外してみたところ
error C2440: '=' : 'startCallback ^' から 'void (__clrcall *)(void)' に変換できません。
とかいうエラーが・・・。
どういう意味なのでしょう?

738名無しさん@そうだ選挙に行こう:2009/08/30(日) 13:06:42
デリゲートと関数ポインタは別物だから。
739名無しさん@そうだ選挙に行こう:2009/08/30(日) 16:30:32
>>735
fnやstartがどう定義されているか見えないけど、
fn = start でいいでない?
740735:2009/08/30(日) 17:37:50
fn=start だと
error C3867: 'start': 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&start' を使用してください
となって、fn=&startとすると737 のエラーとなるという。

fnもstartも同じ型でvoid (*dsfunctions::start)(void)なのだが、
c++/CLIだとだめらしい。

関数ポインタを渡したいだけなんですがどうしたもんでしょう?
741名無しさん@そうだ選挙に行こう:2009/08/30(日) 18:03:47
もしかして、スタティックでない関数をその書式で使用しようとしてない?
ちがうなら、下みたいにすべきじゃね?

cb_start = gcnew startCallback( [startメンバを含むクラスインスタンス], start );
742名無しさん@そうだ選挙に行こう:2009/08/30(日) 18:07:28
生のC++でもクラスのメンバ関数というか仮想関数の関数ポインタはカオスだからなぁ。
743デフォルトの名無しさん:2009/08/30(日) 22:24:58
マネージドとネイティブでポインタや関数の互換はないから
関数自体をどちらかにラップするしかないだろう。
以下は関数ポインタとデリゲートの使用例
int native1(int x, int y) { return x+y; }
class Foo {
 public:
  static int nativeS(int x, int y) { return x+y; }
  int nativeV(int x, int y) { return x+y; }
};
delegate int MyCallback(int x, int y);
ref class Hoge {
 public:
 static int ManagedS(int x, int y) { return x+y; }
 int ManagedV(int x, int y) { return x+y; }
};
744デフォルトの名無しさん:2009/08/30(日) 22:27:07
int main() {
  Hoge^hoge = gcnew Hoge();
  Foo foo;
  int (*f1)(int, int) = &native1;
  int (*f2)(int, int) = &Foo::nativeS;
  int (__thiscall Foo::*f3)(int, int) = &Foo::nativeV;
  //int (__clrcall *f4)(int, int) = &Hoge::ManagedS;
  //int (__clrcall Hoge::*f5)(int, int) = &Hoge::ManagedV;
  MyCallback^ f6 = gcnew MyCallback(Hoge::ManagedS);
  MyCallback^ f7 = gcnew MyCallback(hoge, &Hoge::ManagedV);
  System::Console::WriteLine(f1(100, 1));
  System::Console::WriteLine(f2(100, 2));
  System::Console::WriteLine((foo.*f3)(100, 3));
  System::Console::WriteLine(f6(200, 6));
  System::Console::WriteLine(f7(200, 7));
  return 0;
}
clrcall型の関数ポインタはdelegate作成時にしか使用できない。
745デフォルトの名無しさん:2009/08/31(月) 01:47:06
^は「へ」って読むんだぞ
746デフォルトの名無しさん:2009/08/31(月) 01:47:31
へー
747デフォルトの名無しさん:2009/08/31(月) 10:30:09
実践C++/CLI 極めるための基礎と実用テクニック
アマゾンに入荷したね
748デフォルトの名無しさん:2009/08/31(月) 20:52:39
え。出品者からお求めいただけます、じゃなくて?
749デフォルトの名無しさん:2009/09/01(火) 03:42:45
うん。昨日見たときアマゾン新ピンが2800円ぐらいで売ってた
今見たら終わってたw
750デフォルトの名無しさん:2009/09/01(火) 14:33:06
ていうかアマの技術書は一度の入荷数が少ない
近くの書店で取り寄せすればすぐだ
751デフォルトの名無しさん:2009/09/02(水) 00:29:13
自分が確認したときにはすでになかったから、釣りかと思ったわ。
情報ありがとう。普通に取り寄せてみるよ。
752デフォルトの名無しさん:2009/09/02(水) 01:16:03

C++の保守チームからCLIのチームに移ってきた新参者です。
C++の頃に良くみた無名名前空間でのリテラル文字定数の宣言

namespace {
const std::string EngFileName = "XXXX"
const std::wstring JpnFileName = L"XXX"
}

と同じことがしたくて

namespace {
const String^ EngFileName = "XXXX"
const String^ JpnFileName = L"XXX"
}

にしたらコンパイラ君に怒られてしまった。
もしかして、CLIではできない? 
const char* const EngFileName = "XXXX" みたいにC言語風に明記しないとだめなのでしょうか?
753デフォルトの名無しさん:2009/09/02(水) 01:18:30
適切なクラス作って静的メンバにするのが.NETのやり方
754デフォルトの名無しさん:2009/09/02(水) 01:33:56

そうなんですか!! ありがとう。
C++のころは、cppで使いまわすだけの定数をヘッダーに追加すると、
結構、コンパイルに時間がかかったので、無名名前空間に押さえ込んでました。

あ、そういえば自動生成されるコードもCLIは全部、ヘッダーに展開されますね。
無名空間はだめで、静的メンバであればOKってのが理解できないので、
ちょっくらテストしてきます。 注意点とかあれば教えていただけますか?
755デフォルトの名無しさん:2009/09/02(水) 03:23:27
>>754
なんか分かってなさそうなので念のために言っておくけど、
適切なクラスというのはref classのことだぞ。
756デフォルトの名無しさん:2009/09/02(水) 08:44:54
>754
const は String^ にはつけられないから literal 使え
757デフォルトの名無しさん:2009/09/02(水) 15:51:30
initonlyも忘れないで。外へ公開するメンバなら特に。
758デフォルトの名無しさん:2009/09/02(水) 18:24:19
initonly と literal はアセンブリ化したときの文字列確定のタイミングが違うから気をつけろ
759デフォルトの名無しさん:2009/09/02(水) 22:48:46
やば。initonly を完璧に忘れてた。。。
760754です。:2009/09/04(金) 19:08:41

ありがとうございます。
準備した参考書では、literalもinitonlyも明記がなかったので、なかなかできませんでしたが、
ようやくテストできました。(結果もOKでした。)

ただ、literal と static const の違いだけが分かりませんでした。
どちらも同じ結果になるので・・・。
CLIで追加された宣言なので、literalを使えば良いのかな?

それにしても、CLIの情報は探すのが大変ですね・・・。みなさんはどうしてますか?(どうやって覚えました?)
761デフォルトの名無しさん:2009/09/04(金) 20:26:10
>760
String^ は追跡参照なのでポインタのようにアドレスが一定ではない。だから、const
指定できない。(const が有効だとGCがString^を移動できない)その代わりに literal が
あると思っていい
762デフォルトの名無しさん:2009/09/04(金) 20:38:18
literalって単なるアセンブリのメタデータだし
763デフォルトの名無しさん:2009/09/13(日) 01:12:57
>>879
パレスチナ問題って深刻だね。
764デフォルトの名無しさん:2009/09/13(日) 04:02:10
C++/PLO
うむ、一文字しかあってない
765デフォルトの名無しさん:2009/09/14(月) 19:53:24
pin_ptrのようにオブジェクトの移動を制限する方法って他にないでしょうか
スコープを抜けてもずっと固定していたいんですが
766デフォルトの名無しさん:2009/09/14(月) 20:02:36
GCHandleを割り当てる
767デフォルトの名無しさん:2009/09/16(水) 22:06:03
C++からの移植で下位のような変換を行ってみました。

clss NameHolder
{
   NamaInfo _Name;
public:
   NamaInfo getNameInfo();
}

ref clss NameHolder
{
NamaInfo^ _Name;
public:
NamaInfo^ getNameInfo();
}
768デフォルトの名無しさん:2009/09/16(水) 22:10:18
C++からの移植で下位のような変換を行ってみました。

// C++の場合
clss NameHolder
{
  NamaInfo _Name;
public:
  NamaInfo getNameInfo();
}

// CLIの場合
ref clss NameHolder
{
  NamaInfo^ _Name;
public:
  NamaInfo^ getNameInfo();
}

C++の場合だと、getNameInfo()で取得したNamaInfo を呼び出し元で変更しても、
元の値(NameHolder)は値が変わりませんが、 CLIの方だと変わってしまいます。
ハンドルだからといわれそうですが、CLIで値を保持するクラスより、クラス側の値を取得するのは
一般的にどのように実装すべきでしょうか?
769デフォルトの名無しさん:2009/09/16(水) 23:09:46
value class使え
770デフォルトの名無しさん:2009/09/17(木) 02:04:27
ありがとうございます。
value class を使用することで、目的の動作ができました。
ただ、疑問が残りまして、該当クラスには、セッター関数もありまして

(1) void setNameInfo( NamaInfo^ Name) { _Name = *Name; }
(2) void setNameInfo( NamaInfo& Name) { _Name = Name; }
(3) void setNameInfo( NamaInfo Name) { _Name = Name; }

もどれも同じ挙動でした。(3)にすると、実体がコピーされて遅そうなので、
(1)か(2)かと思ったのですが、一般的にはどちらを使うものなのでしょうか?
771デフォルトの名無しさん:2009/09/17(木) 02:08:28
実体コピーしなきゃ結局他でNameInfo変更したときに影響するだろ…
772デフォルトの名無しさん:2009/09/17(木) 02:23:39
便乗ですまない

>>770の(1)はマネージでないとダメで、(2)はアンマネージでないとダメだと
思っていたんだけど、両方とも許される状況っていうのはあるもんなの?
773772:2009/09/17(木) 02:37:45
value classだと(2)は問題なく参照となり、
(1)はボクシングが行われた上で、ハンドルを取得できる、と考えたけどあってるのかなぁ。
難しいなぁ
774デフォルトの名無しさん:2009/09/17(木) 02:41:02
public value class NameInfo
{
   public: property Int32 ID;
};

public ref class NameHolder
{
   NameInfo _Name;
public:
  NameInfo get(){return _Name;}
// void set(NameInfo^ Name ){_Name = *Name;}
// void set(NameInfo& Name ){_Name = Name;}
  void set(NameInfo Name ){_Name = Name;}
};

int main(array<System::String ^> ^args)
{
  NameInfo Name;
  Name.ID = 10;
  NameHolder Holder;
  Holder.set(Name);
  NameInfo Buf1 = Holder.get();
  Console::WriteLine(Buf1.ID);
  Name.ID = 20;
  NameInfo Buf2 = Holder.get();
  Console::WriteLine(Buf2.ID);
  return 0;
}
どれも結果は 10、 10と表示され、値は登録後の値は変わりませんでした。
根本的に、なんか勘違いしてますかね?
775デフォルトの名無しさん:2009/09/17(木) 02:49:44
メンバがいつの間にかハンドルじゃなくなったな
776デフォルトの名無しさん:2009/09/17(木) 03:05:00
NameInfo^ _Name; これに変更。
NameHolder() { _Name = gcnew NameInfo(); } これ追加

してやって見ました。結果は同じでした。C++からハンドルが一つ増えただけで、こんなにも苦労するとは・・・・
777デフォルトの名無しさん:2009/09/17(木) 03:10:40
もとのC++の記述と同じようにかきゃいいと思うけどな
value classならほぼ変わらんし
移植って時点で思想とか意味ないだろうし
778デフォルトの名無しさん:2009/09/17(木) 03:19:20
元のコードにあわせてハンドルじゃなくしたのかと思ったけど、あっさりハンドルに戻すとか
ほんとに移植しようとしてるのかが疑問
779デフォルトの名無しさん:2009/09/17(木) 03:54:00
>>770
ちなみに、ネイティブなC++だったら、そのsetの引数の型は、NameInfoかconst NameInfo&にするとこだよね。

自分だったら、NameInfoにするかなあ。コピーのコストが心配っていうならそもそも値型にしないし。
読み取りだけの引数にconst付けないのは嫌だ。

値型の場合、T& → T%、T* → interior_ptr<T>へと機械的に変換すればいい。
その上で、他言語で使えないのでconstは削除し、値型のハンドルも使わないのが自分の方針。

ちなみに、(1)の値型のハンドルで、>>774のようにボックス化されていない(ハンドルでないもの)を実引数にする場合、
ボックス化(ようは新しくメモリ確保してそこへ実引数をコピー)が行われるので(3)より遅いよ。
780デフォルトの名無しさん:2009/09/17(木) 04:03:11
>>779
横からごめん
> 他言語で使えないのでconstは削除
というのはどういうこと?
781デフォルトの名無しさん:2009/09/17(木) 04:20:29
>>780
C#などからそのメソッドを呼ぶ場合、あたかもconstはなかったかのように無視される。
そのため、自分はC++/CLIは他言語から呼び出すことを前提に使っているので、
C++/CLIの段階でpublicな型のpublicなメソッドの引数・戻り値にはconstを付けようと思わないというだけのこと。

つまり、これは自分1人の考えなんで、気にせずconst使うという人も中にはいると思う。
782デフォルトの名無しさん:2009/09/17(木) 04:29:23
>>781
なるほど。勉強になりました。
783774です。:2009/09/17(木) 04:39:15

いろいろとありがとうございます。
先輩にきいて、値を保持したいのであれば、このクラスを移植すれば良いとともらったソースを移植中です。
中身を見ると、シングルトン形式で値を保持しているようです。
C++であれば const NameInfo& Name なので、const NameInfo% Name にしたらコンパイラ君に怒られて
パニックになってしまいました。 
C++の時は、メンバー関数の後ろをはじめ、constをつけるように、強く教育を受けたので、CLIでもかんばって
つけようとするとことごとく怒られて・・・・。
NameInfo という値で渡すのがよさそうなので、これでいって見ようかと・・・。
教えていただいた 機械方式 NameInfo% にしたいですが、先輩に % は関数内で値を変えるとき意外は使うなといわれて・・・。
くそー 何でconst NameInfo%  て読み取り専用にできないだよ!!!!
784デフォルトの名無しさん:2009/09/17(木) 07:46:38
constが付いていたら、自動生成した読み取り専用ラッパーに包んで返す。
……とかどうなんだろう。やっぱ駄目かなあ。
785デフォルトの名無しさん:2009/09/17(木) 08:47:15
プロパティでgetterのみにすればいいんじゃないか?
786デフォルトの名無しさん:2009/09/17(木) 10:14:48
値型^って普通使わないよ
一番効率悪いし他の言語では全く使えない
787デフォルトの名無しさん:2009/09/24(木) 23:24:35
String型だけなんで^なしで宣言出来ないんだろう…
あとshortの列挙型に-32768が使えないのもわからん
C#なら通るのに
788デフォルトの名無しさん:2009/09/24(木) 23:27:32
String型がcharの配列なので。
shortの-32768(全ビットon)は未定義値の代わりなので。
789デフォルトの名無しさん:2009/09/24(木) 23:38:51
即レスありがとう
Stringの内部構造までは見たんだけど、つまりC++/CLIでは配列はスタックに作れないってことなのかな
790デフォルトの名無しさん:2009/09/25(金) 04:34:30
動的にサイズを変えられるんだからヒープまたはマネージドヒープと考えるのが妥当なんじゃないの
791デフォルトの名無しさん:2009/09/25(金) 07:45:38
^なしに記述しているのだって、別にスタックに配置している訳じゃないし
792デフォルトの名無しさん:2009/09/30(水) 15:44:34
String型だけなんで^なしで宣言出来ないんだろう…

ref class だから
793デフォルトの名無しさん:2009/10/01(木) 00:51:52
C++のRAIIパターンでDispose持ちの参照型を扱おうって意図だから
参照型でもこれはOKなんよ。
実際はDisposeのシグネチャを持ってる必要もないんだが。

ただ何故かStringとarrayは宣言できんのね。
794デフォルトの名無しさん:2009/10/06(火) 00:13:56
deleteしたオブジェクトのファイナライザって呼ばれないの?
C++/CLIのデストラクタ=C#のDisposeだと思ってたんだけど
795デフォルトの名無しさん:2009/10/06(火) 00:31:17
C#でもDisposeしたときはGC.SuppressFinalizeでファイナライザの呼び出しを抑制するが?
796デフォルトの名無しさん:2009/10/06(火) 11:24:38
ファイナライザの呼び出しが有効になってるとGCのパフォーマンスに悪影響を与える。
明示的にDisposeが行われた後はファイナライザ呼び出しは不要なはずなので
ファイナライザを呼び出さないようにGCに指示するようになってる。
アンマネージリソースを直接持ってない限りはファイナライザ(!の方)は定義しない方がよい。
797デフォルトの名無しさん:2009/10/06(火) 13:17:58
~ClassA()や!ClassA()はDispose()やFinalizerそのものではない。
正確にこのコードになるわけじゃないのだけれどイメージとして捉えて欲しい。
 ~ClassA() { }
 !ClassA() { }
上2つを使っていると、ここからはコンパイラが生成する。
 void Dispose(bool disposing) {
   if (disposing) ~ClassA(); else !ClassA();
 }
 void Dispose() {
   Dispose(true); GC.SuppressFinalize(this);
 }
 void Finalize() {
   Dispose(false);
 }

798デフォルトの名無しさん:2009/10/09(金) 17:38:36
C/C++室より、案内されてこちらのスレに来ました。


void test(int x[]){cout << sizeof x << endl;return;}

int main(array<System::String ^> ^args)
{
  int x[] = {1,2,3,4,5};
  test(x);
  cout << sizeof x << endl;
}

■出力結果
4
20

なんで両方とも20にならないんでしょうか?
799デフォルトの名無しさん:2009/10/09(金) 17:58:20
CLI一切関係ないな
仮引数が配列表記でも実際はポインタとして渡される
800デフォルトの名無しさん:2009/10/09(金) 18:15:42
>>799
>CLI一切関係ないな
失礼しました。
void test(int x[]) が void test(int* x)として解釈されるという事ですね。
誘導元のほうでも親切な方が教えてくれました。

ありがとうございます。
801デフォルトの名無しさん:2009/10/10(土) 02:32:29
ハンドル使ってるから脊髄反射したんだろう
802デフォルトの名無しさん:2009/10/10(土) 16:37:37
>>801
つーか内部的にMSIL使ってる言語は気持ち悪いんだよ
全部こっちに回すから頼んだ
803デフォルトの名無しさん:2009/10/10(土) 23:57:23
出力結果から想像できるだろうに。
近頃の子は自分で考えるってこと、しないのかねぇ。
804デフォルトの名無しさん:2009/10/11(日) 09:13:05
void func(int *a);
とかアドレスを引数にする昔の関数に
int b;
func(&b);
などとすると、
cli::interior_ptr<Type>' から 'int *' に変換できません。
とかいうエラーが出てしまいます。
どうしたらいいでしょうか?
805デフォルトの名無しさん:2009/10/11(日) 10:42:48
reinterpret_cast<Int32*>(&b)
806デフォルトの名無しさん:2009/10/11(日) 11:00:48
つーかその例でそのエラー出るか?
807デフォルトの名無しさん:2009/10/11(日) 12:29:34
>>804
pin_ptr<int> p = &b;
func(p);
808デフォルトの名無しさん:2009/10/11(日) 13:03:52
>>804
int bがref classのメンバーなのかな。ローカル変数だったら出ないだろ。
809デフォルトの名無しさん:2009/10/11(日) 13:24:52
C++/CLIの仕様書ってある?
C++で言うとISO/IEC 14882:2003みたいな奴

それがあれば簡単な質問ぐらいならC++スレでレスしてやってもよい
810デフォルトの名無しさん:2009/10/11(日) 13:25:46
仕様書じゃなくて規格票だったorz
811デフォルトの名無しさん:2009/10/11(日) 14:14:27
ぐぐるかecma行って372見てこい
812デフォルトの名無しさん:2009/10/11(日) 14:33:33
http://blogs.wankuma.com/episteme/archive/2006/09/12/38394.aspx

だめじゃんISO規格じゃない
まあecmaのを参考にするか
813デフォルトの名無しさん:2009/10/11(日) 15:50:25
>だめじゃんISO規格じゃない 

これが言いたかったのか(笑
814デフォルトの名無しさん:2009/10/12(月) 03:21:26
IETF > Ecma > ISO
815デフォルトの名無しさん:2009/10/12(月) 10:19:51
日本の車もウインカーレバーが右で、ISO規格と違うからな。
イギリスは右ハンドルでもISO通りに左なのに。
816デフォルトの名無しさん:2009/10/12(月) 15:25:50
要するにISOってオナニー規格か
817デフォルトの名無しさん:2009/10/13(火) 18:48:03
そういえばC#のコンパイラの言語バージョンを選ぶオプションは
ISO3.0みたいな表記だったな
818デフォルトの名無しさん:2009/10/14(水) 09:55:30
現在自民党が民主党を批判していること、
おまえが言うか、とあきれている。
819デフォルトの名無しさん:2009/10/14(水) 11:20:17
ヤトウの仕事だから。
820デフォルトの名無しさん:2009/10/14(水) 19:29:43
>>818
今まで民主党が批判してた事を民主党がやったりもするわけですよ
ヨトウになるとはそういうこと
821デフォルトの名無しさん:2009/10/14(水) 22:39:15
>>818
スレタイを読めないおまえが言うか、とあきれている。
822デフォルトの名無しさん:2009/10/15(木) 18:55:56
Side-by-sideでexe作ろうとしてるけど
M$っていろんな意味で終わってるなw
保険屋の仕事を作るようにしてあるシステムと同じだろこれw
仕事にしてる奴らは悲惨だろうな。
後には何も残らん。
823デフォルトの名無しさん:2009/10/16(金) 02:11:13
とりあえずMS叩くと出来る奴っぽく見えるよなw
824デフォルトの名無しさん:2009/10/21(水) 01:14:26
エラーがなくせずに困っています。
関数のポインタを渡すときに
error C3867: 'SM::f': 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&SM::f' を使用してください
などとエラーになってしまいます。
Move(f);
のfが関数なのですが・・・。
どうすればよいでしょう?

825デフォルトの名無しさん:2009/10/21(水) 09:54:36
ほんとにわかってないのか、これなのかはソース見せてもらわないと判断できないが・・・
ttp://msdn.microsoft.com/ja-jp/library/b0x1aatf(VS.80).aspx
826デフォルトの名無しさん:2009/10/21(水) 17:56:32
ダウンロードの詳細 : Visual Studio International Feature Pack 2.0
ttp://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=7d1df9ce-4aee-467f-996e-bec826c5daa2
827デフォルトの名無しさん:2009/10/21(水) 18:14:59
1.0系でとりあえず行くのかと思ったらいきなり2.0かよw
828デフォルトの名無しさん:2009/10/21(水) 18:34:30
6月の時点で2.0ベータが出てただろ
829デフォルトの名無しさん:2009/11/04(水) 12:57:39
てす
830デフォルトの名無しさん:2009/11/30(月) 21:33:43
TreeViewで追加したノードAとノードAの子のノードBのチェックボックス
にチェックしようと思ったんですが以下のコードではうまくいきませんでした。
各ノードの子が存在するかを調べてチェックする以外の方法でコードがすっきりする方法ありますか?

int countMax = treeView_Action->GetNodeCount(true);
for ( int i = 0; i < countMax; ++i )
{
 treeView_A->Nodes[i]->Checked = true;
}
831デフォルトの名無しさん:2009/11/30(月) 21:42:40
> 各ノードの子が存在するかを調べてチェックする
これで十分すっきりすると思うが
再帰を知らないとか言うのか?
832デフォルトの名無しさん:2009/12/11(金) 16:21:58
どなたかくだすれスレを立ててくだすれ
833デフォルトの名無しさん:2009/12/11(金) 16:33:42
こんだけ過疎ってんだから無駄だろ
聞きたきゃここで聞けばいい
834デフォルトの名無しさん:2009/12/12(土) 02:21:57
失礼します。
Iniファイルの読み書きを行いたいのですが、うまくいきません。
エラーは出ないのですが、ファイルが作成されないので・・・。
すいませんが、どこが間違っているのか教えてください。
よろしくお願いします。

using namespace System::IO;
using namespace System::Text;
using namespace System::Reflection;
using namespace System::Runtime::InteropServices;

[DllImport("kernel32.dll")]
static UInt32 GetPrivateProfileString(String^ lpAppName, String^ lpKeyName, String^ lpDefault, StringBuilder^ lpReturnedString, UInt32 nSize, String^ lpFileName);
[DllImport("kernel32.dll")]
static UInt32 WritePrivateProfileString(String^ lpAppName, String^ lpKeyName, String^ lpDefault, StringBuilder^ lpReturnedString, UInt32 nSize, String^ lpFileName);

// Iniファイル読み込み
private: System::Void IniRead(System::Void){
String^ path = Path::Combine(Path::GetDirectoryName(Assembly::GetEntryAssembly()->Location), L"test.ini");
StringBuilder^ sb = gcnew StringBuilder(1024);
UInt32 ret = GetPrivateProfileString(L"DB_INFO", L"SERVER_NAME", L"default", sb, sb->Capacity, path);
System::Console::WriteLine(sb->ToString());
}
// Iniファイル書き込み
private: System::Void IniWrite(System::Void){
String^ path = Path::Combine(Path::GetDirectoryName(Assembly::GetEntryAssembly()->Location), L"test.ini");
StringBuilder^ sb = gcnew StringBuilder(1024);
sb->Append("TestVal");
UInt32 ret = WritePrivateProfileString(L"DB_INFO", L"SERVER_NAME", L"default", sb, sb->Capacity, path);
}
835834:2009/12/12(土) 02:26:25
開発環境を書くのを忘れてました。
WindowsXP SP3
Visual Stadio 2010 Beta2
です。
836デフォルトの名無しさん:2009/12/12(土) 02:34:25
C++/CLIでわざわざDllImport?
837デフォルトの名無しさん:2009/12/12(土) 08:08:41
/clr:safe なのでは
838デフォルトの名無しさん:2009/12/12(土) 08:25:36
WritePrivateProfileStringの引数がなんでGetPrivateProfileStringと同じなんだよ。
MSDNをみろよ。

BOOL WritePrivateProfileString(
  LPCTSTR lpAppName,  // セクション名
  LPCTSTR lpKeyName,  // キー名
  LPCTSTR lpString,   // 追加するべき文字列
  LPCTSTR lpFileName  // .ini ファイル
);

>>833の手前初心者スレに池とはいえんな(笑
839デフォルトの名無しさん:2009/12/12(土) 13:48:26
初心者スレではCLIスレへ池と言われ
CLIスレでは初心者スレへ池と言われ・・・
840デフォルトの名無しさん:2009/12/12(土) 18:28:17
>>833

斬新だな
841sage:2009/12/12(土) 20:27:27
今まで

Diagnostics::Debug::WriteLine("文字列");
Diagnostics::Trace::WriteLine("文字列");

の違いで Debug は、Debug版コンパイルのみに出力され、
Traceは Debug/Release版 双方で出力される・・・と思って、

Debug::WriteLine("文字列");

を使ってきました。しかし、先ほど

DefaultTraceListener^ dtl = (DefaultTraceListener^)Debug::Listeners["Default"];
dtl->LogFileName = "C:/debug.txt";

としてみると、Release版でも C:/debug.txt に出力されて
しまいました。

Debug版でのみ、出力させるには

#if defined(_DEBUG)
Diagnostics::Debug::WriteLine("文字列");
#endif

としないとダメなのでしょうか?
842デフォルトの名無しさん:2009/12/12(土) 21:21:48
>>841
Conditional属性ついてるから、その認識で間違ってないはずだが
843デフォルトの名無しさん:2009/12/12(土) 21:25:27
Trace::Listeners
Debug::Listeners
は同じコレクションをポイントしていて、片方を変更すればもう片方も変更になる。
844デフォルトの名無しさん:2009/12/12(土) 21:48:40
>>843
そういう問題じゃないだろ
845デフォルトの名無しさん:2009/12/12(土) 21:52:12
>>841-842
C++/CLIではC#やVB.NEtのようにConditionalAttributeを認識しないから、
自分で#ifdef使って、呼び出しを消す必要がある
846841:2009/12/13(日) 01:26:19
>>845

ConditionalAttributeを認識しない・・・んですね。
初耳です。勉強になりました。


>自分で#ifdef使って、呼び出しを消す必要がある

とても面倒ですね。自前のDEBUG関数を定義して、
それでまとめて処理させるべきなんでしょうかね。
847834:2009/12/13(日) 02:10:44
>>838
遅くなってすいません。
無事にできました、ありがとうございます。
848デフォルトの名無しさん:2009/12/13(日) 09:22:00
>>846
関数を使わなくても、#define でいいじゃないか
#ifdef DEBUG
#define DEBUGOUT Trace::〜
#else
#define DEBUGOUT
#endif
849デフォルトの名無しさん:2009/12/13(日) 09:28:22
>>846
ちなみに、.NET2からは(Debug|Trace)::WriteLineよりはTraceSourceを使う方がいいことになってる
850デフォルトの名無しさん:2009/12/16(水) 02:13:09
VS 2005で、System::Windows::Forms::ToolStripを継承して、'MyToolStrip' クラスを実装しました。
ビルドすると、ツールボックスの中にMyToolStripが現れましたが、
Formに貼り付けようとすると、

ツールボックス アイテム 'MyToolStrip' の読み込みに失敗しました。アイテムはツールボックスからから削除されます

と表示され、ツールボックスから消えてしまいます。



それならと、既に貼り付けてあるFormクラスの中のToolStripを、MyToolStripへコードを直接書き換えて
みました。コンパイルも通り、実行もできるのですが、FormのデザインをGUIで開こうとすると

デザイナの読み込み時に 1 つ以上のエラーが発生しました。

C++ CodeDOM parser error: Internal Error

が表示され開けません。.NETの標準クラスを継承して、フォームデザイナで使いたいのですが、
どうすれば良いのでしょうか?
851デフォルトの名無しさん:2009/12/16(水) 06:08:01
とりあえず、これで動いてる。どこかで下手打ってるのだろう。
ソースをさらせ。
public ref class MyToolStrip : System::Windows::Forms::ToolStrip { };

852デフォルトの名無しさん:2009/12/16(水) 06:10:35
コンストラクタで例外投げてるとかじゃね
853デフォルトの名無しさん:2009/12/16(水) 08:35:33
これはC#でも同じだが、Controlのコンストラクタに副作用があると
デザーなーの表示に失敗することがあるよ。
854デフォルトの名無しさん:2009/12/16(水) 11:47:21
まあそういう場合は、親がデザイナかどうか判定して挙動を変える必要があるわな
855850:2009/12/16(水) 22:16:49
プロジェクトをWindowsフォームで新規作成して、

>>851

のクラスを定義した所、問題無くツールボックスの中にMyToolStripが現れ、
フォームに貼り付けできました。

プロジェクトのランタイムプロパティが
「純粋 MSIL 共通言語ランタイム サポート (/clr:pure)」の場合問題ありませんが、
当方「共通言語ランタイム サポート (/clr)」で開発をしており、
その場合、850で書いたような状況になります。ノートPCのサブ開発環境でも
再現するので、再現性はあります。

皆さんの所では問題ありませんか?
856デフォルトの名無しさん:2009/12/16(水) 22:18:00
知るか
再現云々言うんだったらまずソースを出せ
857850:2009/12/16(水) 22:31:48
>>856

Windowsフォームを新規作成して、ランタイムを
共通言語ランタイム サポート (/clr)に変更するだけなのですが・・・。

ソースを貼ります。

Form1.h

#pragma once


#include "test.h"

namespace test {

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;

858850:2009/12/16(水) 22:32:30
Form1.hの続き
/// <summary>
/// Form1 の概要
///
/// 警告: このクラスの名前を変更する場合、このクラスが依存するすべての .resx ファイルに関連付けられた
/// マネージ リソース コンパイラ ツールに対して 'Resource File Name' プロパティを
/// 変更する必要があります。この変更を行わないと、
/// デザイナと、このフォームに関連付けられたローカライズ済みリソースとが、
/// 正しく相互に利用できなくなります。
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
//
//TODO: ここにコンストラクタ コードを追加します
//
}
859850:2009/12/16(水) 22:33:28
Form1.hの続き
protected:
/// <summary>
/// 使用中のリソースをすべてクリーンアップします。
/// </summary>
~Form1()
{
if (components)
{
delete components;
}
}

private:
/// <summary>
/// 必要なデザイナ変数です。
/// </summary>
System::ComponentModel::Container ^components;


860デフォルトの名無しさん:2009/12/16(水) 22:35:58
Form1.h のつづき
#pragma region Windows Form Designer generated code
/// <summary>
/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
/// コード エディタで変更しないでください。
/// </summary>
void InitializeComponent(void)
{
this->components = gcnew System::ComponentModel::Container();
this->Size = System::Drawing::Size(300,300);
this->Text = L"Form1";
this->Padding = System::Windows::Forms::Padding(0);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
}
#pragma endregion
};
}

test.h の中身

#pragma once
public ref class MyToolStrip : System::Windows::Forms::ToolStrip { };

プロジェクトのプロパティでランタイムを共通言語ランタイム サポート (/clr)に変更して
コンパイル。ツールボックスの中にMyToolStripが現れるので、Form1へ貼り付け。

以上です。
861デフォルトの名無しさん:2009/12/17(木) 10:41:25
だらだらコピペするんじゃなくて、再現する最小限のソースを作って貼るんだよ
862デフォルトの名無しさん:2009/12/17(木) 12:30:50
>>861
最小限を貼っているようにしか見えないが。
863デフォルトの名無しさん:2009/12/17(木) 13:33:13
//
//TODO: ここにコンストラクタ コードを追加します
//
864デフォルトの名無しさん:2009/12/17(木) 13:34:51
つーかここでいう最小限は天順とtest.hを貼ればいいだけじゃないかw
865デフォルトの名無しさん:2009/12/17(木) 13:35:17
天順→手順
866デフォルトの名無しさん:2009/12/17(木) 13:37:25
何で貼るのかというと、レスをみた人が追試するためにはるんで
そもそも見る気失せるような書き方しちゃ手伝ってくれる人が減るだけだな。
867デフォルトの名無しさん:2009/12/17(木) 13:39:45
>プロジェクトのプロパティでランタイムを共通言語ランタイム サポート (/clr)に変更して 
ソースが見当たらないが。IDEの制限だったような。pureじゃだめなん?
868デフォルトの名無しさん:2009/12/17(木) 17:14:42
MyToolStripにpublicついてねぇぞ
869デフォルトの名無しさん:2009/12/17(木) 17:42:56
>>868
refクラスではpublicを付けても付けなくてもpublic継承になる。
http://msdn.microsoft.com/ja-jp/library/ms235220.aspx
870デフォルトの名無しさん:2009/12/17(木) 19:53:29
そもそもデザイナってILONLYじゃないアセンブリ読み込めたっけ
871デフォルトの名無しさん:2009/12/17(木) 20:29:01
とりあえずソリューション内に別プロジェクトを作って、
そっちにMyToolStripを作って、メインプロジェクトから参照すれば、
/clr /clr:pure とどちらでもいけた。
872デフォルトの名無しさん:2009/12/23(水) 02:57:12
>>850の問題とは関係ないかも知れないが、
自分もデザイナが見れないエラーに悩まされ、さっき解決したから載せとく。

(12).ToString();

上記のように、ToStringに直値指定するとデザイナが見れなくなる。
コンパイルも通り、実行もちゃんと反映されてるから、見つけるの苦労した
873872:2009/12/23(水) 13:56:38
>>872に追加

InitializeComponent関数内でのToString直値がダメな原因だった。
そもそも、InitializeComponent関数はコードエディタで変更してはいけないらしい

InitializeComponent関数外でToString直値は正常に使える。
874デフォルトの名無しさん:2009/12/29(火) 16:20:36
皆さんはC+/CLIでポインタを宣言する場合、
^や*を型の後ろにつけます?それとも変数名の頭につけます?

書籍等だと以下の形式が多い気がするのですが、
マネージとアンマネージで統一感がとれないような・・

[マネージ]
String^ hoge

[アンマネージ]
char *hoge
875デフォルトの名無しさん:2009/12/29(火) 18:04:35
どっちも型名の直後につけるかな。
アンマネージでは変数の方につける人が多いみたいだけど、
ポインタ型っていう型名だから、変数の側につけるのには違和感があるんだ。
876デフォルトの名無しさん:2009/12/29(火) 19:05:33
C#では構文上も型名の一部ということになってる
int *x, y, z;
と書くと全てポインタになる
877デフォルトの名無しさん:2009/12/29(火) 21:16:52
>>875
>>876
C++/CLIだと型名の一部にはならないよね?
例えば以下のコードはコンパイルエラーとなる。

class Hoge{};

int main()
{
Hoge* x,y;
x= new Hoge;
y= new Hoge;//yがポインタとして認識されないため、コンパイルエラー
return 0;
}

CとかC++と同じ仕様なんだろうけど、
ポインタ型っていう考えでいくとなんでコンパイルエラーとなるのかが説明できない。
C#が特殊な気がする。
878デフォルトの名無しさん:2009/12/29(火) 21:33:01
なんかCLIやってる人って可哀想だね
879デフォルトの名無しさん:2009/12/29(火) 21:53:43
C/C++の構文がおかしいだけで意味上はポインタ型
不自然なのは誰の目にも明らかだからわざわざC#では変えたんだろ
どっちでもいいけどマネージとアンマネージで変えたりせずにどっちかに統一するべき
880デフォルトの名無しさん:2009/12/29(火) 22:33:26
「つもり」は「意味」にならんだろ
881デフォルトの名無しさん:2009/12/29(火) 23:18:54
ならんだろうね
882デフォルトの名無しさん:2009/12/30(水) 00:11:42
あの記法でポインタを表そうとすると、
関数ポインタ型を表す場合、型の方に*をつけることは出来ないので、
変数の方に*をつけてポインタを表すというのは一定の合理性がある。
883デフォルトの名無しさん:2009/12/30(水) 02:07:27
一定の合理性があるな。
884デフォルトの名無しさん:2010/01/02(土) 10:56:36
CLIでcallocするとどうなるの?
885デフォルトの名無しさん:2010/01/02(土) 11:50:26
普通にアンマネージヒープが割り当てられるだけ
886デフォルトの名無しさん:2010/01/03(日) 18:49:18
当初VB.netで作った業務アプリをVC++/CLIに移植したのですが、
実行速度もメモリ使用量も違いがあるようには思えず、
WinXPだとVC++のランタイムが別途必要になった分、劣化したような気にすらなるのですが、
VC++/CLIの利点って、上達すれば業務アプリでもあるものなのでしょうか?
887デフォルトの名無しさん:2010/01/03(日) 19:19:16
ない
既存のアンマネージコードをマネージコードと混ぜるためだけに仕方なく使う言語
その場合も使用範囲は最小限に留めて,できるだけVBやC#で書くようにするのが正しい
888デフォルトの名無しさん:2010/01/03(日) 20:26:51
gcnewをなめるなよ
889デフォルトの名無しさん:2010/01/03(日) 20:49:08
MS自身ですら避けてるからな
マネージからアンマネージ→DllImport
アンマネージからマネージ→CLRのホスティング
890デフォルトの名無しさん:2010/01/03(日) 22:27:46
XNAくらいだっけ、MS製で使ってるの
891デフォルトの名無しさん:2010/01/06(水) 21:01:42
CLI 使ってる時点で速さが変わらないのは当たり前
アンマネージドコードを利用しないと速くなる訳が無い
892デフォルトの名無しさん:2010/01/06(水) 22:16:08
新規にアンマネージコード書くなら普通のネイティブなDLLとして作ってC#からDllImportする形の方が扱いやすい
893デフォルトの名無しさん:2010/01/07(木) 20:22:39
XNAってなんで早く動くの?
894デフォルトの名無しさん:2010/01/07(木) 21:01:54
ゲームってDirect3Dに描画命令を送ってからの内部の処理が重くてボトルネックになるので
C++/CLIを挟もうがゲームロジックがマネージコードで書かれてようがあんまりパフォーマンスに影響しない
895デフォルトの名無しさん:2010/01/15(金) 20:33:57
ネイティブのアプリケーションがプラグインに飛ばしてくるコールバックを拾って、
それをC#に渡して処理するアプリケーションを書きたいのですが、
その辺のノウハウについてまとまっている情報源をご存知の方はいませんか?
896デフォルトの名無しさん:2010/01/15(金) 20:47:27
イベントかインターフェイス経由でC#にそのまま流せばいいだけでしょ
全く悩むところなんかない
897デフォルトの名無しさん:2010/01/15(金) 21:00:14
>>896
C++/CLIで書いたコードって、普通にやるとマネージコードにコンパイルされると
思っていたのですが、ネイティブから呼ばれても大丈夫なのでしょうか。
898デフォルトの名無しさん:2010/01/15(金) 21:05:35
/clr なら相互に呼び出し可
/clr:pure の場合、マネージドコードからネイティブ方向の呼び出しは可
/clr:safe の場合、不可、ただしP/Invokeは可能。

Win32APIのコールバックを直接C#で処理したいなら、
特殊なものでなければ、P/Invoke+Delegateで対応可能。
899デフォルトの名無しさん:2010/01/15(金) 21:11:21
最悪COM経由でどうとでもなる
900デフォルトの名無しさん:2010/01/15(金) 21:20:41
>>898
分かりやすい解説感謝します。
そういうことなら、普通にアプリ指定のコールバック関数を定義して、
そこからC#のコードを呼べばよさそうですね。ありがとうございます。
901デフォルトの名無しさん:2010/01/15(金) 23:01:30
教えてください。

まず、VC2003 で作った一部マネージコードの混じったアンマネージの .lib ファイルがあります。
これを(ちょっと事情があって) VC2003 でアンマネージの .dll にくるみました。
で、これを(さらに事情があって) VC2008 の C++/CLI でマネージの .dll に
DllImport を利用してラッピングしようとしています。

ここで、ライブラリとして公開する関数はいくつかあるのですが、その中にパラメータとして
構造体を参照形式で持つモノがあります。
構造体の中には std::string で定義した要素を持つモノもあるのですが、これを先のアンマネージの
.lib の関数内で参照したり変更したりするとアクセスバイオレーションで不正終了することがあります。
同じ構造体内の int 型などの要素の値を参照/変更しても変な値が入ることがあります。
そこで、この構造体の std::string 型の要素を char[] 型に変更して試したところ、特に問題なく期待通りの動作をしました。
マネージ dll を介さずに、アンマネージの .dll を使用する分には元のままでも問題なさそうです。

この原因ってなんでしょうか。
また、回避方法があれば教えていただけないでしょうか。
902デフォルトの名無しさん:2010/01/15(金) 23:03:11
ゲームでCOM経由はどうなんだろう
DllImport、P/Invoke+Delegate とは違うんだよね
どんな時に使うんだろう…どう使い分けるのかの時点で悩みそうだ…
903デフォルトの名無しさん:2010/01/15(金) 23:18:09
>>901
そんな使い方するのがおかしい。
C++/CLIでアンマネージドとマネージドを混ぜたら、あとはマネージド側から使うだけ。
904デフォルトの名無しさん:2010/01/15(金) 23:24:50
>>901
真っ先に思い浮かぶのは、メモリ確保周りの問題。
2つのDLLでstd::stringが同じメモリ確保ルーチンを使うようにしてみたらどうなる?
例えば、両方でグローバルなnew/delete演算子関数を定義するとか。
#include <new>
void* operator new(std::size_t n)
{
if (void* p = HeapAlloc(GetProcessHeap(), 0, n))
return p;
else
throw new std::bad_alloc();
}

void operator delete(void* p)
{
if (p != 0)
HeapFree(GetProcessHeap(), 0, p);
}
std::stringに対して自前のアロケータを指定するというのでもいい。
905デフォルトの名無しさん:2010/01/15(金) 23:42:18
VC2003ってことはManaged C++か
906デフォルトの名無しさん:2010/01/15(金) 23:54:56
>>901
C++/CLI以前の問題じゃないか、それ

基本的にDLL境界をまたいで、FILE*のようなCランタイムオブジェクトや
malloc()/newで確保されたメモリ渡すときは要注意
Aで確保されたメモリをBで開放するときは、モジュールAとBが同一の
ランタイムにダイナミックリンクしてないと即終了
C++のstd::stringなんぞをインタフェースに使ってたらそういうことは
当たり前に起きる

>>904の指摘はそれを前提にしている訳だが、
C++標準ライブラリクラスは、そもそも実装の大半がヘッダにあり、
バージョンが違えばそのバイナリ互換性すら怪しい
俺はそもそも設計として、C++標準ライブラリクラスをDLLインタフェースに
使うことは全くオススメしない
設計を見直すべき
907デフォルトの名無しさん:2010/01/16(土) 00:13:38
>>904
http://developer.apple.com/jp/technotes/tn2007/tn2185.html#TNTAG7
http://ameblo.jp/woooh-p/entry-10037990751.html

調べてみた。部分的なら書き換えおkだけど
標準部分の書きかえはそれなりに茨の道な気がする…
908デフォルトの名無しさん:2010/01/16(土) 16:48:20
C++/CLIも.NET総合もくだすれが発見出来ないので、おそるおそるここで聞かせて頂きます。

DLLを制作しているのですが、DLL中からフォームを呼び出すレベルで詰まっています。
DLL自体は動的に外部の別のDLLから呼び出され、初期化関数が走らされる感じで、

IDEからWindowsフォーム(CLR)を追加し、フォームを何も弄らない状態で
DLLの初期化関数中で(gcnew hoge::hogeForm())->Show();
しているのですが、Showの呼び出し中に固まってしまいます。
メッセージループが存在しないせいかと思い、Application::Run();してから
Showしても同様です。

通常のexeを作成し、メインウィンドウのインスタンスをもう一つ同様にShowしようとしても
同じく死んだので、何か初歩的なレベルでミスしているのだと思うのですが、
エスパーしていただけないでしょうか……。
909デフォルトの名無しさん:2010/01/16(土) 16:54:28
Application::Run(gcnew hoge::hogeForm());
910>>901:2010/01/16(土) 18:05:57
>>903-907 のみなさま、ありがとうございます。

特に >>906 さん。なんとなくわかってはいたのですが、言葉できっちり表現がされていて助かります。
>>904 さんの方法も試した上で、週明けに改めて説明を行って対応方法を変更する方向で動きます。
911デフォルトの名無しさん:2010/01/16(土) 19:44:08
>>908
(gcnew hoge::hogeForm())->Show(); じゃフォームのハンドルを押さえているヤツが居ないな
912デフォルトの名無しさん:2010/01/16(土) 22:48:45
Formは表示中GCの対象外になるようになってる
913908:2010/01/17(日) 04:44:50
>>909
>>911-912
どうもありがとうございます。
Application::Run(gcnew hoge::hogeForm());も試して見ましたが、同様にそこで処理が止まります。
(次の行でデバッグ用の出力を入れていますが、出力されません)

ネイティヴ関数の状態から(CLRでない空のプロジェクトにグローバル関数を置いた状態から)、
/CLRを追加し、Windowsフォーム(CLI)の追加、
グローバル関数を記述したcppからのmscorlib.dllやフォームのヘッダの参照、
Application::Run(gcnew hoge::hogeForm());と、やっていることはこれだけで、
以下のような感じです。

#include <windows.h>
#using <mscorlib.dll>
#include "hogeForm.h"
int __stdcall Init() {
Application::Run(gcnew hoge::hogeForm());
}

ManagedとUnmanagedの区分け等、何か気を遣うところがあるでしょうか。
914デフォルトの名無しさん:2010/01/17(日) 05:09:13
>>913
Init()を呼び出す。
フォームが表示される。
フォームを表示したままinit()が終了して呼び出し元に戻ってくる。
というのを期待しているとかしてないよね?
915908:2010/01/17(日) 05:15:53
>>914
フォームが表示されることは期待しています。
上のコードでは、フォームを終了しない限り、処理が呼び出し元に返ってくることは期待してません。
916デフォルトの名無しさん:2010/01/17(日) 05:18:14
とりあえずこれで動いてる
// testd8.cpp managed
#using <System.dll>
#using <System.Windows.Forms.dll>
using namespace System;
using namespace System::Windows::Forms;
void Init() {
  Application::Run(gcnew Form);
}
// testd9.cpp native
void Init();
int main() {
  Init();
  return 0;
}

cl /clr /c  testd8.cpp
cl /MD testd9.cpp testd8.obj
917908:2010/01/17(日) 18:35:12
>>916
同等の物を書いてみましたが、確かに動作しています。
呼び出し方法やら何やら、片っ端から確認していって、原因を特定しようと思います。
どうもありがとうございます。
918デフォルトの名無しさん:2010/01/17(日) 22:05:10
汎用的なDLLでいきなりApplication::Runとかされたらヤだな
919デフォルトの名無しさん:2010/01/21(木) 22:57:19
質問ですが、
タイトルバーがなく3Dの縁があるフォームを作るには
どうすればいいのでしょうか。
環境はVC++2008です。
フォームのプロパティ設定の中には見つかりませんでした。
920デフォルトの名無しさん:2010/01/22(金) 00:10:35
C# タイトルバー 消す
とかでググれば一発
調べても分からない場合でもそういう質問はC#かVBスレでしたほうがいい
921デフォルトの名無しさん:2010/01/22(金) 21:52:51
>>920
なるほど、.NETなら共通なんですね。
わかりました、ありがとうございます!
922デフォルトの名無しさん:2010/01/23(土) 11:53:50
Visual Stuidion C++ 2008での書き方を教えて。

フォームクラスだと、イベント関数とかすべてヘッダの方に生成されるけど、
独自メソッドもすべてヘッダーの方に書くものなの?
それともプライベート関数はcppの方に書くとかルールがあるの?
923デフォルトの名無しさん:2010/01/23(土) 16:01:29
俺はヘッダは宣言のみにして、ソースファイルに定義。プロパティも同じ。
全部ヘッダに書いて、cpp削除でもいいんじゃね?w
924デフォルトの名無しさん:2010/01/23(土) 20:14:29
自分もそうかな。プロパティはヘッダに書いちゃうこともある。
C# とかは分かれてないからどっちでもいいと言えばいいんだと思うけど、C/C++ の伝統がそうさせる。w
925デフォルトの名無しさん:2010/01/24(日) 16:24:16
.NET言語って全部コンパイル速いからな〜、ヘッダに書いといて無駄なコンパイル発生しても
ほとんど気にならないレベル
926デフォルトの名無しさん:2010/01/26(火) 00:04:55
temp_buf[TEMP_BUF_SIZE], temp_buf2[TEMP_BUF_SIZE]は'\0'で初期化されてます。
文字列がtem_bufに格納され、その中から"search"を探索し、文字列が見つかれば
そのsearchのs以降の文字をtemp_buf2にコピーしようとしています。
が、実行すると暴走してしまいます。
*pの使い方がおかしいような気もするんですが、
原因が分かりません。
環境はgccですが手元にpcが無いので詳細は分かりません。
もし必要でしたら調べてきます。ごめんなさい。

char com[] = "search";
char *p = strstr(temp_buf,com);
if( *p != NULL ){
if( sizeof(temp_buf2) - &(temp_buf[TEMP_BUF_SIZE-1])-&(*p)+1 < 0){
fprintf( stderr, " buffer overflow 1\n" );
exit(-1);
}
strcat( temp_buf2, p );
printf("%s",temp_buf2);
 }

よろしくお願い致します。
927デフォルトの名無しさん:2010/01/26(火) 00:13:34
928デフォルトの名無しさん:2010/01/26(火) 00:23:02
スレチですね
失礼します
929デフォルトの名無しさん:2010/01/26(火) 00:26:06
>>928 は
>>926
のことです
930デフォルトの名無しさん:2010/01/26(火) 22:01:38
VC++ 2008 ExpressEdition で Form::Controlクラスを継承した独自コントロールクラスに
枠をつけるにはどうすればいいのでしょうか?
プロパティ設定には境界線の項目がありません。
それらしきメソッドも見当たりません。誰か知っていたら教えてください。
931デフォルトの名無しさん:2010/01/26(火) 22:06:43
932デフォルトの名無しさん:2010/01/26(火) 22:14:16
>>930
VisualStyleRenderer使って自前で描画する
プロパティも自分で実装する
あと>>920の3行目
933デフォルトの名無しさん:2010/01/26(火) 22:19:28
要するに、
コモンコントロールのそれぞれは自前で描画していたんですね。。
良く分かりました、ありがとうございます。
934デフォルトの名無しさん:2010/01/26(火) 22:23:25
>>933
Windowsで動作するほぼ全てのウィジェットレンダラーは
Win32GDIをまとめ直したものに過ぎないんだが、
最近の人はWin32APIで直接アプリを作ったりする経験がないから自前で描画する、という感覚がつかみにくいのかもしれんねぇ。

それはそうと、コントロール描画くらいならC#で実装した方が簡単だよ。
935デフォルトの名無しさん:2010/01/26(火) 22:30:26
>>934
動作のコアとなる部分がC++で作ってあって、DLLとしてまとめてあるんだけど、
GUI側をC#で作るとなると、呼び出すのに定義作り直すのがめんどうで、
どうしてもこの言語に手を出さざるをえないのよね。
936デフォルトの名無しさん:2010/01/26(火) 22:32:56
>>935
ええー。今時、WindowsでGUIを書くのにC++を使うなんて、マゾとしか思えん。
逆ならわかるがねぇ。
GUIをC#で書いてモデルや下回りをC++でってなら。
937932:2010/01/26(火) 22:36:49
すまん枠描くのはControlPaintだった
よっぽど深い相互運用しない限りはexport/DllImportの手間を差し引いてもC#の方が楽だし
安全だし取り回ししやすいよ
938935 :2010/01/26(火) 22:44:13
>>936-937
むう、再検討します。
939デフォルトの名無しさん:2010/01/26(火) 22:58:32
いわゆる普通の ウィンドウ枠は WS_BORDER だぞと。
普通は CreateParams オーバーライドして Style プロパティに
WS_BORDER のビットフラグ立てたのにするだけ。
3D 枠とかも基本は一緒な
940デフォルトの名無しさん:2010/01/26(火) 23:04:22
いやWindowsネイティブのコントロールに対応しない独自描画のカスタムコントロールの場合は
枠も自分で描くべき
標準のコントロールもそうなってる
941デフォルトの名無しさん:2010/01/28(木) 10:27:29
そもそもコモンコントロールだってただの画像だしな
942デフォルトの名無しさん:2010/01/29(金) 00:20:52
C++/CLI と C# embedded C++ どっちがいい?
943デフォルトの名無しさん:2010/01/29(金) 00:48:20
3択な上に比較対象がおかしい。
944デフォルトの名無しさん:2010/01/29(金) 02:04:59
何がしたいのかも判らんのに「どれがいい」も糞もないけどな。
WM (CE) の話で C++/CLI or C# or eVC++ のどれか、っていうなら
…いや、やっぱり好きにしろとしか言えないw
945デフォルトの名無しさん:2010/01/29(金) 02:46:25
(C++ in C#) の意味では?
946デフォルトの名無しさん:2010/01/29(金) 09:39:46
>>942-943
ワロw
947デフォルトの名無しさん:2010/01/31(日) 03:31:10
これからはC++0x/CLIの時代だろ
948デフォルトの名無しさん:2010/01/31(日) 05:14:01
敵はObjective-C++0xだな
949デフォルトの名無しさん:2010/01/31(日) 06:53:39
今までC++とC#ばかりいじくっていたが、Google様にお伺いを立てると
実行速度は

C++ > C++/CLI > C#, VB.NET らしい

C++/CLIの方が効率よく高速なMSILに変換される仕組みでもあるのかな?
950デフォルトの名無しさん:2010/01/31(日) 11:12:50
無いし実際同じ
951デフォルトの名無しさん:2010/01/31(日) 11:22:21
C++/CLI はネイティブコードで書いた部分の実行速度が速いからとかじゃ?
952デフォルトの名無しさん:2010/01/31(日) 11:38:51
ボックス化された値型とかトラッキング参照とか駆使して低レベルな最適化をやれば速くなるかもしれないけど
JITのバージョンアップであっさり逆転したりしそうだ
953デフォルトの名無しさん:2010/01/31(日) 22:47:30
検証に使用したコードがないと話にならんだろ。
954デフォルトの名無しさん:2010/01/31(日) 22:51:54
C#よりもC++/CLIの方ができることの制限が少ないから、速いコードを書くこと余地は大きいだろうね。
C++はUnsafeだから、こういうのを単純に比較しても意味ないと思うんだけどな。
955デフォルトの名無しさん:2010/01/31(日) 23:03:35
一般に将来的な最適化の妨げになるしなあ
956デフォルトの名無しさん:2010/02/01(月) 03:06:48
C++/CLIの速さはこの2つを足して2で割ったところとしているんでしょ。
マネージ部分の速さ = C#, VB.NET
ネイティブ部分の速さ = C++
957デフォルトの名無しさん:2010/02/01(月) 09:17:41
まあアンマネージだけで書いたらC++もC++/CLIも変わらんわな
マネージだけで書いたらC++/CLIもC#も変わらんわな

測ってないけど
958デフォルトの名無しさん:2010/02/01(月) 10:42:19
くだすれ落ちているのでここで失礼します。

unmanagedなバイト配列(unsigned char* byteArray, int len)を
managedな配列(array<Byte>)に変換したいと考えています。
とりあえずインデクサをつけて一個一個代入していったり、
Addしてみたりしたのですが、随分と処理に時間を喰ってしまいます。
そこまで速度に神経質なプログラムでも無いのですが、
もっとスマートに配列を変換する方法は無いものでしょうか。
959デフォルトの名無しさん:2010/02/01(月) 11:29:42
Marshal.Copy(IntPtr, byte[], int, int) とか。
960958:2010/02/01(月) 12:04:10
>>959
Marshal探せば良かったんですね。
Managedメモリを固定して確保してからmemcopyとか、明後日の方向に向かって努力していました……。
どうもありがとうございました。
961デフォルトの名無しさん:2010/02/02(火) 03:10:27
C++/CLIは/clr /clr:pureでは常にunsafeであり、
Cタイプの配列を使った場合のパフォーマンスが良い。1〜2割程度。
C++/CLIの暗黙のP/InvokeはSuppressUnmanagedCodeSecurityAttributeがデフォルトでオンなので、
C#のP/Invokeに対してパフォーマンスが良い。2〜3倍程度。
C#のP/InvokeにSuppressUnmanagedCodeSecurityAttributeを追加するとその差はなくなる。
またC++/CLIのリンク時に/CLRUNMANAGEDCODECHECKを付けると、
この属性がオフになるためパフォーマンスはC#と変わらなくなる。
962デフォルトの名無しさん:2010/02/02(火) 21:49:51
C#でも一応スタックに配列取ったりマネージ配列やアンマネージ配列にポインタでアクセスしたりできるよ
963デフォルトの名無しさん:2010/02/02(火) 22:10:43
マネージドで書いとけばいいのにやたらアンマネージド呼び出して
結果マーシャリングコストばっかりかかってパフォーマンス悪化とか、ありそうな話
964デフォルトの名無しさん:2010/02/11(木) 10:18:20
VS2010でインテリセンス外されたね
どうせ2008でもロクに機能してなかったし所詮ちょっとした橋渡しに使うだけだからどうでもいいけど
MSにとってのC++/CLIの優先度の低さは凄いな
965デフォルトの名無しさん:2010/02/11(木) 12:02:08
MS特有の言語なんて使う奴は馬鹿
966デフォルトの名無しさん:2010/02/11(木) 12:09:14
もともとから橋渡し専用言語だ
勘違いした奴が悪い
967デフォルトの名無しさん:2010/02/11(木) 12:39:38
J言語とかと同じような扱いだろ
968デフォルトの名無しさん:2010/02/11(木) 13:12:30
役に立たない機能ならなくなってもいい。
だがC++/CLI自体がなくなっては困る。
たとえ使う頻度が少なくても。
969デフォルトの名無しさん:2010/02/11(木) 13:20:35
.Netごとなくなればいいだろ
970デフォルトの名無しさん:2010/02/11(木) 14:03:10
MSがネイティブコード非推奨なら、unixと棲み分けができて丸く収まるんじゃないの
971デフォルトの名無しさん:2010/02/11(木) 15:48:04
思うんだけど
/clr:safeとかclr:pureだったりするとインテリの構文解析も
それほど手間がかからないと思うんだが。

STLとかほかのヘッダ使うときより
972デフォルトの名無しさん:2010/02/11(木) 15:50:57
それならC++/CLIなんかわざわざ使いません
973デフォルトの名無しさん:2010/02/11(木) 15:51:47
それだとC++/CLIあんまり使わないだろ。
974デフォルトの名無しさん:2010/02/11(木) 17:39:16
ネイティブいらないなら普通C#使う。
975デフォルトの名無しさん:2010/02/16(火) 01:32:21
あえてC++/CLIを使う必要があるのってどんな時だ?
976デフォルトの名無しさん:2010/02/16(火) 08:33:02
C++用ミドルウェアのC#用ラッパー作る時
977デフォルトの名無しさん:2010/03/06(土) 14:26:58
HOGEHOGE *hoge
open(&hoge)
ってやるとhogeを自動的に割り当てるCで書かれたDLLがあって

これを呼び出そうとしてるんだけど
マネージド側からHOGEHOGE*をどう渡せばいいのか分かりません

cli::interior_ptr<Type>' から 'HOGEHOGE **' に変換できません。
とか言われてます
978977:2010/03/06(土) 14:29:41
事故解決
979デフォルトの名無しさん:2010/03/07(日) 12:22:27
クラスメンバに定数を持たせるにはどうすれば?

Hoge.Func(Hoge.Options.Option1)みたいな

980デフォルトの名無しさん:2010/03/07(日) 12:28:43
literalかinitonlyで変数を宣言する
literalはコンパイル時定数でinitonlyは普通の読み取り専用フィールド
でもクラス外から見えるような定数をliteralにするのはバージョン管理上の問題があるので
.NETではなるべくinitonlyを使う
981デフォルトの名無しさん:2010/03/07(日) 13:14:06
public ref Class HOGE
{
public:
ref struct Options
{
literal Int32 Option1=1;
};
};

ってやるとInt32の前に;が必要ですとか言われます
調べた限りこれでいいと思うんだけどなんででしょう
982デフォルトの名無しさん:2010/03/07(日) 13:28:37
literal System::Int32 Option1 = 1;
983デフォルトの名無しさん:2010/03/07(日) 13:34:45
>>981
同じですね
コンパイラにliteralが認識されてないみたいです
青色になってるからIDEは認識してるみたいなんですけどね
なんか宣言とか要るんですか?
984デフォルトの名無しさん:2010/03/07(日) 13:44:27
ああ、原因が分かりました
C++のヘッダをincludeした所から下がunmanagedでコンパイルされてたみたいです
985デフォルトの名無しさん
それより>>979のような使い方をするならenum classにすればいいのに