くだすれC++/CLI(初心者用)part2 [sc](★0)
-
- 1
- ./1256645713/662
- 2010/03/15(月) 09:41:19
-
おそらく、.NET開発でデファクトスタンダードに最も近いであろう
C++/CLIについて語ろうぜ!
このスレはC++および.NET Frameworkについて一定以上の知識を持っている人が対象となります。
.NETのクラスライブラリの使い方といった質問は Visual Studioスレにお願いします。
前スレッドはこちら
くだすれC++/CLI(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1142144110/l1
dat落ち姉妹スレ
C++/CLI part3
http://pc12.2ch.net/test/read.cgi/tech/1206447234/l1
http://pc11.2ch.net/test/read.cgi/tech/1142147319/l1
http://pc8.2ch.net/test/read.cgi/tech/1126450441/l1
managed C++ やろうぜ!! 002
http://pc8.2ch.net/test/read.cgi/tech/1139043535/l1
-
- 938
- 2016/02/21(日) 05:32:00.14
-
> デザイナではフォームはデフォでは static でないため、
> 内部の別クラスからは numericUpDown->Value 等にはアクセスできません。
ここで結果と原因の理解が食い違ってるので設計が悪くなってるのでは。
FormDataはstaticにせずForm1のメンバにして、その中身が変化したときのイベント
(ここに再描画関数を += して、EventArgsでパラメータを渡す)を足すのが良いのでは。
-
- 939
- 2016/02/21(日) 12:45:43.68
-
>>938
回答ありがとうございます。
それでも解決しますが、それは全面改訂になります。
既に(B)を全ての(A)の頭に入れるという解決策はあり、それの方がデグレードの危険が少ないです。
ただ、リフレクション等で(B)と(A)の順を入れ替えられると、数行の変更で済み、デグレードは発生しません。
だからそれを探しています。
Form1と別クラスCを追加して再度説明します。
全てはForm1の内部クラスです。継承はしていません。
-
- 940
- 2016/02/21(日) 12:46:15.32
-
【今】
ref class Form1{
Form^ someForm; // デザイナで作成したため、static ではない
someForm->Changed += 再描画関数; // (A)
someForm->Changed += struct更新関数; // (B)
static ref struct FormData {
Decimal someForm_value;
} formData;
function struct更新関数(){ // (B)
formDataを更新
}
function 再描画関数(){ // (A)
// struct更新関数() // (B)を += せずにここに入れれば解決する、ただし変更箇所多数
formDataを使う別クラスCを使用 // formDataは未更新なのでバグる
}
ref class 他のクラスC {
描画用データ作成 // ここで someForm->Value を使いたいが直接には出来ないので仕方なく static formData を確認
}
};
問題点:
クラスCから someForm->Value が取れないので static struct FormData で誤魔化す。
ただしこれだとイベント順が「描画(A)」→「データ更新(B)」となり、描画内容が1イベント分ずれる。
このため、(B)と(A)の処理順を入れ替えたいが、方法が見あたらない。
-
- 941
- 2016/02/21(日) 12:46:44.50
-
【>>938の提案】
ref class Form1{
Form^ someForm; // デザイナで作成したため、static ではない
someForm->Changed += struct更新関数; // (B)
ref struct FormData { // static ではない
Decimal someForm_value;
} formData;
formData->someForm_value->Changed += 再描画関数; // (A) // 自作クラスFormDataにChangedイベント追加
function struct更新関数(){ // (B)
formDataを更新
}
function 再描画関数(){ // (A)
formDataを使う別クラスCを使用 // formDataは常に更新済み、formDataを呼び出し時に渡す
}
ref class 他のクラスC {
描画用データ作成 // formData を参照
}
};
問題点:
イベント処理順は「データ更新」→「描画」と正しく固定される。
ただし全面改訂になる。
-
- 942
- 2016/02/21(日) 12:47:27.88
-
> ここで結果と原因の理解が食い違ってるので設計が悪くなってるのでは。
結果: 描画に使われるデータが1イベント分ずれる
原因: イベント順が「描画」→「データ更新」だから
何か間違いはありますか?
データ構造としては本来は class Form1 : FormData となるべきため、
static で使うことも問題ないと思います。
既に記述されて動いているプログラムがあり、それを変更しようとしています。
データ更新→描画にプログラム上で固定するのはスクラッチからなら当然ですが、その場合にも結局
「どのデータが更新されたか→どの部分を再描画する必要があるか」を記述する必要があります。
この部分は今既にデザイナ上にあり、動いているので、それをそのまま利用する方法を探しています。
-
- 943
- 2016/02/21(日) 20:54:36.76
-
結果:アクセスできない
×原因:staticじゃないから
○原因:設計が悪いから
http://www.c-sharpcorner.com/uploadfile/b81385/how-to-change-order-of-event-handlers-execution-at-run-time/
リファクタ無理だというならここにあるC#のコードをC++/CLIに移植すればよいのでは。
-
- 944
- 2016/02/22(月) 00:23:23.86
-
リンク先のコードでイベント順を入れ替えることが出来ました。
ありがとうございました。
プログラム構造については色々意見はあるとは思いますが、
最初から固まっている仕様に対して一度作って終わりなら誰も苦労しませんよ。
複数有る解決策のうち、今現在見える範囲での最適解をその都度選んでいくしかありません。
A. イベント順を入れ替えても
B. 各イベントハンドラの頭にデータ更新を挿入しても
C. 他クラスに対していちいちForm1オブジェクトを渡してstaticではなくしても
制御フローは同じです。(切り出し面が異なるだけ)
今後FormDataクラスや「他のクラスC」はForm1外でも使う可能性があるのと、
デグレードに対するデバッグの困難さを考えて、今回はAを選んでいるだけです。
まあいずれにしても、解決しました。
ありがとうございました。
なおリンク先、最後に小言が書いてありますが、完全に同意ですよ。
本来はイベントテーブルを参照できるメソッドが有ればいいだけです。
-
- 945
- 2016/02/23(火) 04:03:35.79
-
本来はまともな設計をすればいいだけだよ
+= した順番に呼ばれるのもたまたまそういう実装になってるだけでしょ
-
- 946
- 2016/02/29(月) 00:09:05.42
-
イベントの実行順はaddされた順だと仕様化されてる
-
- 947
- 2016/04/25(月) 16:38:42.40
-
質問失礼します。
'abc.exe': 'C:\Visual Studio 2008\Projects\xyz.dll' を読み込みました。Cannot find or open the PDB file
'abc.exe': 'C:\Visual Studio 2008\Projects\xyz.dll' をアンロード
このアンロードはどうやって止めるのでしょうか?
実行した際に、dll内のメソッドを参照できないようで、以下のエラーとなります。
ハンドルされていない例外: System.IO.FileNotFoundException: ファイルまたはアセン
ブリ 'hoge.dll'、またはその依存関係の 1 つが読み込めませんでした。
指定されたモジュールが見つかりません。
場所 hoge.hogeclass..ctor()
場所 main(Int32 argc, SByte** argv)
場所 _mainCRTStartup()
コンパイルはできています。
よろしくお願いします。
(なんか急にできなくなった気がします。前は、問題無だったはずなのになぁ)
追記
他にも、以下のような、謎のメッセージも出ています。
'abc.exe': 'ImageAtBase0x10000000' を読み込みました。含める/除外する設定により、読み込みは無効になっています。
'abc.exe': 'ImageAtBase0x10000000' をアンロード
よろしくおねがいします。
-
- 948
- 2016/04/26(火) 04:22:33.77
-
「cannot find or open the pdb file c++」で検索!
-
- 949
- 2016/04/26(火) 10:52:45.55
-
アンロードは気にするな
dllの場所をあちこちコピーして試してみ
-
- 950
- 948
- 2016/04/27(水) 15:26:32.30
-
思い出しました。
ildasm,ilasmをつかって、その該当のdllのPCBを作りました。
(dllの中まで、デバッガで追いかけるためです)
あたらしくコンパイルしたDLLへ、前のPCBがなかったものから、リンクを張り替えました。
そしたらエラーが出るようになった気がします。
(あくまで、気がするだけです。なんら、確かな関連はわかりません)
しかし、現在は、以前のオリジナルのDLLをリンクしています。
その状態でエラーが出ています。
>>949
回答ありがとうございます。
/LIBPATH の場所
exeと同じフォルダ
program filesフォルダのvisualSTUDIOフォルダ
それらに置き直しました。が、駄目でした。
-
- 951
- 2016/04/27(水) 16:32:56.37
-
xyz.dllが依存している何かのDLLが見つからないんじゃないの
dependency walkerとかcygwinのlddとかで確認してみたら
-
- 952
- 2016/04/27(水) 17:53:59.20
-
参照設定に入れてるんじゃないの?
一旦外して参照設定しなおしてみては
-
- 953
- 948
- 2016/04/27(水) 18:59:04.66
-
'newxyz.exe': 'C:\Documents and Settings\company\My Documents\Visual Studio 2010\Projects\newxyz\Debug\newxyz.exe' を読み込みました。シンボルが読み込まれました。
'newxyz.exe': 'C:\WINDOWS\system32\ntdll.dll' を読み込みました。シンボルは読み込まれました (ソース情報は取り除かれました)。
-----------------------------------------省略
'newxyz.exe': 'C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Culture.dll' を読み込みました。シンボルは読み込まれました (ソース情報は取り除かれました)。
'newxyz.exe': 'C:\WINDOWS\assembly\NativeImages_v4.0.30319_32\mscorlib\cece9d0256e18427b64587ba690605d4\mscorlib.ni.dll' を読み込みました。シンボル ファイルにネイティブ シンボルがありません。
'newxyz.exe' (マネージ (v4.0.30319)): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll が読み込まれました。シンボルが読み込まれました。
ー---------------省略
'newxyz.exe' (マネージ (v4.0.30319)): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll が読み込まれました。シンボルが読み込まれました。
'newxyz.exe': 'ImageAtBase0x10000000' を読み込みました。含める/除外する設定により、読み込みは無効になっています。
'newxyz.exe': 'ImageAtBase0x10000000' をアンロード
'newxyz.exe' (マネージ (v4.0.30319)): 'C:\Documents and Settings\company\My Documents\Visual Studio 2010\Projects\newxyz\Debug\xyz.dll' が読み込まれました
'newxyz.exe': 'ImageAtBase0x10000000' を読み込みました。含める/除外する設定により、読み込みは無効になっています。
'newxyz.exe': 'ImageAtBase0x10000000' をアンロード
----------------続きがあります
----------------続きがあります
-
- 954
- 948
- 2016/04/27(水) 19:01:17.20
-
'newxyz.exe': 'C:\Documents and Settings\company\My Documents\Visual Studio 2010\Projects\newxyz\Debug\netClient.dll' を読み込みました。Cannot find or open the PDB file
'newxyz.exe': 'C:\Documents and Settings\company\My Documents\Visual Studio 2010\Projects\newxyz\Debug\netClient.dll' をアンロード
newxyz.exe の 0x7c812aeb (kernel32.dll) で初回の例外が発生しました: Microsoft C++ の例外: EEFileLoadException (メモリの場所 0x0012d0e8)。
----------省略
'System.IO.FileNotFoundException' の初回例外が newxyz.exe で発生しました。
'newxyz.exe': 'C:\WINDOWS\system32\version.dll' を読み込みました。シンボルは読み込まれました (ソース情報は取り除かれました)。
'System.IO.FileNotFoundException' のハンドルされていない例外が newxyz.exe で発生しました。
追加情報: ファイルまたはアセンブリ 'netClient.dll'、またはその依存関係の 1 つが読み込めませんでした。指定されたモジュールが見つかりません。
'newxyz.exe' (マネージ (v4.0.30319)): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_ja_b77a5c561934e089\mscorlib.resources.dll' が読み込まれました
スレッド 'メイン スレッド' (0xe48) はコード 0 (0x0) で終了しました。
スレッド 'Thread::intermediateThreadProc' (0xec8) はコード 0 (0x0) で終了しました。
スレッド 'HelperCanary::ThreadProc' (0xec4) はコード 0 (0x0) で終了しました。
プログラム '[3652] newxyz.exe: ネイティブ' はコード 0 (0x0) で終了しました。
プログラム '[3652] newxyz.exe: マネージ (v4.0.30319)' はコード 0 (0x0) で終了しました。
-
- 956
- 2016/05/01(日) 16:47:47.97
-
匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、
BitTorrentがオープンソースで開発されています
言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか?
Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします
https://twitter.com/Lyrise_al
ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできないアスペルガーw
The Covenant Project
概要
Covenantは、純粋P2Pのファイル共有ソフトです
目的
インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します
特徴
Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW)
接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です
DHTにはKademlia + コネクションプールを使用します
UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります)
検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません
1w
-
- 957
- 2016/10/22(土) 11:55:32.76
-
大分人が居ないみたいだけど、質問させてください
archlinux(x86_64)+gtkmm3(3.22.0)+epoxy(1.3.1)+glsl上のOpenGLで隠面消去をしたいのですが
glEnable(GL_DEPTH_TEST)しても上手く行きません。fragment shaderの部分で書くのでしょうか?
もしサンプルなど有りましたらURLを教えて頂ければ幸いです。
OpenGL、GLSL周りの情報は何処を見て何処を出せば良いのか分からず不明ですが宜しくお願いします
少し問題の発端を・・・
以前はgtkmm3+glewで某ホームページで点にテクスチャを貼って大きさを変える方法を利用してました
(1) gtkのアップデート → context周りが上手く機能せず
(2) GLAreaクラス使用する → オプションとか無効なものが発生、描画命令が上手く動かない
(3) GLSLを使うようにする → アルファテストは何とか解決、隠面消去が実装方法が分からず
※オンボード(core i7 4771)のグラフィックを使っているせいかGLSLのバージョンも1.3以上にできないみたいです
-
- 958
- 2016/10/22(土) 12:52:21.05
-
おおいたじん
-
- 959
- 2016/10/23(日) 21:52:15.85
-
わかったぁぁぁぁ!!!
glEnable( GL_DEPTH_TEST );
ではなく
set_has_depth_buffer();
でデプスバッファを有効にするみたいだ
こんな所まで変える必要はないだろうに・・・
-
- 960
- 2016/10/23(日) 23:42:58.00
-
すれ違いな事を分かれよw
-
- 961
- 2016/10/24(月) 00:49:08.07
-
いや誘導されてきたしw
普通のくだすれ落ちてるし
スレ立てるまでもないスレの方が良かったのかな?
-
- 962
- 2016/10/24(月) 08:15:21.68
-
「くだすれ行け」って言われてこのスレに誘導されたと思ったんなら頭悪すぎるわ。
-
- 963
- 2016/10/24(月) 10:37:31.81
-
>>962
ほんそれ
-
- 964
- 2016/10/24(月) 12:49:59.59
-
まあ /CLI の文字はわからない人には見えないからな
-
- 965
- 2016/10/24(月) 15:51:40.64
-
くだすれC++だったとしてもスレ違い
-
- 966
- 2016/11/03(木) 11:44:11.90
-
C#で言うオブジェクト初期化子に相当する機能ってC++/CLIに用意されているんですかね?
getアクセッサしかないプロパティをコンストラクト時に初期化して使うようになっている
ライブラリがあったんですけど、もしかしてそういうクラスはC++/CLIから使えない?
-
- 967
- 2016/11/03(木) 16:15:49.29
-
{ hoge : 774, fuga : 37564 } { .hoge = 774, .fuga = 37564 } みたいなやつ?
俺も2015で以前に探したけど見つからなかったな
どうなんだろうね、あるのかな
-
- 968
- 2016/11/03(木) 16:49:50.16
-
それです。
VBには追加されているみたいだけど、C++/CLIは見捨てられているなぁ。
-
- 969
- 2016/11/03(木) 17:54:07.51
-
VSの作りからして、それはないんじゃないかな
MFCでリボンじゃない方のドッキングのプロジェクト作るとわかるけど、
あれがものの見事にVSのドッキングだからね
かつデザイナは当然ユーザが生成する(した)フォームは(特にユーザコンポーネント)
.NETでビルドされたものをデザインタイム用に直接呼び出してる
(デザイナでエラーが出るだのインテリセンスが良く落ちるだの言ってるのは
VSの作りを”なんとなく”ですら理解できてない証拠)
MSとしてはVSで次のVSを作ったりする為にもC++/CLI作りこみたいけど
非常に言語体系が複雑かつ莫大な工数が必要で追いついてないんじゃないかなと妄想
既に市場のソフトウェアの価格破壊はとっくに完了
後はストアかUbuntuOnLinuxでサーバ市場か開発シェアで食い込むしかなさそうだし
-
- 970
- 2016/11/08(火) 19:00:23.92
-
亀レスだが何となく妄想が閃いた
MS主導とはいえ、C++/CLIってなんかの国際的な規格みたいなので規定された
れっきとした規格だからおいそれと追加できないんだ
んで、C#もC++も構造体(クラス)の初期化子持ってるから昔みたいな適当に
「MS独自の拡張でーす」とかやっちまうと収拾つかなくなりそう
とはいえ { 0, ,1 2 } は後からメンバ追加したとき修正忘れとかトラブルの元だし
構造体宣言→ZeroMemory→b=1; c=2;はエイリアス切らないとconst修飾できねーし
(エイリアスはヒューマンエラーの元、constじゃないと最適化掛からないケースあり)
さっさと対応して欲しいとこではある
-
- 971
- 2016/11/08(火) 22:29:24.78
-
混在アセンブリが作れるのはC++/CLIだけだし非常にもったいないと思うんだが、
MS自身も既にグルー用途以外での新規採用を推奨してなかったんじゃないかな。
もうちょっと力入れてくれてたらMFCなんか捨てられたのに。
-
- 972
- 2016/11/08(火) 22:58:35.07
-
ttps://support.microsoft.com/ja-jp/kb/3001686
これかな
そのわりにはVSには使ってんだよな
MFCしながらマネージコードをデザインタイムで呼び出してフォーム表示しなきゃならんから
仕方ないのかも知れんけど
-
- 973
- 2016/11/09(水) 11:18:35.06
-
さりげなくVS2015でMFC進化してたし、MFCのダイアログでスプリッタとか
(無理やり空のCFrameWnd貼り付けるとタブ移動できない)
ステータスバーとか(.NETみたいにツールバーもどきとしても使える)
.NETでしか使えないコントロールが軒並みMFCにきてくれたりするだけでもいいんだけど
これから先C++/CLIのサポートどうなるんだろ
多少見てくれやUIが前時代的でもMFCの方が安定かなぁ
-
- 974
- 2016/11/21(月) 13:25:25.73
-
MSはCLI推奨せずにC#やVB推奨してっけど、将来のOffice系何で作るんだろな
難読化してもその内ソースのオプティマイザ出てきてイタチごっこになりかねんし暫くはMFCかね
-
- 975
- 2017/01/15(日) 21:23:48.23
-
C++/WinRT なんてものまで出てきて、C++/CX も先が短そう
WTL の再来っぽくていい感じだけど
-
- 976
- 2017/01/15(日) 22:42:58.04
-
どれか一本に絞ってくれんと安心して規模がでかいモノに使えんのだよな
-
- 977
- 2017/01/16(月) 17:58:46.48
-
うむ
-
- 978
- 2017/01/26(木) 18:08:08.58
-
コロコロ変えて無駄な需要を作り出すのもM$の仕事
-
- 979
- 2017/01/30(月) 00:52:58.91
-
C++/WinRT をちょっと使ってみたけど、これいいね
標準C++で WinRT の COM 定義をインクルードして普通に使えるのはいい
癖さえつかめば、あとはWinRTのお作法だけってかんじだわ
-
- 980
- 2017/01/31(火) 15:17:17.52
-
une
-
- 981
- 2017/02/01(水) 02:50:30.54
-
UWPとか限定せずに、C++/CLIのまま突っ走って欲しかったんだがなぁ
-
- 982
- 2017/04/28(金) 09:31:56.32
-
フォームアプリ用のプロジェクトのテンプレどっか落ちて無い?
毎回手動で設定するの面倒臭い。
-
- 983
- 2017/05/20(土) 14:40:24.30
-
アンマネージ側でvector<>に格納されたデータをマネージ側に返すには
gcnewで別にメモリ確保してコピーしてから返す方法になるんですか?
(一時的に倍メモリ使うのが気になります)
-
- 984
- 2017/05/20(土) 15:14:59.81
-
俺はあまり詳しくないけど、「返す」ってのが普通は要らないと思う。
マネージドからアンマネージドは直叩き出来るし、普通はそうする気が。
切り替えのオーバーヘッドがーみたいな記述もどこかにあったけど、
俺がやっている限りでは無駄命令は出ずに直叩きしてた。
逆にアンマネージドからマネージドも一応は直叩き出来るけど、
pin_ptrにしなければいけないし、可変長は多分無理。
STL/CLRにもvectorはあるけど、こちらだとアンマネージド側のソース変更が必要になる。
(*を^に変更)
だから一番楽なのは上記の「マネージドからアンマネージドを直叩き」だと思う。
なおコピーするのならそりゃ一時的には倍メモリ使うしかないでしょ。
-
- 985
- 2017/05/21(日) 00:02:49.54
-
collection_adapterの出番だ!って思ったら逆方向だったでござる
-
- 986
- 2017/08/11(金) 18:57:30.61
-
visual c++ express edition
(2010)で、
numericUpDown1 に、小数を入力(DecimalPlaces は、 1)できるようにしています。
コードから、
float suu;
(numericUpDown1 -> Value) =
(float)suu;
が、エラー出ます。
suu と、numericUpDown1 を、整数にしておけば、エラー出ません。
小数で、入力するには、どうすればよいのですか?
m(__)m
-
- 987
- 2017/08/11(金) 22:49:03.05
-
エラーメッセージに書いてあるだろ。
このページを共有する
おすすめワード