1 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 21:13:54 ] おそらく、.NET開発でデファクトスタンダードに最も近い であろうC++/CLIについて語ろうぜ! このスレはC++および.NET Frameworkについて一定以上の知識を持っている人が対象となります。 .NETのクラスライブラリの使い方といった質問は姉妹スレ「くだすれC++/CLI(初心者用)」に お願いします。 前スレッドはこちら (p)pc11.2ch.net/test/read.cgi/tech/1142147319/ (p)pc8.2ch.net/test/read.cgi/tech/1126450441/l50 姉妹スレ くだすれC++/CLI(初心者用) (p)pc8.2ch.net/test/read.cgi/tech/1142144110/l50 managed C++ やろうぜ!! 002 (p)pc8.2ch.net/test/read.cgi/tech/1139043535/l50
369 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 22:49:20 ] ありがとうございます。 コンパイルやってみて上手く動きました。 String型文字列をchar型にコピーするのについても質問したいのですが、 c_str[0]=cli_str[0]; というのを繰り返す事でコピーできる事まで調べました。 これを行う為の関数のようなものはあるのでしょうか?
370 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:00:33 ] ・・・みんないっぱい検索キーワード出してるじゃん まじめに探したの?
371 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:08:35 ] marshal_contextを使うか、CString/CStringA/CStringWを使うか。 どっちもexpress edtionだと使えなかったと思う。 裏技的にはsprintfを使う方法がある。
372 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:12:30 ] だから、WideCharToMultiByte があるじゃないか
373 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:17:04 ] >>372 それは単なるUNICODE-ANSI変換でない? 残りの方法はこんなとこ、使い方はぐぐってね。 Marshal::StringToHGlobalAnsi Marshal::StringToHGlobalUni PtrToStringChars
374 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:18:12 ] >>369 それ仮名・漢字が入ると死ぬよ。
375 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:19:24 ] Encodingが一番確実か
376 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:25:26 ] >>373 Unicode -> MBCS変換だろうけど WideCharToMultiByteは変換に使えないの?
377 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:28:02 ] >376 そのまえにToArrayしてpin_ptrして、サイズ計算して、領域確保して変換だから ほかの方法のほうが断然楽
378 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 01:33:06 ] >>377 ToArrayよりPtrToStringCharsだろ。 いずれにせよ、pin_ptr<const wchar_t>化してしまえば、 既存のライブラリが使えるので、持ち合わせがあればそんなに悪くない選択肢だと思う。
379 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 14:04:04 ] C++/CLIで書いたプログラムって Monoで動く?
380 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 14:09:57 ] 動くのもあるし、動かないのもある
381 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 14:23:46 ] /clr:safeのものは動く。 ただしSTL/CLIのサポートはまだのようだった。
382 名前:デフォルトの名無しさん [2009/02/01(日) 01:06:00 ] cl.exe でコマンドラインからコンパイルすると 〜.exe.manifest なるものも生成され、削除すると〜.exeが起動しなくなります。 exe単体で起動できるようにするにはどうしたらいいのですか?
383 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/02/02(月) 00:27:50 ] 仕事で事前調査用に使ったが、周りに理解されず、本番はVC++6.0でMFC4.2ときたもんだwww なんか、布教にいい道具があればいいのだけど…。
387 名前:デフォルトの名無しさん mailto:sage [2009/02/02(月) 01:41:31 ] WPFとかに対応しない限りまず消滅すると思った方がいいだろうね。
388 名前:デフォルトの名無しさん mailto:sage [2009/02/02(月) 02:25:50 ] WPFが俺の思ってる物と同じなら、対応するとかナニ言ってるんだって感じ。 まあ、Cのポインタ全部絶滅させられるならどっちでもいいがw
389 名前:デフォルトの名無しさん mailto:sage [2009/02/02(月) 02:27:19 ] >>388 絶滅させられないからこそのC++/CLIじゃないの?w
390 名前:デフォルトの名無しさん mailto:sage [2009/02/02(月) 08:48:55 ] 今のところMFCのCArchive使ってファイル保存していた古いデータを .NET側から簡単に読み込むためのモジュールを作るのに重宝してるってぐらいだなぁ。
391 名前:デフォルトの名無しさん mailto:sage [2009/02/02(月) 19:55:31 ] WPFみたいなほとんどマネージコードによるマネージコードのための超高レベルフレームワークを わざわざC++で使う意味がわからない
392 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 01:32:22 ] まぁP/InvokeやCOWだけじゃ困る場面もたまにはあるわけだし。 やってることは凄いんだが評価されないC++/CLI。 とりあえず「C++屋のための.NET言語」という勘違いをされ気味なのはなんとかすれ。
393 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 02:17:17 ] 進化したMS版C++Builderくらいにしか思ってませんでしたw
394 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 02:20:41 ] 使いやすいGUIライブラリ付きのC++という捉え方は誤解の元だね
395 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 02:27:14 ] どうして誤解なのか解説しちくりくり
396 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 03:16:05 ] 使いやすくないからな。 GUI部分はC#でいいべ。
397 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 09:07:45 ] C#の「#」は、++++ で C++++の略でしたっけ?
398 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 09:21:42 ] >>396 まあそうなんだが、GUIだけ分けるのもかえって面倒だったりするしな。
399 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 15:51:47 ] >>389 何言ってんだお前
400 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 00:28:07 ] >>397 別に略ではないな
401 名前:デフォルトの名無しさん [2009/02/04(水) 15:17:24 ] で、どうしろと?
402 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 21:50:29 ] とりあえずチンコでも揉んでみたら
403 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 22:13:08 ] チンコとかの話しかしない人に必要な言語は C++/クリ(ry C++/CLIは地味だけど、商用デスクトップアプリで .NET使う場合はよけて通れない言語じゃないかなぁ。 .NETなアプリはまだ本家MS様も出してないよね? Expression もハイブリッドだし。
404 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 22:18:08 ] ネイティブとマネージドのミックスタイプのアプリはMSのプロダクトに増えたけど、 基本的にホスティングがおおいな。 C++/CLIはあまり見かけない。
405 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 22:53:46 ] >>404 あ〜。ホスティングだったのか。 勘違いを正してくれてありがトン
406 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 22:59:00 ] XNAのWindows向けアセンブリくらいだろうなぁ。
407 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:36:35 ] 俺の言ったカンファレンスじゃ、ベンダーがC++/CLI がベストと言って楽しそうだった
408 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:51:11 ] WPFも一部C++/CLIだな XNAのフレームワーク部分はC#だよ
409 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 01:18:58 ] 日記もつけたし今日は寝る。お休み。
412 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 01:29:23 ] >>410 その混在を実現しているのが今のところC++/CLIだけ。 #pragmaでネイティブとマネージドどっちのコードを吐くか切り替えられる。 ネイティブクラスとマネージクラスの混在(has Aでの包含)は 透過的ではないものの、手段は用意されている。
413 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 02:22:24 ] blogs.msdn.com/bclteam/archive/2006/06/23/644343.aspx ただのネイティブ関数呼び出しであるP/Invokeですら 導入した瞬間にこんだけの「隙」が出てきてしまうのだから 簡単に実現できる方法って言われてもお花畑だよなぁ。 理想に対する泥臭い現実解としてはイイ線いってると思うけどねぇC++/CLI。
414 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 02:58:44 ] とりあえずガンガン使っていくので今後ともよろしく>C++/CLI 使って情報を出さないとね。ググった結果に引っかかるサンプル増やせば ちったあ底辺広がるだろうし。
415 名前:デフォルトの名無しさん [2009/02/10(火) 09:57:12 ] バイナリフォーマットで100MBほどのデータを シリアライズしようとしているのですが、 デシリアライズするときにメモリを数倍も消費して ロードできないのですが、 デシリアライズをカスタマイズしないとできないのでしょうか? GC::Collectするとメモリがいっぱい回収できます。
416 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 20:58:03 ] 諦めてXmlReaderかストリーミングでLINQ to XML使った方がいい
417 名前:415 mailto:sage [2009/02/10(火) 23:00:48 ] 結局、自前で読み書きするようにしました。
418 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 13:54:41 ] >>392 > やってることは凄いんだが評価されないC++/CLI。 MSがC#を前面に押し出したから見向きされなくなったよね。 それにC++はもともと敷居が高い言語だけど、 マネージドが入るとさらに敷居が高くなるからね。 員数仕事じゃ使うの無理じゃない?
419 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 13:58:36 ] >>418 >MSがC#を前面に押し出したから見向きされなくなったよね。 その頃はまだmanaged C++といってほとんど試作品」だったよ
420 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 13:59:16 ] C++/CLIのコンパイラのソース出してくれないかなあ。 CLIじゃなくて、JVMのバインディング、面白そう。
421 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 14:00:00 ] >>419 「その頃」違いです。
422 名前:デフォルトの名無しさん [2009/02/11(水) 17:01:01 ] そもそも、.NETはお金を頂くソフトウェア作るには不向き ・遅い ・ソース丸見え ・フレームワークインストール必須 ・FAでは絶対に無理 枚挙に暇がない
423 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 17:35:54 ] 今時そんなのが問題になるのか?
424 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 17:48:12 ] >・ソース丸見え あっちこちでネガネガしてる奴のようだ。ほっとくに限る。
425 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 18:58:12 ] 組込みでC言語、VB6を少々 しかやった事無いけど、CLRでデータロガ作ってみた。 Windowsの知識はほとんど無いけど、すごく簡単ね Win32Apiでやろうと思ってたけど、自分のツール程度ならCLRでいいかな。 とりあえず田舎で本が手に入らないからゴリ押し(ほぼC言語w)で作成中、 勉強すればもっと便利に使えると思うんだけど・・・。 皆さんはどうやってC++/CLRを勉強したの?
426 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 19:00:29 ] 勉強? どこをどう勉強する必要があるんだ??
427 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 19:17:43 ] >>425 C++の経験者が使う言語だと思ったほうがいい。 Win32APIやCのライブラリを使わないならVB.netやC#やったほうがいい。
428 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 19:18:12 ] デフォルトでスマートポインタなCOMの一種と考えるとそれほどでもない
429 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 21:36:59 ] C++とC#の経験があればそのまま使える というか,そういう人にしか旨味のない言語 簡単だと思うのはC#やVB.NETを触ったことがないから
430 名前:425 mailto:sage [2009/02/12(木) 03:33:22 ] >>426-429 ありがとう、意見を参考に、ずっとC#のサンプルコードいじってた。 とりあえず腹減ったので寝ようかな。 >>427 当初Win32APIをやろうと思ったけど、開発効率重視で諦めました。 *組込み屋なんで速度と柔軟な処理が可能かが気になりましたが、 そんな難しいもの作るわけじゃ無いので。
431 名前:デフォルトの名無しさん [2009/02/14(土) 19:15:48 ] E-mail欄ってほとんどE-mail欄の役割は果たしてないよね。
432 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 21:38:35 ] 果たしてるスレもあるよ、カードゲームのトレードスレとか
433 名前:デフォルトの名無しさん [2009/02/21(土) 13:57:06 ] 良い時は悪い時。 悪い時は良い時。
434 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 12:00:31 ] >>430 デスクトップでプログラム書く時は、組み込み脳は捨てろ。
436 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 12:12:44 ] >434 それ C++/CLI と関係ないし Schema はどう定義されているの? XML読み込んだDataSetからSchemaを見てみたら?
437 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 12:13:36 ] そういう質問は軽くC#の書き方覚えてC#スレで聞いたほうが早いよ
438 名前:434 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 14:31:08 ] C#で試したらLINQに行っちゃう気が
440 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 14:49:58 ] LINQ楽なんだよな〜 3.5に移行する気ないからテストプログラムでの使用オンリーだけど
441 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 15:36:22 ] System.Xml.Linqの使いやすさは異常 言語としてのLINQサポートがなくても十分使いやすいと思う
442 名前:434 mailto:sage [2009/02/22(日) 18:19:33 ] 確認したらウチの 2008 standard にも C# 入ってたし、覚えようかな。。。
443 名前:デフォルトの名無しさん [2009/02/24(火) 23:47:48 ] 覚えても使う機会が(ry
444 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 18:13:15 ] おれ、がめついからVS2008EEを全部インストールしたけど 一番使わないと思ったVC++を今一番使ってる
445 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 18:18:35 ] cl vjc fsi jsc ... やっぱり一番使うのはmlでっしょ
446 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 19:16:16 ] いちばん使わんのはVBだな
447 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 19:20:23 ] ILASM最高
448 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 13:03:01 ] newとgcnewって マルチスレッドでコンパイルすれば、 スレッドセーフですか?
449 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 14:48:00 ] 当然だ。でなきゃ使い物にならないだろ。
450 名前:デフォルトの名無しさん [2009/03/03(火) 23:00:37 ] 早急に回答を頂きたいのですが、 テキスト(アスキー)をバイナリに変換する方法を教えてください。 本当に急いでいます。よろしくお願い致します。 悩んでいます。本当に。
451 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 23:07:42 ] テキストもバイナリの一種ではあるのだが。とか言ってみる。w なにをしたいの?
452 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 23:07:56 ] エスパーさん 出番ですよー
453 名前:450 [2009/03/03(火) 23:11:59 ] >>451 >なにをしたいの? 出世です。 bitconverterあたりを調べても何も出てきませんよ。ため息以外は。 本当に急いでいます。今日は寝ません。本当に。
454 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 23:13:54 ] >>453 > >>451 > > >なにをしたいの? > 出世です。 > > bitconverterあたりを調べても何も出てきませんよ。ため息以外は。 > 本当に急いでいます。今日は寝ません。本当に。
455 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 00:19:50 ] printfでいいじゃない。ヘキサダンプもバイト出力も自由自在。
456 名前:450 [2009/03/04(水) 00:29:54 ] 出力させても意味はないのです。 バイナリデータにしないといけないのですよ。 回答まだですかね? 眠くなってきましたわ。 本当に。
457 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 00:47:16 ] だから冗談抜きでテキストはバイナリなんだけど
458 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 00:50:25 ] じゃあfprintf
459 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 01:00:36 ] 適当に圧縮して保存すればおk
460 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 01:42:09 ] charまたはstringをintにキャストしたいという意味だろうか
461 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 02:09:17 ] ならばsprintfで
462 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 05:20:49 ] C++/CLIではC#のようなAnyCPUのEXEやDLLは作れないんですか?
463 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 08:22:34 ] >462 /clr:safe にすれば?
464 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 10:05:25 ] あーそんなオプションがあったんですね ありがとうございます
465 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 10:09:17 ] C++/CLIを使う価値99.9%減だけどな
466 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 10:20:32 ] /clr:safeだとコンパイル通りませんでした;;
467 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 10:26:08 ] /clr:safeの場合はネイティブコードを混ぜられないからな 単なる劣化C#になっちゃうからC#使った方がいいよ
468 名前:デフォルトの名無しさん [2009/03/04(水) 10:42:40 ] 0x1234 みたいなテキストをバイナリの2byteとかにしたかったのかな... そんな事で出世できる会社がうらやましいわw
469 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:24:29 ] 何がしたかったんだろうな エスパーじゃないからさっぱりわからん
470 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:30:49 ] GZipStream でも使えばよかったのにな
471 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 18:15:31 ] C++/CLIのコードで「reinterpret_cast」の部分を選択してコピー ( Ctrl + C ) したらVSが固まるのって俺だけ?
472 名前:450 [2009/03/04(水) 23:48:34 ] >>468 まさに、それがしたかったのですよ。 やっと理解者が現れたか。
473 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 23:57:01 ] >>468 の才能に嫉妬。w sscanf とかでもいいんじゃないの。もっといいのあったと思うけど。
474 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 00:05:52 ] Converter でいいんじゃね? 今度はエンディアンの違いとかで騒ぎそうだけどさwww
475 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 00:20:51 ] C 互換の数値リテラルなら strtol() かな。 書き下ろしても大したこと無いように思うけど。
476 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 12:48:19 ] >>472 そうかわかったぞ GoogleのTwitterをいち早く読んで 出世にいかそうとしてるんだ・・・・なんてなw
477 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 22:25:34 ] こんなこと言うのはなんだけど、そんなのC++/CLIでやる ことじゃないよな・・・ しかも、C#とかJavaとかCとかならまだしも、なぜC++/CLI ・・・
478 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 00:35:00 ] いままで MFC を主に使ってた人間が C++/CLI を使い始めようというときに、 よい参考書ってないかな? ネットで調べつつ、特に問題なく書くことは出来るんだけど、 なにか見落としてそうで怖い。 他のところでも聞いてみたんだけど。。。
479 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 01:15:33 ] C++は初心者では無いけど、.NETは全くの初心者というのなら多分無い 既に知っているかもしれないが、C++も.NETも使いこなせるような人がその両方を活かすために選択するのがC++/CLI C++を勉強するために選択するべきものではないし、.NETを勉強するために選択するべきものでもない
480 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 10:10:56 ] >478 現状で特に問題がないなら、むしろ .net framework の癖というか、ライブラリの作り方が 載っている C# の本を買ったほうがいいお そこらに載っていることをC++/CLIで表現できれば十分じゃない?
481 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 11:10:11 ] C++/CLIで書かれてる情報だけを調べて特に問題なく書けてきたなら尊敬に値する
482 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 11:40:00 ] ttp://msdn.microsoft.com/ja-jp/library/ms235289(VS.80).aspx とりあえずこれ読むといいよ。 前にマネージ型の実行時型情報の扱いでちょっと苦労したな。 SomeClass::typeid でType型が返ることさえ分かってしまえば 全部解決なんだが、なかなかそこに辿り着けなかった。 つーかなんでIntelliSenseで出ないんだこれ。
483 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 11:44:05 ] それアンマネージC++→C++/CLIじゃなくてManaged C++→C++/CLIだよ ひたすら表記の違いだけが書いてあるだけ .NET初めてなら実行時型情報なんてそもそも何のことかわからんでしょ
484 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 12:04:54 ] あのぅ、RTTIは…
485 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 12:51:46 ] >>483 そうだけど、ManagedとCLIでほとんど全部変わってるので、 結果的にC++/CLI構文の端的な解説みたいになってる。 まあマネージドの概念とかeventみたいな特殊なのは 他のところで頑張って覚えてもらうしかないが、 その場合もここで出てきたキーワードでMSDNライブラリ引けば だいたい解説があるし。 あと実行時型情報なんて必須知識ではないし、 他のも必要なものだけ覚えりゃいいと思うよ。 人によっては value class や enum class も必要なかろう。
486 名前:478 mailto:sage [2009/03/06(金) 23:02:03 ] たくさん、ありがとう。 とりあえず >>482 さんの教えてくれたサイトを読んでみます。 自分でも調べているところですが、>>479 さんも仰られているように .NET を まず覚えないといけなさそうですね。いただいたレスの中にさえ見覚えのない 単語がある状況からしてなんとかしないと。 >>481 意外となんとかなるモノですよ。 まあ、C++/CLI そのものではないけど、ちょっとずついろいろと触ってきてるし。
487 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 23:05:34 ] 最低限C#は読めないと話にならないよ
488 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 17:56:55 ] ネット上のサンプルコードの量はVBが一番多い気がする でもVBのよさが分からない。
489 名前:478 mailto:sage [2009/03/07(土) 19:08:36 ] 調べていての感想は 「‥‥なんか VB みたい」 でした。w C# は読むだけなら別に問題なくできたりします。 (ネットで拾った C# のコードを C++/CLI に置き換えたりしてお勉強してます) 一番戸惑うのは、自分が欲しい機能を持った関数がどこにあるのか見当が付けづらいことですね。 基本的な手順などは Windows の API や MFC を使う場合と大差ないような気がするので、 既存のコードを読む場合には VB でも C++/CLI でも C# でもわかるのですが、自分で書く場合に どこにその関数があるのかわからず途方に暮れるというか。w 昨日も、マネージ拡張でちょっとしたツールを書いてたのですが、書いてる時間よりも 必要な関数の情報を集める方に圧倒的に時間を要してました。むー。
490 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 22:09:50 ] C++/CLIは異なるアーキテクチャを混ぜただけだからややこしくなる。 APIやMFCを使いたいならC++の方が制約なしに使えるし。 .NETフレームワークを使いたいならC#だろうし。 初めのうちはどちらかを選んで情報を収集したほうがいいよ。
491 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 22:54:05 ] C#やVBなら慣れてくるとインテリセンスでテキトーにメンバ探せる だまされたと思ってちょっとVC#触ってみたら? 異次元の使いやすさでアホらしくなるからw
492 名前:デフォルトの名無しさん [2009/03/17(火) 17:03:00 ] 畑を荒らしてるのはモグラじゃないよ。 モグラの穴を利用しているネズミだよ。 モグラは肉食だから野菜は食べないよ。
493 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 17:00:28 ] 穴掘る時点で荒らしてます。
494 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 19:03:10 ] アンマネージのコードで作成されたウィンドウにマネージコードのコントロールを乗せる方法ってないですか?
495 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 20:13:41 ] あります。
496 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 21:07:38 ] >>495 出来ればヒントだけでもお願いします。 あるソフトのプラグインで複雑なGUIを組みたいのですがC++ CLIの情報自体が少ない上に こんなニッチなことをしている人はいないみたいなので。
497 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 22:41:29 ] >496 上の方のスレ読んだ?
498 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 05:01:11 ] >>497 ありました。 MFCですか。使ってないけどなんとかやってみます。
499 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 14:31:53 ] いま、C++/CLI の勉強中なんですが、C# との連携をやってみたくなりました。 C# で画面系を作って、それ以外を C++/CLI でやってみるとか考えているのですが、参考になりそうな HP とかないですかね。 自分でも調べ始めたところなんだけど、間違った方向に行かないようにするためにも最初だけは他力に縋ってみたくて。
500 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 15:10:23 ] 春休みかあ
501 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 22:47:42 ] >499 C++/CLI は普通にアセンブリを作れるから、C++さえわかっていればC#からそれほど 離れている訳じゃなく、構文上の癖だけ理解すればいいんだけど、C++はできるんだよね?
502 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 23:53:08 ] >>501 C++ は特に問題ないす。 C# とかもたぶん問題ないです。書かれているのを読むだけなら普通に出来ます。 C++/CLI を調べるときに MSDN を読むとほとんど常に C# とか VB とかの関数も併記されているので 一緒に使えるんだろうな、とか思ったのが連携させたいと思ったきっかけでした。 「アセンブリ」、調べてみます。 >>500 まあ、あの質問の仕方ではそう思われるすね。たしかに。
503 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 23:56:18 ] まあ参照設定すれば見える。 それも同じソリューションなら適宜やってくれるはずだし。
504 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:28:25 ] >502 ほれ。これで充分じゃね ttp://vene.wankuma.com/ecma372/08_overview.aspx アセンブリはメタデータ付きのDLLのことだお。.NETでは EXE と DLL は両方ともアセンブリで 違いはスタートアップの有無だけ。だから、EXE も参照することができるんだお
505 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 09:07:35 ] 従来のC関数もEXEからエクスポートできたりするわけだが。
506 名前:499 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 12:15:00 ] ttp://bbs.wankuma.com/index.cgi?mode=al2&namber=34991 同じ質問を見たな
509 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 14:14:21 ] 解決しました。 MFC拡張DLLをひっつけるのではなく、単なるクラスライブラリにしたら うまく行きました。 お騒がせしました。
510 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 00:48:46 ] CLIはヘッダーに実行コード書くのに違和感が...
511 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 00:52:27 ] それは、単にVC++の新規プロジェクトで作成されるコードがそうであるというだけのことだろ。
512 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 09:03:44 ] そうだけど、いちいち書き直すのめんどくさいんだよな。 普通に宣言と実装に分けてくれればいいのに、 なんでこんなことになってんだろう。
513 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 11:09:53 ] C# とか他の .net 開発言語?でそうだからなんじゃない。 ヘッダとコードが別々な C/C++ の方が珍しいってどこかで聞いた。 そんな分離の話よりも、ひとつのフォームとかのコードをすべて同じファイルに記述する 人が多いことの方が気になる。ちょっと規模が大きくなるとごちゃごちゃして分かりづらいことこの上ない。 そのほかにも VB6 の頃に不満に感じてたことを、いまここでまた目にするとは。。。
514 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 11:43:50 ] VBは知らんが、今のC#はデザイナで作ったコードと ユーザーが実装したコードは別になってる。 あれと同じようにしてくれればそれでいいんだが。 VS2010でC++に大きく手が入るってことになってるが、 ぜひ変更して欲しいところだ。
515 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 20:45:17 ] むしろヘッダに実装全部書いても問題のない言語デザインに変更してほしい
516 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 21:21:25 ] プロパティなんていちいち分離して書いてられないもんな ただでさえ面倒な文法なのに
517 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 21:43:11 ] >>515 むしろ、ヘッダを書く必要のない言語にだろう。 D言語ではコンパイラがコンパイルするときにヘッダファイルを自動生成してくれるらしい。 テンプレートとかどうなってるのかは知らんけど。
518 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 22:03:28 ] よく知らないけど n1778 とか
519 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 23:57:24 ] まあC++はC++の文法であることが存在意義だからな。 嫌ならおとなしく最近の言語を使うしかあるまい。
520 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 19:31:20 ] そうかなあ
521 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 23:03:28 ] C++/CLIは進化したC++として使うための言語じゃないでしょ 逆に「C#アンマネージ拡張」でよかったのに
522 名前:デフォルトの名無しさん mailto:sage [2009/04/21(火) 08:50:34 ] ヘッダとソース分けると using namespaceがうざいことになる。 まーヘッダだけフルパスで書けばすむんだが。
523 名前:デフォルトの名無しさん [2009/05/11(月) 10:57:13 ] 過疎スレに質問。 C#やVB.NETってdecompiler使うと生ソース丸出しになっちゃうけど、 C++/CLI で clrsafeでないソース書いてもやっぱ丸出しになっちゃう?
524 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 11:18:22 ] マネージド部分は当然
525 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 16:29:59 ] しかし何で、見えるのを気にする奴がいるんだ。 はっきり言ってどうでもいい。どうせ見てもわかる奴は見ないし。 見たい奴はわからないだろうから。
526 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 16:39:17 ] .NETの場合はメタ情報がしっかり残ってるというのがポイントだな。 それと逆コンパイルのツールが手軽に手に入るといったところか。 ソースが逆生成できるというならそれなりのツールを使えばCからでも 相当の精度で可能なのだが、マクロやテンプレートの展開でソースが スパゲッティになったり関数やクラス名など型情報が抜け落ちるので その分解析しづらい。 .NETでもクラス名や関数名のメタ情報を書き換える程度の 難読化ツールを使えば解析しづらくなるから使ったらいい。
527 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 16:42:57 ] 実際ある程度の規模のソースになると、仕様書もコメントもないソースを提示されても 見る気も起きないのが普通。 見られて困るといってるのはパスワードを入れるとエロ画像が拝める系のしょうもない シェアウエアの作者と相場は決まっている。
528 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 16:58:48 ] 表記法がまるで入れ替わっていて美しくないと思うけど、 仕様でミスった方はC#でいいよね。 C# ファイナライズ ~MyClass() ディスポーズ IDisposable.Dispose() C++/CLI ファイナライズ !MyClass() ディスポーズ ~MyClass()
529 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 17:58:59 ] >>528 C#使ったことあるの?
530 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 18:02:26 ] あったらこんなこと書かないでしょw
531 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 18:52:35 ] C#でもディスポーズを~MyClass()と定義するべきだったと思う。
532 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 19:11:06 ] >>531 ヒント:経緯。順番。
533 名前:デフォルトの名無しさん [2009/05/19(火) 23:57:42 ] C#のディスポーズは歴史的な失敗作
534 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 00:11:45 ] って、いうかGCに対応する為に 覚えなきゃならない概念が増えるのがイヤだ。 弱い参照だのトラッキング参照だのファイナライズだの
535 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 08:20:08 ] VS2010ベータが出たので入れてみたがC++/CLIでIntelliSenseが使えなかった。
536 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 11:35:35 ] >535 C++って0x対応とIntelliSense強化がメインじゃなかったっけ?
537 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 12:02:59 ] CLIじゃないC++ではIntelliSense使えるし、 C#にあったコンパイル前にエディタ上でエラー表示する機能も追加されてる。 なのになぜかC++/CLIでは IntelliSense: 'Unavailable for C++/CLI' と表示されてしまう。
538 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 15:40:46 ] 助けてくだちい C#からC++のクラスライブラリを使いたいので、 C++/CLIでラップするクラスライブラリを作っていたら、 何かC++のクラスのインスタンスをC++/CLIでnewすると、 例外が出てしまいますーorz アンマネージコードのデバッグを有効にするとセーフ 回避する方法ありますか?
539 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 17:46:50 ] 別のDLLのクラスをnewしようとしてるんじゃねぇ?
540 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 18:23:56 ] >>538 gcnew
541 名前:デフォルトの名無しさん mailto:sage [2009/05/20(水) 22:05:06 ] >538 人にものを聞くときは例外ぐらいコピペしろよ、このデコ助野郎
542 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 11:45:45 ] InteropServices の例外? COMオブジェクトでもコンストラクタで生成してるの? ライブラリの実績はあるんだよね
544 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 13:39:10 ] >> 543 C++の方は、DirectShow(COM)を使いに行きます。 ライブラリの方は、C++ではちゃんと動いてます。 自分も、COM辺りが怪しいのかなと思って、COMを一切アクセスしない 空のクラスをテストで作ってみたのですが、それでもダメでした。 上で書いたvirtualというのは間違いで、今色々試したところ、 クラスにメンバ変数があるとダメの様です。意味不明。 ただ、DirectShowのサンプルにあるBaseClassesというlibを流用しています。 それが引っ付いてるのですが、グローバルでstaticな変数定義とかがあるので、 その辺りで何か問題があるのかもしれないですね。
545 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 13:56:01 ] > 外部コンポーネントが例外をスローしました。 と書いてあるとおり、COM内部で例外を投げている。 原因はいろいろあるが、何れにしてもCOM内部での話なのでCLRには関係ない。
546 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/05/25(月) 22:19:11 ] アンマネージの時みたいってのがさっぱりわからないが DataGridView::RowAddedイベントかBindingSource::ListChangedイベントで
549 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 06:24:44 ] 俺はVisual Stidio 2003なので、CLIは使えん。 マネージ拡張C++だけになるが、そのタイトルのスレは無いので、ここに書いても かまわないか、それともだめか。
550 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 09:13:45 ] ここは今無き ManagedC++ スレの直系だからおけー
551 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 10:24:36 ] /clr:oldSyntax で今でも一応使えるが、もうすっかり忘れてしもーた。
552 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 01:20:50 ] 愚痴。 VC6ソースなアンマネージDLL内の関数が、FLIE*な引数を要求してくるんだ。 で、C++/CLI内でラッパークラスを作ってそこでfopenした結果を渡してやると 書き込み時に例外 System.AccessViolationException が出て使えない。 この手のストリームをアンマネージな相手に渡すときに注意することは なにかあったかなぁ...。
553 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 01:58:27 ] そのDLLはVC6でビルド済みなの? だったらCRTのバージョン非互換の可能性もあるけど。
554 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 02:29:44 ] 愚痴とか言わずに、素直に 「誰か知ってたら教えて!!」 って言えばいいのに
555 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 02:33:21 ] そしてお前が次に言う台詞は ググレカス
556 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 22:22:04 ] >>552 CRT境界を超えるなあほう
557 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 23:28:39 ] くり
558 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 01:40:19 ] >>556 いやまあしかし、逆方向には渡せるし使えるからなぁ。 この辺のやっていい事か否かの判断は難しいね。
559 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 03:11:04 ] 俺もね、CRTで悩んでるのよね。 DLLの中にグローバル変数置いてるんだけどさ、 CRTのデバッグ系DLLをリンクすると問題ないのに リリース系DLLをリンクすると、アプリケーションの 初期化に失敗しましたってなっちゃうんだよね。 何なんだろうねコレCRTかんけーねーじゃん。 つーかC++/CLIにも関係ないか。
560 名前:デフォルトの名無しさん [2009/06/07(日) 13:21:48 ] これからC++/CLIを学ぼうとおもっているのですが、 なにが良いサイトを紹介していただけますでしょうか・・・。
561 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 14:13:00 ] いまのスペックは?
562 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 14:17:09 ] 500000です
563 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 14:21:46 ] 私なんて52万ですよ。ホホホ
564 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 14:40:53 ] VBの関数を使えると聞いたのですがどうやって使うのでしょうか? 若しくは解説しているページはありますか? くだスレというスレで聞きたかったのですが、dat落ちしてしまったようです
565 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 14:55:32 ] VBがVB.NETであることと、C++/CLIが何か分かっていての質問? プロジェクトの右クリックで参照...の「新しい参照の追加」でMicrosoft.VisualBasic追加すればいい。 using namespace Microsoft::VisualBasic; で探すといくつかサンプルあるかもよ。
566 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 12:58:38 ] >>558 出来るとやっていいは違うべ DllMainでMessageBox呼ぶのだって同じだろ
567 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 01:41:29 ] 品薄みたいなのでボランティア出品しました。必要な方どうぞ 業者さんには悪いですが、1万ほど値を下げさせてもらいました すごく安いと思います。 amazonです
568 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 22:53:48 ] >>568 コピー元と先のサイズが一致してないぞ System::Buffer::BlockCopy あとarray<T>^は初期化されるのが保証されてるからClearはいらない
570 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 00:21:25 ] あとは、pin_ptr 刺して memcpy でいいんじゃないか?
571 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 12:46:11 ] テンプレート使ったときのメモリー処理を超低レベル関数と組み合わせるのって心情的に怖いなぁ
572 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 14:19:21 ] テン・・・プレート・・・だと? array は int[] と書く代わりに array<int> と書いているだけで、メモリの直列性は保証されて いるから問題ない
573 名前:568 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/06/21(日) 22:18:46 ] そもそもGotFocusはコントロール自身がフォーカスを得るときに発生するんであって 現在のアイテムが変更されたときには発生しないんだが?
576 名前:デフォルトの名無しさん [2009/06/22(月) 04:27:56 ] いや現在のアイテムが変更されたときではなく複数のアイテムがあって そのアイテムの選択が変わったときにTextboxの内容を変えたいだけ。
577 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 09:37:30 ] GotFocus 事態は発生してるんだろ? sender のオブジェクトは何が入っているのか、中身を確認すればいいだけじゃね
580 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 11:54:06 ] >>579 GotFocusは他のコントロールから移ってきたときに発生するイベントだって CheckedListBox::SelectedIndexChangedイベント CheckedListBox::Itemsプロパティ CheckedListBox::SelectedIndexプロパティ この辺 SelectedItemを直接変更はNG
581 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 12:33:05 ] 神の焦点?
582 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 14:00:41 ] >580 なるほど。WPFとかだとItemsにLabelを入れてLabelのGotFocusにdelegate食わせれば いけるんじゃね。WinForm の場合も、Object にLabelを放り込んでできないか?
583 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 22:53:15 ] >>580 のイベントを拾うのが一番普通な気がする
584 名前:デフォルトの名無しさん [2009/06/23(火) 06:13:33 ] 118.82.122.42/products/ で使われてるみたいな左にウィンドウの幅が変更可能なTreeViewと 右に別のやつみたいなことをしたいのですがこの構成は何かにはめ込んで 実現されてるのでしょうか?
585 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 10:01:09 ] なんだかこないだから、これの宣伝でもしてるのか? C++/CLIのスレで聞くってことはフォームの範囲で聞いてるのかな。
586 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 12:53:06 ] WinFormの質問なら.NET汎用かVB,C#すれで聞いたほうが早い。 おそらく宣伝だろうね。
587 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 23:34:59 ] リモートホストが何も送ってこないだけじゃね?
589 名前:587 mailto:sage [2009/06/23(火) 23:57:49 ] >>588 1台のPCで複数アプリ間での通信なんです。 Socketを使って確かめたけど、送られてはいるんですよ。
590 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 00:45:58 ] JoinMulticastGroup
591 名前:デフォルトの名無しさん [2009/06/25(木) 22:11:11 ] Form1とForm2のように複数のフォームがある場合での質問です。 Form2で定義したテキストボックスのテキストをForm1でボタンを押したときに変更したいんですが どういう風にすれば違うフォームのオブジェクトを操作できますか?
592 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 22:15:18 ] >>591 >>586
593 名前:デフォルトの名無しさん [2009/06/25(木) 22:17:02 ] winforms以前の問題だ 悪いことは言わん C#からやりなさい
594 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 23:44:21 ] >>591 やり方は幾つか(てか、いくらでも)ある。質問の仕方が悪すぎる。
595 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 11:03:32 ] C++/CLIってやっぱ素のC++は使えない? 例えばポインタとか。
596 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 11:08:19 ] 使えるよ。何でそう思ったの?
597 名前:595 mailto:sage [2009/06/26(金) 11:09:24 ] managed C++だと、素では使えなくて、 unsafeだとか要ったキガス
598 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 11:20:26 ] unsafeってそれC# /clr:safe としない限りは使える。 ただしマネージドオブジェクトに対しては参照を使用する必要がある。
599 名前:595 mailto:sage [2009/06/26(金) 11:25:56 ] つまり、マネージドオブジェクトを参照しない限り、通常のC++プログラムと実行ファイルになるんだ。
600 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 11:40:41 ] >>599 C++/CLIを選択した時点でそうはならんよ。あくまでマネージコード上で実行されるネイティブコードだ。 実行時の構造はObjective-Cあたりとは逆のイメージだな。 てゆーか質問してんのか自分の思い込みに賛同してほしいのかどっちなんだよ。
601 名前:600 mailto:sage [2009/06/26(金) 11:45:43 ] >マネージコード上で実行されるネイティブコード あ、間違えた。C++だけで書いても#pragma unmanaged指定しない限り基本的にマネージコードだった。
602 名前:595 mailto:sage [2009/06/26(金) 11:46:35 ] .NET調査です。 解析系ライブラリはC++なのでC#やVB.NETは_。 今までのC++アプリに.NET混ぜれば良いのかなと思うのですが、 どの部分に.NETを使えば良いのか調査。
603 名前:595 mailto:sage [2009/06/26(金) 11:50:44 ] >C++だけで書いても#pragma unmanaged指定しない限り基本的にマネージコード C++で開発しておいて、.NETバイナリが欲しくなったら、ドットネットコンパイルすればおk?
604 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 11:55:45 ] DLL か COM のラッパー作った方がいいんじゃねぇの?
605 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 12:00:48 ] その用途ならCLRのホスティングだな。ネイティブアプリからCOMで.NETの呼び出し。 CorBindToRuntimeExあたりでググれ。 もうひとつのパターンはネイティブアプリのルーチンをライブラリ化して.NETアプリから呼び出す。 C++/CLIはこれの橋渡しみたいなもんだ。C#+P/Invokeなどでも可能。
606 名前:595 mailto:sage [2009/06/26(金) 13:11:14 ] >ネイティブアプリからCOMで.NETの呼び出し。 解析処理はC++で書かれてるので呼び出す.NETって何だろう? >.NETアプリから呼び出す。 .NETアプリは現状無い。。。
607 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 13:19:19 ] C++で書かれてて、それで使えていて、あえて.NETとMIXしたい理由ってナニ? よくあるのは画面とか入出力を.NETで簡便に作りたいというのが多いけど。
608 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 13:35:39 ] >606 解析処理で使うんだから、あえて処理の実態をC++/CLIで作る必要はないだろ 解析部はDLLかCOMにしておいて、C++/CLIからそれを呼べばいい なんか変な夢を見て、どっかんと大きく変えて失敗した責任をC++/CLIに押しつける羽目に なりそうだな
609 名前:595 mailto:sage [2009/06/26(金) 13:55:12 ] 最近、会社に来る人材派遣系とか中途応募してくる人的に.NET経験者が多いということから、.NETとの関わり方を調査することとなりました。 単純思考でC++&.NETと考えたのですが、”将来○○だから、.NETと折り合いが必須」みたいなビジョンを模索中。 会社的にはITRON系OSを使ってるのでソース共有の観点から、C++をC#に書き変えたくない。
610 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 14:23:02 ] >609 あのさ、正直、あんまりちゃんと領域を考えていないだろ たとえば漏れの知っている例で言うと、解析エンジンをクラウド上に乗せて管理周りやUIを .Net でと言う話とかも聞くよ。だがな、解析エンジンというのはある意味ノウハウの結晶さ 強制的に置き換えても、今までと結果が変わったり、初期依存周りのパラで挙動が 変わったりするさ。そういうことを考えずに、安易に両方できるから C++/CLI とか 手を出したら痛い目に遭うよ まずやるべきことは、既存エンジンに影響が出ないよう、DLLやCOMでラッピングして .Net からインターフェイス経由でやりとりできるよう、エンジン周辺をきれいに設計する ことじゃね?
611 名前:595 mailto:sage [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でしか使えない
613 名前:595 mailto:sage [2009/06/26(金) 18:01:04 ] >C++/CLIはWinでしか使えない そうなんかorz GUIに関しては、C++ Builderでペタペタやってるので、超快適だお
614 名前:デフォルトの名無しさん [2009/06/26(金) 18:30:00 ] ネイティブコードさえ混ぜなければ他の環境で動かないこともないよ ただその場合はそれこそポインタすら使えないのでC#で全部書き直した方がマシなレベル
615 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 18:37:58 ] そんなこと、このスレで言われても。。。
616 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 19:17:45 ] やる気ないのに調査しろと命令されて、仕方なく2chに丸投げした感じだな。
617 名前:デフォルトの名無しさん [2009/06/26(金) 22:26:41 ] なんかたまたま C# のDLLImport を調べてたら・・・ 実は Wikipedia の記事が一番シンプルで わかりやすかった ja.wikipedia.org/wiki/P/Invoke
618 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 22:28:53 ] 地味に誤爆しました
619 名前:デフォルトの名無しさん [2009/07/04(土) 18:24:19 ] C#2008を使い始めました CLIのenum型を一個ずつ追加していくにはどう書いたら いいのでしょうか? 具体的にはRegexOptionsをNoneの状態から追加して いきたいのですが・・。
620 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 18:27:38 ] 質問の意図が読み切れんが、|=
621 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 18:40:44 ] むむ RegexOptions^ Option = gcnew RegexOptions(); Option |= RegexOptions::CultureInvariant; これでコンパイルエラーerror C2676が出てしまいました・・。
622 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 19:14:21 ] なるほど・・。 *Option = *Option | RegexOptions::CultureInvariant; でコンパイル通りました。 ありがとう!
626 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 19:16:18 ] 斜め上だなー……
627 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 21:49:30 ] 2008 でコンパイルした dll とか exe を 2003 のプロジェクトで参照って出来ないよね? 両環境用に作ってやらないとダメかな。。。
630 名前:デフォルトの名無しさん [2009/07/07(火) 23:42:26 ] できるけど必ずしも完全な互換性があるわけではないので 可能なら避けるべき
631 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 23:51:11 ] ん〜。やっぱりそう? プロセス間 I/F のクラスを作ってそれぞれで共用しようと思ったけど、 同じ仕組みのを 2003/2008 別個に作ることにするよ。
632 名前:デフォルトの名無しさん [2009/07/14(火) 04:10:47 ] www.webtech.co.jp/sstudio/pro/img/f_time/f_chart.png の右にあるようなものをC++/CLIで表現したいのですが似たようなものが見付かりませんでした。 何かそれに近いものや組み合わせればいけそうなものがあれば教えていただけますか。
633 名前:デフォルトの名無しさん mailto:sage [2009/07/14(火) 04:29:24 ] 要素の数が多そうだからコントロールを並べるより、 Graphicsで直接書いたほうがいいかも。 C++/CLIはあんまり関係ないな。VBかC#からはじめなよ。
634 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 23:25:44 ] 教えて欲しい。 VS2008 の C++/CLI でメール関連のプログラムを書いているんだけど、 System::Net::Mail::Attachment を使って添付ファイルをつけると、プログラムが 終了するまで添付ファイルに使用したファイルを操作することが出来なくなる。 で、調べて、System::Net::Mail::Attachment は使い終わった後に、Dispose すると ヘルプにもネットの記事にも書かれているようなんだが‥‥コンパイルすると C2039 エラーで そんなメンバはないと怒られる。 エラーメッセージを読むと「代わりにデストラクタと呼べ」とあるので試しに delete してみたら 使用したファイルを普通に操作できるようになった。 マネージ環境では delete はしないモンだと思ってたんだけど、これでいいんだろうか? 期待通りに?動くからいいんだけど。。。
635 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 23:32:08 ] Destructors and Finalizers in Visual C++ に書いてる
636 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 23:37:05 ] C++/CLI では C# のDisposeパターンはデストラクタで実装されている
637 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 23:38:58 ] そんなもんC++/CLIで作るなよ
638 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 23:39:38 ] deleteを直接呼ぶのはDisposeを直接呼ぶのと同じだから避けるべき。 C#ではusingを使うのが常識だけど、C++/CLIで同じことをやるには、 自動変数の形で使うか、それが無理ならauto_handle/auto_gcrootを使う。
639 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 23:51:18 ] delete を・・・直接、呼ぶ? ざわ・・・ざわ・・・
640 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 00:00:31 ] 別におかしくない C#でもDisposeの呼び出しを単独で書くことはしない 絶対にusingを使うかfinallyの中で呼ばないといけない
641 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 00:09:01 ] classのメンバにDispose持ちがいたら普通に単独で呼ぶが
642 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 00:14:34 ] その呼び出しの発端は単独ではないだろ
643 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 00:17:49 ] >>641 でもその場所はどうせデストラクタ・ファイナライザの内部以外に有り得ないでしょ。 それくらいだったらいいと思うけど。 でも、C++/CLIならauto_handleをクラスメンバにできなかったっけ?
644 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 00:23:20 ] でも、単独での呼び出しを書くことがあるというのは事実だよねって話 >>643 そいやC++/CLIってメンバに^付きで書かなきゃメンバのDisposeも勝手に読んでくれるんだよね
645 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 00:24:29 ] ファイナライザでDisposeは絶対ダメ ファイナライザでメンバのマネージオブジェクトにアクセスするのは原則禁止
646 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 00:29:22 ] 誤解を招くなぁそれ。C++/CLIのファイナライザ構文なんて 勝手にDispose呼び出しを生成してんぞ。 引数付きのDisposeパターンを守れってだけでしょ。
647 名前:645 mailto:sage [2009/07/18(土) 00:36:47 ] すまん言葉足らずだった ファイナライザで"メンバの"Disposeはダメ
648 名前:634 mailto:sage [2009/07/18(土) 11:29:44 ] thx こんなに沢山の人がいたんだ。。。 だいぶ慣れたと思ってたけど、まだわかってないことが多いみたい。 もっとお勉強するよ。 今回のは >>638 の auto_gcroot を使ってみようと思う。 >>637 C++ が好きなんだもん。w
649 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 15:01:37 ] auto_handleはマネージクラス・マネージコード内、 auto_gcrootはネイティブクラス・ネイティブコード内で使う。
650 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 15:51:27 ] C++好きなのはいいけど.NETに慣れる意味でも一度はC#やってみたほうがいいよ なぜ本スレでさえアンマネージコードとの相互運用という本来の目的以外での C++/CLIの使用に否定的な人が多いのか理解できるはず
651 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 15:57:56 ] 相互運用ならC++/CLIはいい。もうC#でDllImportする気が起こらない。
652 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 00:02:11 ] clrinterop.codeplex.com/
653 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 00:13:08 ] いや、DllImportさえ簡単に貼り付けられればC#で問題ない、という程度のことではないから。
654 名前:634 mailto:sage [2009/07/19(日) 00:54:11 ] >>649 thx 勘違いして入れ替わってたよ。 auto_gcroot は変数定義した後に代入できるけど、auto_handle は変数定義の時の 初期化でしか代入できないとか、多分、何かの都合があるんだろうけど、面白いね。 >>650 どっちでも一応書ける。 だいたい画面系に C# 、それから呼ぶライブラリ関連に C++/CLI を。(最初にそうお勧めされた) いまいち「目的外での C++/CLI に否定的」ってのがよくわかってないんだけど。。。 感覚的にはわかるような気もするけど、言語として C# の方に抵抗を感じたりして。
655 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 12:12:27 ] >>650 やっぱ、CLIは無意味?
656 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 18:51:25 ] >>655 ブリッジ
657 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 18:56:51 ] ドトネトにブリッジする理由は???
658 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 21:47:10 ] .NET開発の補助として使うものであって、決して 「.NETが使える便利なC++」ではない
659 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 23:02:04 ] 適材適所という言葉があってだな(ry
660 名前:デフォルトの名無しさん [2009/07/22(水) 08:06:27 ] この天気、日食どころじゃねーな。
661 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 09:19:19 ] それ食えるのか?
662 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 10:12:57 ] ドトネト材の適所って何?
663 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 10:35:54 ] Java+JNIと比べるとはるかに優れているな。 だれか、javaVM用のC++/CLI?を作ってくれ。
664 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 10:41:19 ] ハンドルの指すアドレスの最初の4バイトは何のデータですか? 昔.NETを勉強したときに、 オブジェクトヘッダーは同期ブロックインデックスと クラス定義へのポインタで構成されてると 読んだ記憶があるんですが
665 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 12:55:00 ] >>664 知ってどうするんだよ?
666 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 16:56:25 ] おしえて。 フォームアプリのテキストボックスとかにデータバインディングで、 DataTable の要素を関連づけて入力値を管理したい。 ここで、テーブル中のレコードが1つの場合はいいんだが、複数あって かつ、バインドするレコードを動的に変更したい場合ってのはどうすれば いいのだろうか? よくわからなかったので、 ・バインド用に同じ構造のテーブルを用意して ・そこにレコードをひとつだけ作り ・そのレコードに元テーブルの任意のレコードの値をコピーする ・フォーム終了後にもとのテーブルのレコードに値をコピーし直す 方法で使おうとも思ったのだけど、もっと直接的な方法がありそうな気がする。 いかがだろうか。教示いただけると嬉しい。
667 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 17:08:13 ] >>666 ここよりもC#、VB、ADO.NETスレあたりで聞いたほうが早いと思うよ。
668 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 18:06:25 ] そう? じゃ、C# のスレに移動するよ。 thx
669 名前:デフォルトの名無しさん [2009/07/27(月) 23:44:45 ] 質問です。 自転車って制限速度が無いと聞いたことがあります。 一方で、系車両は制限速度30km/hと聞いたことがあります。 自転車に関してはどうなのでしょうか。 自転車に速度計装着の義務付けが無い以上、 制限速度自体、無意味なことだと思うのですが。
670 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 23:50:41 ] 無料で難読化できるソフトはありますか
671 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 00:34:28 ] ある
672 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 10:55:16 ] >>669 軽車両には車両種別による速度制限はありません。標示の制限に従ってください。
673 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 14:57:05 ] C++/CLI的には見られたくないところはネイティブコードで書けばいい
674 名前:デフォルトの名無しさん [2009/08/04(火) 06:16:44 ] PictureBoxの左上を座標(0,0)としてマウスでクリックしたときの PictureBoxの左上からのオフセット座標を取得したいのですが いい方法ありますでしょうか。
675 名前:デフォルトの名無しさん mailto:sage [2009/08/04(火) 06:47:44 ] >>674 取得したいも何も、MouseClickイベントで受ければ MouseEventArgsに入ってるだろ。
676 名前:デフォルトの名無しさん [2009/08/06(木) 06:26:04 ] 質問です。 初期化時にPictureBoxに格子上の線を描画したあと、PictureBox内をクリックした場所に図形を描画したんですけど 再度クリックしたときにその図形を消したい場合は一度RefreshやClearなどをしたあとに格子上の線・図形は再度描画 するしか方法ないですよね。
677 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 06:27:14 ] ___ ←樹海|  ̄|| ̄ ┗(^o^ )┓三 || ┏┗ 三  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
678 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 12:10:44 ] VSのアドインとかでリファクタリングのツール探してみては
681 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 18:06:34 ] ファイル名はファイルのプロパティの名前 クラス名はクラスのプロパティのName 簡単と感じるかは人による
682 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 01:50:23 ] クラスの中に処理は直接書けない。メソッドの中に書く。 エラーを回避とかそういう次元の問題ではないのでまずはC#かC++を一通り勉強するべき。
685 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 02:10:25 ] これからC++/CLIを勉強しようと思うんだけど どんな本読んだらいいのかしら?^^
686 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 02:21:17 ] VisualStudio2008ExpressEditionをイジリ倒す。
687 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 02:24:20 ] C++とC# (またはVB7-)をどのくらい理解してるかでいろいろ違ってくる。 両方まだなら手を出さないほうがいい。
688 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 06:57:30 ] というかC++もC#も両方使いこなせる人にしかC++/CLIを使う意味がないし使う必要もない。
689 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 07:16:52 ] C++はGOF本を読むレベルっす。オブジェクト指向設計も任せてネ★ MFCはまぁそこそこ。ATLはさっぱり。WTLはみたこともない。 C#? なにそれ? マイクロソフトローカルな糞言語になんてまったく興味ねぇんだよっ
690 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 08:07:39 ] C++/CLIのスレで、よくそんなことがいえるな。 C++/CLIがよりいっそうマイクロソフトローカルな糞言語なのを理解しているのか?
691 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 09:37:50 ] 所詮はつぎはぎで緊急避難するときだけ使う補助言語だからな
692 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 10:16:28 ] ワロタ >>689 は自分がどこに書き込んだのかもわかってないのか
693 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 11:20:47 ] 自分は C++/CLI については 実践C++/CLI 極めるための基礎と実用テクニック を読んだだけだな。 あとは C# まで含めてどうとでもなったよ。 ただ。最初のコードを見る限り、基本からわかってないと思うけど。 C++ がどうとかではなくて、プログラミングの基礎からって意味で。 ちゃんと基礎からやった方が、結局は時間の節約になると思う。
694 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 22:41:47 ] つまり、。NETについて学ぶにはまずC#を習得して来い…と。 C#…なぁ。Javaならまだ学ぶ気あるんだけど。 (J++1.0が出た当時にちょろっとかじったから、基本はあるんだよ^^ でも最近はJava5とかいうのらしいから、勉強しなおしかな^o^;) どうせ5年もしないうちに「なかったこと」にされるような言語なんて 学ぶだけ資源の無駄だしなぁ。どうしようかなぁ。ああー。
695 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 22:51:22 ] C#が世に出て既に8年ほどたつが、まだなかったことにはなってないな C++/CLIのほうがよほど…
696 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 23:00:41 ] これって何に使うの? C++Builderの代わり?
697 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 23:15:50 ] てか、基礎のある人間なら、わざわざ覚えるってほどのモンでもないだろ。 MFC わかるんだよね?
698 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 23:20:23 ] J++のWFC、delegate、J/Directを理解してるならそれはそれですごいな。 delegateはC#のとも一味違うぞ。
699 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 06:41:25 ] C#やったことなくてもC++/CLIは使えるかもしれないけど C#で.NETの流儀に慣れてないと.NET的にはとんでもないコードが確実に出来上がる
700 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 12:49:28 ] >>699 慣れてないせいか、Disposeルールが なんか気持ち悪い。
701 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 16:13:03 ] >>700 あれはネイティブなC++でいうところの単なるデストラクタなんだが……
702 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 19:24:05 ] そう思っているなら確実に >.NET的にはとんでもないコード を書いてるな。
703 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 21:04:58 ] MFCのDLLがあってCLIでラップしてVB.NetとC#で利用しようとしてるんですが unsigned char *の配列データを受け渡しするところがあって VB.NetだとこれはByte()になるんだろうけどどういう変換すればいいのでしょう? Byte()の引数ってCLI側での表記方法も分からないし
704 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:25:20 ] いえ、画像データなんで本当にバイト列が必要なんです
706 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:25:55 ] バイナリデータであるByte()やbyte[]を渡したいだけかもしれないぞ。 もしそうなら、cli::array<System::Byte>^型が対応するのでこれを使えばいいだけ。 自分はcli::array<unsigned char>^と書く方が好みだがまあどっちでも同じ。
707 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:54:02 ] cli::array< Byte >^ と Byte[] は同じ型だよ。 言語による表現の違いなだけ。 うまくいかないって、どんなエラーなわけ?
710 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 22:56:11 ] エラーというかキャストの仕方が分からない
711 名前:707 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:01:19 ] >>711 GetDataは元がunsinged char *なんで それごどうにかしてarray<Byte>^にしないといけないんですが
713 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:06:34 ] 仮にarray<Byte>^にして渡した後ってVBのガーベージコレクタに殺されたりする? それはまずいな
714 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:09:10 ] ということはVB->DLLの方向の時だけByte[]で受け取って DLL->VBの時はラッパーDLLでアクセスを仲介するような関数を容易するべき? 例えばWriteByteみたいな関数を入れてDLLの保持してるメモリはVBでは触れないようにした方がいいの?
715 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:12:05 ] managed側のメモリはpinすればunmanaged側でいじれるが、 逆は出来ないんじゃないかなぁ。 基本はコピーになるはず。 unmanaged側でメモリを保持して、managedにはハンドルやクラスの形で 渡してやるのがセオリーだと思うよ。
716 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:13:32 ] なんかdllの仕様まで変更できるような話になってるが
717 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:20:04 ] メモリへのポインタを渡したいのか、ただデータを入れた配列を渡せればいいのかわかんね。 キャストの仕方っても、どんなところでなにをやろうとしてるのかわかんね。 dynamic_cast とかをキーワードにして調べてみたら? 自分で。
718 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:23:42 ] >>715 じゃあGetDataの部分はIntPtrを返してVB側でMarshal.ReadByteするのが適切? >>716 CLIのラップDLLはGCの影響は受けないでしょ >>717 ポインタを渡して中身を双方で共有して直接いじりたい メモリは確保した方が解放するというのがルール
719 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 23:30:55 ] そう。 byte[](マネージバイト配列)ってのはマネージヒープに確保 されてそこにあるやつ。アンマネージで勝手に確保した なぞの領域にあるところをさしたポインタってやつはそうじゃ ないから当然変換できないしコピーするしかない。 マネージにあるやつのポインタ化(pin_ptr) は可能だが、逆は 無理。 結局シームレスにいじりたい領域はマネージ側で確保して やるしかない。アンマネージポインタしかないんなら、コピーとか マーシャリングとかしかない。 CLS 非準拠だと CLI は一応 T* みたいな形式も持ち運べは するんだけどな。準拠させるためには IntPtr とかのやり取りと なる。 …VB じゃなく C# ならそのポインタシームレスに使えるのだがな。
720 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 00:12:20 ] とりあえずラップDLLに読み書き専用の関数を持たせることで解決しました
721 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 15:02:46 ] Vec3::X::get
723 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 15:10:32 ] そこかぁあああああああ!!! ありがとう!!
724 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 15:14:58 ] インテリセンスに出ると思うんだがな
725 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 15:18:17 ] ところがどっこい出なかった
726 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 17:44:34 ] CLRでも<summary>指定したらインテリセンスにでまつか?
727 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 19:23:04 ] CLRが何だと思ってるのか詳しく聞かせてもらいたいな
728 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 06:51:20 ] 中でリフレクション使ってるんだからできるわけがない マネージクラスでプロパティとしてラップする
730 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 09:06:34 ] C++/CLIでも<summary>指定したらインテリセンスにでまつか?
731 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 09:20:42 ] 出るよ
732 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 09:29:31 ] /// <summary> /// クラス解説 /// </summary> public ref class Test って書いたら <summary> クラス解説 </summary> って出た。<summary>消したら クラス解説 って出た。なんか違うかな・・・
733 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 14:50:40 ] XMLドキュメントを出力するオプションは有効になってる?
734 名前:デフォルトの名無しさん mailto:sage [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 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 12:40:23 ] &はいらん ^の意味解ってる?
737 名前:735 [2009/08/30(日) 12:50:37 ] >>736 確か似そうでした。 で、&を外してみたところ error C2440: '=' : 'startCallback ^' から 'void (__clrcall *)(void)' に変換できません。 とかいうエラーが・・・。 どういう意味なのでしょう?
738 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 13:06:42 ] デリゲートと関数ポインタは別物だから。
739 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 16:30:32 ] >>735 fnやstartがどう定義されているか見えないけど、 fn = start でいいでない?
740 名前:735 [2009/08/30(日) 17:37:50 ] fn=start だと error C3867: 'start': 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&start' を使用してください となって、fn=&startとすると737 のエラーとなるという。 fnもstartも同じ型でvoid (*dsfunctions::start)(void)なのだが、 c++/CLIだとだめらしい。 関数ポインタを渡したいだけなんですがどうしたもんでしょう?
741 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 18:03:47 ] もしかして、スタティックでない関数をその書式で使用しようとしてない? ちがうなら、下みたいにすべきじゃね? cb_start = gcnew startCallback( [startメンバを含むクラスインスタンス], start );
742 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 18:07:28 ] 生のC++でもクラスのメンバ関数というか仮想関数の関数ポインタはカオスだからなぁ。
743 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/08/31(月) 01:47:06 ] ^は「へ」って読むんだぞ
746 名前:デフォルトの名無しさん mailto:sage [2009/08/31(月) 01:47:31 ] へー
747 名前:デフォルトの名無しさん mailto:sage [2009/08/31(月) 10:30:09 ] 実践C++/CLI 極めるための基礎と実用テクニック アマゾンに入荷したね
748 名前:デフォルトの名無しさん mailto:sage [2009/08/31(月) 20:52:39 ] え。出品者からお求めいただけます、じゃなくて?
749 名前:デフォルトの名無しさん mailto:sage [2009/09/01(火) 03:42:45 ] うん。昨日見たときアマゾン新ピンが2800円ぐらいで売ってた 今見たら終わってたw
750 名前:デフォルトの名無しさん mailto:sage [2009/09/01(火) 14:33:06 ] ていうかアマの技術書は一度の入荷数が少ない 近くの書店で取り寄せすればすぐだ
751 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 00:29:13 ] 自分が確認したときにはすでになかったから、釣りかと思ったわ。 情報ありがとう。普通に取り寄せてみるよ。
752 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 01:18:30 ] 適切なクラス作って静的メンバにするのが.NETのやり方
754 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 01:33:56 ] そうなんですか!! ありがとう。 C++のころは、cppで使いまわすだけの定数をヘッダーに追加すると、 結構、コンパイルに時間がかかったので、無名名前空間に押さえ込んでました。 あ、そういえば自動生成されるコードもCLIは全部、ヘッダーに展開されますね。 無名空間はだめで、静的メンバであればOKってのが理解できないので、 ちょっくらテストしてきます。 注意点とかあれば教えていただけますか?
755 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 03:23:27 ] >>754 なんか分かってなさそうなので念のために言っておくけど、 適切なクラスというのはref classのことだぞ。
756 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 08:44:54 ] >754 const は String^ にはつけられないから literal 使え
757 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 15:51:30 ] initonlyも忘れないで。外へ公開するメンバなら特に。
758 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 18:24:19 ] initonly と literal はアセンブリ化したときの文字列確定のタイミングが違うから気をつけろ
759 名前:デフォルトの名無しさん mailto:sage [2009/09/02(水) 22:48:46 ] やば。initonly を完璧に忘れてた。。。
760 名前:754です。 mailto:sage [2009/09/04(金) 19:08:41 ] ありがとうございます。 準備した参考書では、literalもinitonlyも明記がなかったので、なかなかできませんでしたが、 ようやくテストできました。(結果もOKでした。) ただ、literal と static const の違いだけが分かりませんでした。 どちらも同じ結果になるので・・・。 CLIで追加された宣言なので、literalを使えば良いのかな? それにしても、CLIの情報は探すのが大変ですね・・・。みなさんはどうしてますか?(どうやって覚えました?)
761 名前:デフォルトの名無しさん mailto:sage [2009/09/04(金) 20:26:10 ] >760 String^ は追跡参照なのでポインタのようにアドレスが一定ではない。だから、const 指定できない。(const が有効だとGCがString^を移動できない)その代わりに literal が あると思っていい
762 名前:デフォルトの名無しさん mailto:sage [2009/09/04(金) 20:38:18 ] literalって単なるアセンブリのメタデータだし
763 名前:デフォルトの名無しさん [2009/09/13(日) 01:12:57 ] >>879 パレスチナ問題って深刻だね。
764 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 04:02:10 ] C++/PLO うむ、一文字しかあってない
765 名前:デフォルトの名無しさん mailto:sage [2009/09/14(月) 19:53:24 ] pin_ptrのようにオブジェクトの移動を制限する方法って他にないでしょうか スコープを抜けてもずっと固定していたいんですが
766 名前:デフォルトの名無しさん mailto:sage [2009/09/14(月) 20:02:36 ] GCHandleを割り当てる
767 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 22:06:03 ] C++からの移植で下位のような変換を行ってみました。 clss NameHolder { NamaInfo _Name; public: NamaInfo getNameInfo(); } ref clss NameHolder { NamaInfo^ _Name; public: NamaInfo^ getNameInfo(); }
768 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 23:09:46 ] value class使え
770 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 02:08:28 ] 実体コピーしなきゃ結局他でNameInfo変更したときに影響するだろ…
772 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 02:23:39 ] 便乗ですまない >>770 の(1)はマネージでないとダメで、(2)はアンマネージでないとダメだと 思っていたんだけど、両方とも許される状況っていうのはあるもんなの?
773 名前:772 mailto:sage [2009/09/17(木) 02:37:45 ] value classだと(2)は問題なく参照となり、 (1)はボクシングが行われた上で、ハンドルを取得できる、と考えたけどあってるのかなぁ。 難しいなぁ
774 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 02:49:44 ] メンバがいつの間にかハンドルじゃなくなったな
776 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 03:05:00 ] NameInfo^ _Name; これに変更。 NameHolder() { _Name = gcnew NameInfo(); } これ追加 してやって見ました。結果は同じでした。C++からハンドルが一つ増えただけで、こんなにも苦労するとは・・・・
777 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 03:10:40 ] もとのC++の記述と同じようにかきゃいいと思うけどな value classならほぼ変わらんし 移植って時点で思想とか意味ないだろうし
778 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 03:19:20 ] 元のコードにあわせてハンドルじゃなくしたのかと思ったけど、あっさりハンドルに戻すとか ほんとに移植しようとしてるのかが疑問
779 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 04:03:11 ] >>779 横からごめん > 他言語で使えないのでconstは削除 というのはどういうこと?
781 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 04:20:29 ] >>780 C#などからそのメソッドを呼ぶ場合、あたかもconstはなかったかのように無視される。 そのため、自分はC++/CLIは他言語から呼び出すことを前提に使っているので、 C++/CLIの段階でpublicな型のpublicなメソッドの引数・戻り値にはconstを付けようと思わないというだけのこと。 つまり、これは自分1人の考えなんで、気にせずconst使うという人も中にはいると思う。
782 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 04:29:23 ] >>781 なるほど。勉強になりました。
783 名前:774です。 mailto:sage [2009/09/17(木) 04:39:15 ] いろいろとありがとうございます。 先輩にきいて、値を保持したいのであれば、このクラスを移植すれば良いとともらったソースを移植中です。 中身を見ると、シングルトン形式で値を保持しているようです。 C++であれば const NameInfo& Name なので、const NameInfo% Name にしたらコンパイラ君に怒られて パニックになってしまいました。 C++の時は、メンバー関数の後ろをはじめ、constをつけるように、強く教育を受けたので、CLIでもかんばって つけようとするとことごとく怒られて・・・・。 NameInfo という値で渡すのがよさそうなので、これでいって見ようかと・・・。 教えていただいた 機械方式 NameInfo% にしたいですが、先輩に % は関数内で値を変えるとき意外は使うなといわれて・・・。 くそー 何でconst NameInfo% て読み取り専用にできないだよ!!!!
784 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 07:46:38 ] constが付いていたら、自動生成した読み取り専用ラッパーに包んで返す。 ……とかどうなんだろう。やっぱ駄目かなあ。
785 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 08:47:15 ] プロパティでgetterのみにすればいいんじゃないか?
786 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 10:14:48 ] 値型^って普通使わないよ 一番効率悪いし他の言語では全く使えない
787 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 23:24:35 ] String型だけなんで^なしで宣言出来ないんだろう… あとshortの列挙型に-32768が使えないのもわからん C#なら通るのに
788 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 23:27:32 ] String型がcharの配列なので。 shortの-32768(全ビットon)は未定義値の代わりなので。
789 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 23:38:51 ] 即レスありがとう Stringの内部構造までは見たんだけど、つまりC++/CLIでは配列はスタックに作れないってことなのかな
790 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 04:34:30 ] 動的にサイズを変えられるんだからヒープまたはマネージドヒープと考えるのが妥当なんじゃないの
791 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 07:45:38 ] ^なしに記述しているのだって、別にスタックに配置している訳じゃないし
792 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 15:44:34 ] String型だけなんで^なしで宣言出来ないんだろう… ref class だから
793 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 00:51:52 ] C++のRAIIパターンでDispose持ちの参照型を扱おうって意図だから 参照型でもこれはOKなんよ。 実際はDisposeのシグネチャを持ってる必要もないんだが。 ただ何故かStringとarrayは宣言できんのね。
794 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 00:13:56 ] deleteしたオブジェクトのファイナライザって呼ばれないの? C++/CLIのデストラクタ=C#のDisposeだと思ってたんだけど
795 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 00:31:17 ] C#でもDisposeしたときはGC.SuppressFinalizeでファイナライザの呼び出しを抑制するが?
796 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 11:24:38 ] ファイナライザの呼び出しが有効になってるとGCのパフォーマンスに悪影響を与える。 明示的にDisposeが行われた後はファイナライザ呼び出しは不要なはずなので ファイナライザを呼び出さないようにGCに指示するようになってる。 アンマネージリソースを直接持ってない限りはファイナライザ(!の方)は定義しない方がよい。
797 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 17:58:20 ] CLI一切関係ないな 仮引数が配列表記でも実際はポインタとして渡される
800 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 18:15:42 ] >>799 >CLI一切関係ないな 失礼しました。 void test(int x[]) が void test(int* x)として解釈されるという事ですね。 誘導元のほうでも親切な方が教えてくれました。 ありがとうございます。
801 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 02:32:29 ] ハンドル使ってるから脊髄反射したんだろう
802 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 10:42:48 ] reinterpret_cast<Int32*>(&b)
806 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 11:00:48 ] つーかその例でそのエラー出るか?
807 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 12:29:34 ] >>804 pin_ptr<int> p = &b; func(p);
808 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 13:03:52 ] >>804 int bがref classのメンバーなのかな。ローカル変数だったら出ないだろ。
809 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 13:24:52 ] C++/CLIの仕様書ってある? C++で言うとISO/IEC 14882:2003みたいな奴 それがあれば簡単な質問ぐらいならC++スレでレスしてやってもよい
810 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 13:25:46 ] 仕様書じゃなくて規格票だったorz
811 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 14:14:27 ] ぐぐるかecma行って372見てこい
812 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 14:33:33 ] blogs.wankuma.com/episteme/archive/2006/09/12/38394.aspx だめじゃんISO規格じゃない まあecmaのを参考にするか
813 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 15:50:25 ] >だめじゃんISO規格じゃない これが言いたかったのか(笑
814 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 03:21:26 ] IETF > Ecma > ISO
815 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 10:19:51 ] 日本の車もウインカーレバーが右で、ISO規格と違うからな。 イギリスは右ハンドルでもISO通りに左なのに。
816 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 15:25:50 ] 要するにISOってオナニー規格か
817 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 18:48:03 ] そういえばC#のコンパイラの言語バージョンを選ぶオプションは ISO3.0みたいな表記だったな
818 名前:デフォルトの名無しさん [2009/10/14(水) 09:55:30 ] 現在自民党が民主党を批判していること、 おまえが言うか、とあきれている。
819 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 11:20:17 ] ヤトウの仕事だから。
820 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 19:29:43 ] >>818 今まで民主党が批判してた事を民主党がやったりもするわけですよ ヨトウになるとはそういうこと
821 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 22:39:15 ] >>818 スレタイを読めないおまえが言うか、とあきれている。
822 名前:デフォルトの名無しさん mailto:sage [2009/10/15(木) 18:55:56 ] Side-by-sideでexe作ろうとしてるけど M$っていろんな意味で終わってるなw 保険屋の仕事を作るようにしてあるシステムと同じだろこれw 仕事にしてる奴らは悲惨だろうな。 後には何も残らん。
823 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 09:54:36 ] ほんとにわかってないのか、これなのかはソース見せてもらわないと判断できないが・・・ ttp://msdn.microsoft.com/ja-jp/library/b0x1aatf(VS.80).aspx
826 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 18:14:59 ] 1.0系でとりあえず行くのかと思ったらいきなり2.0かよw
828 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 18:34:30 ] 6月の時点で2.0ベータが出てただろ
829 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/11/30(月) 21:42:40 ] > 各ノードの子が存在するかを調べてチェックする これで十分すっきりすると思うが 再帰を知らないとか言うのか?
832 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 16:21:58 ] どなたかくだすれスレを立ててくだすれ
833 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 16:33:42 ] こんだけ過疎ってんだから無駄だろ 聞きたきゃここで聞けばいい
834 名前:デフォルトの名無しさん mailto:sage [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); }
835 名前:834 mailto:sage [2009/12/12(土) 02:26:25 ] 開発環境を書くのを忘れてました。 WindowsXP SP3 Visual Stadio 2010 Beta2 です。
836 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 02:34:25 ] C++/CLIでわざわざDllImport?
837 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 08:08:41 ] /clr:safe なのでは
838 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 08:25:36 ] WritePrivateProfileStringの引数がなんでGetPrivateProfileStringと同じなんだよ。 MSDNをみろよ。 BOOL WritePrivateProfileString( LPCTSTR lpAppName, // セクション名 LPCTSTR lpKeyName, // キー名 LPCTSTR lpString, // 追加するべき文字列 LPCTSTR lpFileName // .ini ファイル ); >>833 の手前初心者スレに池とはいえんな(笑
839 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 13:48:26 ] 初心者スレではCLIスレへ池と言われ CLIスレでは初心者スレへ池と言われ・・・
840 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 18:28:17 ] >>833 斬新だな
841 名前:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 21:21:48 ] >>841 Conditional属性ついてるから、その認識で間違ってないはずだが
843 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 21:25:27 ] Trace::Listeners Debug::Listeners は同じコレクションをポイントしていて、片方を変更すればもう片方も変更になる。
844 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 21:48:40 ] >>843 そういう問題じゃないだろ
845 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 21:52:12 ] >>841-842 C++/CLIではC#やVB.NEtのようにConditionalAttributeを認識しないから、 自分で#ifdef使って、呼び出しを消す必要がある
846 名前:841 mailto:sage [2009/12/13(日) 01:26:19 ] >>845 ConditionalAttributeを認識しない・・・んですね。 初耳です。勉強になりました。 >自分で#ifdef使って、呼び出しを消す必要がある とても面倒ですね。自前のDEBUG関数を定義して、 それでまとめて処理させるべきなんでしょうかね。
847 名前:834 mailto:sage [2009/12/13(日) 02:10:44 ] >>838 遅くなってすいません。 無事にできました、ありがとうございます。
848 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 09:22:00 ] >>846 関数を使わなくても、#define でいいじゃないか #ifdef DEBUG #define DEBUGOUT Trace::〜 #else #define DEBUGOUT #endif
849 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 09:28:22 ] >>846 ちなみに、.NET2からは(Debug|Trace)::WriteLineよりはTraceSourceを使う方がいいことになってる
850 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 06:08:01 ] とりあえず、これで動いてる。どこかで下手打ってるのだろう。 ソースをさらせ。 public ref class MyToolStrip : System::Windows::Forms::ToolStrip { };
852 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 06:10:35 ] コンストラクタで例外投げてるとかじゃね
853 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 08:35:33 ] これはC#でも同じだが、Controlのコンストラクタに副作用があると デザーなーの表示に失敗することがあるよ。
854 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 11:47:21 ] まあそういう場合は、親がデザイナかどうか判定して挙動を変える必要があるわな
855 名前:850 mailto:sage [2009/12/16(水) 22:16:49 ] プロジェクトをWindowsフォームで新規作成して、 >>851 のクラスを定義した所、問題無くツールボックスの中にMyToolStripが現れ、 フォームに貼り付けできました。 プロジェクトのランタイムプロパティが 「純粋 MSIL 共通言語ランタイム サポート (/clr:pure)」の場合問題ありませんが、 当方「共通言語ランタイム サポート (/clr)」で開発をしており、 その場合、850で書いたような状況になります。ノートPCのサブ開発環境でも 再現するので、再現性はあります。 皆さんの所では問題ありませんか?
856 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 22:18:00 ] 知るか 再現云々言うんだったらまずソースを出せ
857 名前:850 mailto:sage [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;
858 名前:850 mailto:sage [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: ここにコンストラクタ コードを追加します // }
859 名前:850 mailto:sage [2009/12/16(水) 22:33:28 ] Form1.hの続き protected: /// <summary> /// 使用中のリソースをすべてクリーンアップします。 /// </summary> ~Form1() { if (components) { delete components; } } private: /// <summary> /// 必要なデザイナ変数です。 /// </summary> System::ComponentModel::Container ^components;
860 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 10:41:25 ] だらだらコピペするんじゃなくて、再現する最小限のソースを作って貼るんだよ
862 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 12:30:50 ] >>861 最小限を貼っているようにしか見えないが。
863 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 13:33:13 ] // //TODO: ここにコンストラクタ コードを追加します //
864 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 13:34:51 ] つーかここでいう最小限は天順とtest.hを貼ればいいだけじゃないかw
865 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 13:35:17 ] 天順→手順
866 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 13:37:25 ] 何で貼るのかというと、レスをみた人が追試するためにはるんで そもそも見る気失せるような書き方しちゃ手伝ってくれる人が減るだけだな。
867 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 13:39:45 ] >プロジェクトのプロパティでランタイムを共通言語ランタイム サポート (/clr)に変更して ソースが見当たらないが。IDEの制限だったような。pureじゃだめなん?
868 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 17:14:42 ] MyToolStripにpublicついてねぇぞ
869 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 17:42:56 ] >>868 refクラスではpublicを付けても付けなくてもpublic継承になる。 msdn.microsoft.com/ja-jp/library/ms235220.aspx
870 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 19:53:29 ] そもそもデザイナってILONLYじゃないアセンブリ読み込めたっけ
871 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 20:29:01 ] とりあえずソリューション内に別プロジェクトを作って、 そっちにMyToolStripを作って、メインプロジェクトから参照すれば、 /clr /clr:pure とどちらでもいけた。
872 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 02:57:12 ] >>850 の問題とは関係ないかも知れないが、 自分もデザイナが見れないエラーに悩まされ、さっき解決したから載せとく。 (12).ToString(); 上記のように、ToStringに直値指定するとデザイナが見れなくなる。 コンパイルも通り、実行もちゃんと反映されてるから、見つけるの苦労した
873 名前:872 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 18:04:35 ] どっちも型名の直後につけるかな。 アンマネージでは変数の方につける人が多いみたいだけど、 ポインタ型っていう型名だから、変数の側につけるのには違和感があるんだ。
876 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 21:33:01 ] なんかCLIやってる人って可哀想だね
879 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 21:53:43 ] C/C++の構文がおかしいだけで意味上はポインタ型 不自然なのは誰の目にも明らかだからわざわざC#では変えたんだろ どっちでもいいけどマネージとアンマネージで変えたりせずにどっちかに統一するべき
880 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 22:33:26 ] 「つもり」は「意味」にならんだろ
881 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 23:18:54 ] ならんだろうね
882 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 00:11:42 ] あの記法でポインタを表そうとすると、 関数ポインタ型を表す場合、型の方に*をつけることは出来ないので、 変数の方に*をつけてポインタを表すというのは一定の合理性がある。
883 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 02:07:27 ] 一定の合理性があるな。
884 名前:デフォルトの名無しさん [2010/01/02(土) 10:56:36 ] CLIでcallocするとどうなるの?
885 名前:デフォルトの名無しさん mailto:sage [2010/01/02(土) 11:50:26 ] 普通にアンマネージヒープが割り当てられるだけ
886 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 18:49:18 ] 当初VB.netで作った業務アプリをVC++/CLIに移植したのですが、 実行速度もメモリ使用量も違いがあるようには思えず、 WinXPだとVC++のランタイムが別途必要になった分、劣化したような気にすらなるのですが、 VC++/CLIの利点って、上達すれば業務アプリでもあるものなのでしょうか?
887 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 19:19:16 ] ない 既存のアンマネージコードをマネージコードと混ぜるためだけに仕方なく使う言語 その場合も使用範囲は最小限に留めて,できるだけVBやC#で書くようにするのが正しい
888 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 20:26:51 ] gcnewをなめるなよ
889 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 20:49:08 ] MS自身ですら避けてるからな マネージからアンマネージ→DllImport アンマネージからマネージ→CLRのホスティング
890 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 22:27:46 ] XNAくらいだっけ、MS製で使ってるの
891 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 21:01:42 ] CLI 使ってる時点で速さが変わらないのは当たり前 アンマネージドコードを利用しないと速くなる訳が無い
892 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 22:16:08 ] 新規にアンマネージコード書くなら普通のネイティブなDLLとして作ってC#からDllImportする形の方が扱いやすい
893 名前:デフォルトの名無しさん mailto:sage [2010/01/07(木) 20:22:39 ] XNAってなんで早く動くの?
894 名前:デフォルトの名無しさん mailto:sage [2010/01/07(木) 21:01:54 ] ゲームってDirect3Dに描画命令を送ってからの内部の処理が重くてボトルネックになるので C++/CLIを挟もうがゲームロジックがマネージコードで書かれてようがあんまりパフォーマンスに影響しない
895 名前:デフォルトの名無しさん [2010/01/15(金) 20:33:57 ] ネイティブのアプリケーションがプラグインに飛ばしてくるコールバックを拾って、 それをC#に渡して処理するアプリケーションを書きたいのですが、 その辺のノウハウについてまとまっている情報源をご存知の方はいませんか?
896 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 20:47:27 ] イベントかインターフェイス経由でC#にそのまま流せばいいだけでしょ 全く悩むところなんかない
897 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 21:00:14 ] >>896 C++/CLIで書いたコードって、普通にやるとマネージコードにコンパイルされると 思っていたのですが、ネイティブから呼ばれても大丈夫なのでしょうか。
898 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 21:05:35 ] /clr なら相互に呼び出し可 /clr:pure の場合、マネージドコードからネイティブ方向の呼び出しは可 /clr:safe の場合、不可、ただしP/Invokeは可能。 Win32APIのコールバックを直接C#で処理したいなら、 特殊なものでなければ、P/Invoke+Delegateで対応可能。
899 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 21:11:21 ] 最悪COM経由でどうとでもなる
900 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 21:20:41 ] >>898 分かりやすい解説感謝します。 そういうことなら、普通にアプリ指定のコールバック関数を定義して、 そこからC#のコードを呼べばよさそうですね。ありがとうございます。
901 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 23:03:11 ] ゲームでCOM経由はどうなんだろう DllImport、P/Invoke+Delegate とは違うんだよね どんな時に使うんだろう…どう使い分けるのかの時点で悩みそうだ…
903 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 23:18:09 ] >>901 そんな使い方するのがおかしい。 C++/CLIでアンマネージドとマネージドを混ぜたら、あとはマネージド側から使うだけ。
904 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 23:42:18 ] VC2003ってことはManaged C++か
906 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 00:13:38 ] >>904 developer.apple.com/jp/technotes/tn2007/tn2185.html#TNTAG7 ameblo.jp/woooh-p/entry-10037990751.html 調べてみた。部分的なら書き換えおkだけど 標準部分の書きかえはそれなりに茨の道な気がする…
908 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 16:54:28 ] Application::Run(gcnew hoge::hogeForm());
910 名前:>>901 mailto:sage [2010/01/16(土) 18:05:57 ] >>903-907 のみなさま、ありがとうございます。 特に >>906 さん。なんとなくわかってはいたのですが、言葉できっちり表現がされていて助かります。 >>904 さんの方法も試した上で、週明けに改めて説明を行って対応方法を変更する方向で動きます。
911 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 19:44:08 ] >>908 (gcnew hoge::hogeForm())->Show(); じゃフォームのハンドルを押さえているヤツが居ないな
912 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 22:48:45 ] Formは表示中GCの対象外になるようになってる
913 名前:908 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 05:09:13 ] >>913 Init()を呼び出す。 フォームが表示される。 フォームを表示したままinit()が終了して呼び出し元に戻ってくる。 というのを期待しているとかしてないよね?
915 名前:908 mailto:sage [2010/01/17(日) 05:15:53 ] >>914 フォームが表示されることは期待しています。 上のコードでは、フォームを終了しない限り、処理が呼び出し元に返ってくることは期待してません。
916 名前:デフォルトの名無しさん mailto:sage [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
917 名前:908 mailto:sage [2010/01/17(日) 18:35:12 ] >>916 同等の物を書いてみましたが、確かに動作しています。 呼び出し方法やら何やら、片っ端から確認していって、原因を特定しようと思います。 どうもありがとうございます。
918 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 22:05:10 ] 汎用的なDLLでいきなりApplication::Runとかされたらヤだな
919 名前:デフォルトの名無しさん [2010/01/21(木) 22:57:19 ] 質問ですが、 タイトルバーがなく3Dの縁があるフォームを作るには どうすればいいのでしょうか。 環境はVC++2008です。 フォームのプロパティ設定の中には見つかりませんでした。
920 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 00:10:35 ] C# タイトルバー 消す とかでググれば一発 調べても分からない場合でもそういう質問はC#かVBスレでしたほうがいい
921 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 21:52:51 ] >>920 なるほど、.NETなら共通なんですね。 わかりました、ありがとうございます!
922 名前:デフォルトの名無しさん [2010/01/23(土) 11:53:50 ] Visual Stuidion C++ 2008での書き方を教えて。 フォームクラスだと、イベント関数とかすべてヘッダの方に生成されるけど、 独自メソッドもすべてヘッダーの方に書くものなの? それともプライベート関数はcppの方に書くとかルールがあるの?
923 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 16:01:29 ] 俺はヘッダは宣言のみにして、ソースファイルに定義。プロパティも同じ。 全部ヘッダに書いて、cpp削除でもいいんじゃね?w
924 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2010/01/26(火) 00:13:34 ] >>926 >>1
928 名前:デフォルトの名無しさん mailto:sage [2010/01/26(火) 00:23:02 ] スレチですね 失礼します
929 名前:デフォルトの名無しさん mailto:sage [2010/01/26(火) 00:26:06 ] >>928 は >>926 のことです
930 名前:デフォルトの名無しさん [2010/01/26(火) 22:01:38 ] VC++ 2008 ExpressEdition で Form::Controlクラスを継承した独自コントロールクラスに 枠をつけるにはどうすればいいのでしょうか? プロパティ設定には境界線の項目がありません。 それらしきメソッドも見当たりません。誰か知っていたら教えてください。
931 名前:デフォルトの名無しさん mailto:sage [2010/01/26(火) 22:06:43 ] >>930 ほい。 uchukamen.com/Programming1/Attributes/index.htm
932 名前:デフォルトの名無しさん mailto:sage [2010/01/26(火) 22:14:16 ] >>930 VisualStyleRenderer使って自前で描画する プロパティも自分で実装する あと>>920 の3行目
933 名前:デフォルトの名無しさん mailto:sage [2010/01/26(火) 22:19:28 ] 要するに、 コモンコントロールのそれぞれは自前で描画していたんですね。。 良く分かりました、ありがとうございます。
934 名前:デフォルトの名無しさん mailto:sage [2010/01/26(火) 22:23:25 ] >>933 Windowsで動作するほぼ全てのウィジェットレンダラーは Win32GDIをまとめ直したものに過ぎないんだが、 最近の人はWin32APIで直接アプリを作ったりする経験がないから自前で描画する、という感覚がつかみにくいのかもしれんねぇ。 それはそうと、コントロール描画くらいならC#で実装した方が簡単だよ。
935 名前:デフォルトの名無しさん mailto:sage [2010/01/26(火) 22:30:26 ] >>934 動作のコアとなる部分がC++で作ってあって、DLLとしてまとめてあるんだけど、 GUI側をC#で作るとなると、呼び出すのに定義作り直すのがめんどうで、 どうしてもこの言語に手を出さざるをえないのよね。
936 名前:デフォルトの名無しさん mailto:sage [2010/01/26(火) 22:32:56 ] >>935 ええー。今時、WindowsでGUIを書くのにC++を使うなんて、マゾとしか思えん。 逆ならわかるがねぇ。 GUIをC#で書いてモデルや下回りをC++でってなら。
937 名前:932 mailto:sage [2010/01/26(火) 22:36:49 ] すまん枠描くのはControlPaintだった よっぽど深い相互運用しない限りはexport/DllImportの手間を差し引いてもC#の方が楽だし 安全だし取り回ししやすいよ
938 名前:935 mailto:sage [2010/01/26(火) 22:44:13 ] >>936-937 むう、再検討します。
939 名前:デフォルトの名無しさん mailto:sage [2010/01/26(火) 22:58:32 ] いわゆる普通の ウィンドウ枠は WS_BORDER だぞと。 普通は CreateParams オーバーライドして Style プロパティに WS_BORDER のビットフラグ立てたのにするだけ。 3D 枠とかも基本は一緒な
940 名前:デフォルトの名無しさん mailto:sage [2010/01/26(火) 23:04:22 ] いやWindowsネイティブのコントロールに対応しない独自描画のカスタムコントロールの場合は 枠も自分で描くべき 標準のコントロールもそうなってる
941 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 10:27:29 ] そもそもコモンコントロールだってただの画像だしな
942 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 00:20:52 ] C++/CLI と C# embedded C++ どっちがいい?
943 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 00:48:20 ] 3択な上に比較対象がおかしい。
944 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 02:04:59 ] 何がしたいのかも判らんのに「どれがいい」も糞もないけどな。 WM (CE) の話で C++/CLI or C# or eVC++ のどれか、っていうなら …いや、やっぱり好きにしろとしか言えないw
945 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 02:46:25 ] (C++ in C#) の意味では?
946 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 09:39:46 ] >>942-943 ワロw
947 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 03:31:10 ] これからはC++0x/CLIの時代だろ
948 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 05:14:01 ] 敵はObjective-C++0xだな
949 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 06:53:39 ] 今までC++とC#ばかりいじくっていたが、Google様にお伺いを立てると 実行速度は C++ > C++/CLI > C#, VB.NET らしい C++/CLIの方が効率よく高速なMSILに変換される仕組みでもあるのかな?
950 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 11:12:50 ] 無いし実際同じ
951 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 11:22:21 ] C++/CLI はネイティブコードで書いた部分の実行速度が速いからとかじゃ?
952 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 11:38:51 ] ボックス化された値型とかトラッキング参照とか駆使して低レベルな最適化をやれば速くなるかもしれないけど JITのバージョンアップであっさり逆転したりしそうだ
953 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 22:47:30 ] 検証に使用したコードがないと話にならんだろ。
954 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 22:51:54 ] C#よりもC++/CLIの方ができることの制限が少ないから、速いコードを書くこと余地は大きいだろうね。 C++はUnsafeだから、こういうのを単純に比較しても意味ないと思うんだけどな。
955 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 23:03:35 ] 一般に将来的な最適化の妨げになるしなあ
956 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 03:06:48 ] C++/CLIの速さはこの2つを足して2で割ったところとしているんでしょ。 マネージ部分の速さ = C#, VB.NET ネイティブ部分の速さ = C++
957 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 09:17:41 ] まあアンマネージだけで書いたらC++もC++/CLIも変わらんわな マネージだけで書いたらC++/CLIもC#も変わらんわな 測ってないけど
958 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 10:42:19 ] くだすれ落ちているのでここで失礼します。 unmanagedなバイト配列(unsigned char* byteArray, int len)を managedな配列(array<Byte>)に変換したいと考えています。 とりあえずインデクサをつけて一個一個代入していったり、 Addしてみたりしたのですが、随分と処理に時間を喰ってしまいます。 そこまで速度に神経質なプログラムでも無いのですが、 もっとスマートに配列を変換する方法は無いものでしょうか。
959 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 11:29:42 ] Marshal.Copy(IntPtr, byte[], int, int) とか。
960 名前:958 mailto:sage [2010/02/01(月) 12:04:10 ] >>959 Marshal探せば良かったんですね。 Managedメモリを固定して確保してからmemcopyとか、明後日の方向に向かって努力していました……。 どうもありがとうございました。
961 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 21:49:51 ] C#でも一応スタックに配列取ったりマネージ配列やアンマネージ配列にポインタでアクセスしたりできるよ
963 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 22:10:43 ] マネージドで書いとけばいいのにやたらアンマネージド呼び出して 結果マーシャリングコストばっかりかかってパフォーマンス悪化とか、ありそうな話