くだすれC++/CLI(初心者用)part2
■ このスレッドは過去ログ倉庫に格納されています
0001./1256645713/662
2010/03/15(月) 09:41:19C++/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
0052デフォルトの名無しさん
2010/09/20(月) 11:32:08初心者が質問するたびに使うなと勧められる
0053デフォルトの名無しさん
2010/09/20(月) 13:44:55ありがとう。jpegじゃなくてjpgだったという凡ミスしていたことに気づけたわ
・・・一度C#に浮気してみる
0054デフォルトの名無しさん
2010/09/20(月) 13:53:46嫌われているというか、言語自体が初心者お断りだからな
初心者が無謀なことしようとしていたら、そりゃ止めるだろう
0055デフォルトの名無しさん
2010/09/20(月) 14:01:21使わなくていいなら使いたくない。
0056デフォルトの名無しさん
2010/09/20(月) 15:01:38MDI作るときどうするかとか
ちょっとしたことの逆引きがネット上で全く出てこない
ようやくOpenGL表示できるようになって
C++の頃の遺産をつかえると思ったのに
0057デフォルトの名無しさん
2010/09/20(月) 16:33:26なにもかもC++/CLIで済ませようとしないことをお勧めする
0058デフォルトの名無しさん
2010/09/21(火) 02:27:48ただ何故かこの言語とのファーストコンタクトというか接し方が
一言入れておかないと不幸にしかならなそうな人が多いのよね
0059デフォルトの名無しさん
2010/09/21(火) 09:55:56こういうのがあるから「Visual C++ 2008 で簡単GUIプログラミング」みたいな勘違い本やサイトが出て初心者が道を間違える
0060デフォルトの名無しさん
2010/09/21(火) 23:18:00C++の文法がある程度使えて
フォームデザインが総合開発環境上で扱えて
至れり尽くせりじゃん、と思ってとっかかりました
現実は情報が全く無く
よくわからないクラスとかいっぱいあって
解説も無くて
どうしようと途方にくれていましたが、QTとかよりは
導入コストも再勉強のコストも無いだろうと信じて使ってます。
だって、CやC++だとGUI作るの辛いんだもん
っていう理由だとダメですか
0061デフォルトの名無しさん
2010/09/21(火) 23:32:23マネージ部分はC++とは直接関係なくて学び直し必要だし
それなら素直にC#
C#2.0の範囲までなら多分C++/CLIより簡単だし
サンプルも多いし将来WPF/Silverlightとかにも応用できるし
C#やっとけば逆にC++/CLIを橋渡し用ぐらいなら書けるようになるし
0062デフォルトの名無しさん
2010/09/27(月) 13:44:310063デフォルトの名無しさん
2010/09/27(月) 14:03:20それを一応形にできたところは評価できる。
0064デフォルトの名無しさん
2010/09/27(月) 19:28:250065デフォルトの名無しさん
2010/09/27(月) 19:37:100066デフォルトの名無しさん
2010/09/28(火) 02:31:06//////////Form1_Load//////////
HANDLE hMap;
LPVOID lpBuf;
hMap=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,1024,L"View");
if(hMap==NULL){Form::Close();}
lpBuf=MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,0);
if(lpBuf==NULL){Form::Close();}
if(GetLastError()==ERROR_ALREADY_EXISTS){//すでに同じ名前のオブジェクトが存在する
lpBuf=Environment::GetCommandLineArgs();//コマンドラインから取得//ここでエラー
///////////ここまで/////////////
つまり二重起動時に共有メモリを使いたいのですが、どうしてもできません。
先人方どんなことでもいいので教えてくだせえ。
0067デフォルトの名無しさん
2010/09/28(火) 02:40:230068デフォルトの名無しさん
2010/09/28(火) 02:51:50> lpBuf=Environment::GetCommandLineArgs();//コマンドラインから取得//ここでエラー
コードの方はarray<String^>^からLPVOIDに変換したいように見える
0069デフォルトの名無しさん
2010/09/28(火) 03:19:272008 Express Editionを使っていまして・・・ヘッダーがないらしいです。
http://www.codeguru.com/forum/showthread.php?t=468408
>>68
コマンドライン引数を得た後、array<String^>^に変換しようと思ったのです。
宣言時からarray<String^>^だとMapViewOfFileでつまずいちゃうので・・・。
どちらにせよ、コマンドライン引数を得た後、
共有メモリarray<String^>^として反映できればいいのですが。
0070デフォルトの名無しさん
2010/09/28(火) 03:50:07そもそもLoadイベントなんかでやる処理には見えないけど(mainでやることだろ)
共有メモリにString^を書き込みたいのなら
> ttp://www.codeguru.com/forum/showthread.php?t=468408
のリンク先にString^をポインタに変換する方法が載ってるからmemcpyなりなんなりすればいい
複数の文字列を書き込む必要があるなら\0なりなんなりで区切る
0071デフォルトの名無しさん
2010/09/29(水) 06:10:09とにかく二重起動時にコマンドライン引数を渡すことができました!
皆様、貴重なアドバイスをありがとねん
0072デフォルトの名無しさん
2010/10/03(日) 12:39:42safe_cast :型が合わないと例外が発生、実行コスト中
dynamic_cast:型が合わないとNULLを返す、実行コスト大
static_cast :型が合わなくても何もしない、実行コスト小
この認識であってますか?
0073デフォルトの名無しさん
2010/10/03(日) 16:11:05static_castが速くなるのはダウンキャストの場合だけ。静的に解決できる場合はsafe_castと同じ。
0074デフォルトの名無しさん
2010/10/03(日) 20:39:28いまさらだけど、.NET Framework 4以降ならMemoryMappedFileクラスを使えばいいと思うよ。
0075デフォルトの名無しさん
2010/10/03(日) 20:52:42公式の説明でもパフォーマンスをえらく強調してるが、
そのためにわざわざ検証不能コードにしてまでやるほどのものなのかと
0076デフォルトの名無しさん
2010/10/08(金) 20:22:23>どうやらそれらは、レガシC++アプリケーションをWindows Phoneに移植したいと考えている多くの開発者にとって、C++/CLIは、ベストなルートに見えるのであろう。
地獄への道は善意で舗装されている
0077デフォルトの名無しさん
2010/10/08(金) 20:28:080078デフォルトの名無しさん
2010/10/08(金) 20:52:06Silverlightで使える範囲のC++/CLIはC++とは全く互換性なくてただの汚いC#なんだけど
0079デフォルトの名無しさん
2010/10/08(金) 21:47:310080デフォルトの名無しさん
2010/10/08(金) 22:05:210081デフォルトの名無しさん
2010/10/09(土) 21:36:15画像の場合ピクチャボックスみたいな感じに楽に音楽再生させたいのだけど
0082デフォルトの名無しさん
2010/10/10(日) 23:03:16.NET使ってもできる
どちらにしてもC++/CLIとは直接関係ない話
0083デフォルトの名無しさん
2010/10/11(月) 00:46:33これ絶対初心者向けじゃない気がする
0084デフォルトの名無しさん
2010/10/11(月) 00:49:57絶対初心者向けではない、その通りだ。
0085デフォルトの名無しさん
2010/10/11(月) 06:02:46俺みたいな勘違い君が集まるから
スレタイ変えると平和になる気がする
0086デフォルトの名無しさん
2010/10/11(月) 11:40:19「C++(非CLI)でアプリを作っているが、.NETのライブラリを使って音を鳴らしたい」
→そこだけC++/CLIを部分的に使おう
という風に特別な意図を持って言語であって、
>>81のような質問が出てくる時点でC++/CLIを使うのは間違っている
0087デフォルトの名無しさん
2010/10/11(月) 12:08:450088デフォルトの名無しさん
2010/10/11(月) 13:10:090089デフォルトの名無しさん
2010/10/11(月) 15:50:17C++/CLIの初心者向けのスレなんだよなw
0090デフォルトの名無しさん
2010/10/11(月) 16:27:401) C++習得レベル一定以上
2) .NET習得レベル一定以上
だからな
0091デフォルトの名無しさん
2010/10/12(火) 02:47:19みんな言うように初心者が使う物じゃないね。
0092デフォルトの名無しさん
2010/10/12(火) 15:18:47どうしても必要なときにちょっと調べてその場が凌げれば充分
0093デフォルトの名無しさん
2010/10/12(火) 18:55:470094デフォルトの名無しさん
2010/10/12(火) 19:17:34アンマネージとマネージの境界は常に意識する必要がある。
0095デフォルトの名無しさん
2010/10/12(火) 20:52:46Express Editionだと実行中のプロセスにアタッチできるのが
C++しかないってのも使ってる理由のひとつ。
0096デフォルトの名無しさん
2010/10/27(水) 21:11:21簡単GUIプログラミング!みたいな見事な勘違い記事だった。騙されて道を誤る初心者が不憫でならない。
0097デフォルトの名無しさん
2010/10/30(土) 18:38:530098デフォルトの名無しさん
2010/10/31(日) 02:19:240099デフォルトの名無しさん
2010/11/02(火) 23:54:010100デフォルトの名無しさん
2010/11/02(火) 23:59:30CLI拡張の部分だけでも言語仕様書の量がC#並み
0101デフォルトの名無しさん
2010/11/03(水) 00:03:310102デフォルトの名無しさん
2010/11/03(水) 04:25:150103デフォルトの名無しさん
2010/11/03(水) 16:45:49なんとなくこんな感じ、って思い描いたものが
1行で組みあがるくらいに
なるわけねぇ
0104デフォルトの名無しさん
2010/11/03(水) 17:28:32pin_ptr<SCRIPT_STRING_ANALYSIS*> pssa = &(this->構造体型の変数);
こういう風にしてもうまくいかないんだが
0105デフォルトの名無しさん
2010/11/03(水) 17:41:24自己解決した
単にpin_ptrの型を間違っていただけだった
0106デフォルトの名無しさん
2010/11/11(木) 20:14:40int 数値 = 0;
みたいに。
うっかり全角アルファベット混ぜたりしたら大変だな。
0107デフォルトの名無しさん
2010/11/11(木) 20:26:13コンパイラが共通なんだから
0108デフォルトの名無しさん
2010/11/11(木) 22:11:50今のパソコンて、ゼロに斜線が入らないから、うっかり
int 数値 = O;
とかしてしまうとやばいぜw
0109デフォルトの名無しさん
2010/11/12(金) 04:36:060110デフォルトの名無しさん
2010/11/12(金) 13:04:12Windows Mobile 6 Professional SDK Refresh.msiと
試しにVS2010EEを入れてみたけど
ダメでした
Windows Mobile 6 Professional SDK Refresh.msiは2環境でインストールして
いるのでインストーラがコケたとかでは無さそうです
定義だけなのでGoogle Codeとかでも良いのですが、MS系は上手く手に入りません。
くだすれですがよろしくお願いします。
0111デフォルトの名無しさん
2010/11/13(土) 12:22:30こう宣言すると
System.ArgumentException' の初回例外が発生しました。
とイミディエイトウィンドウにメッセージが出るんだけど
宣言の仕方どこが間違ってますか?
0112デフォルトの名無しさん
2010/11/13(土) 17:42:15#include <cliext/queue>
using namespace System;
cliext::queue<array<String^>^ > queue_dwnload;
0113デフォルトの名無しさん
2010/11/13(土) 18:21:47プログラムも正常に動作してます
それでもう少しシンプルなコードで試してみたんだけど
VS2008で新規作成、プロジェクト、CLRのwindowsフォームアプリケーション
のテンプレートでプロジェクトを作成して
#include <cliext/queue>を追加
~Form1(){}の下あたりに
cliext::queue<array<String^>^ > queue_dwnload;を追加
デバッグ実行する
これだけでメッセージが出ます、キューの宣言は間違ってないみたいだけど
何が原因なんだろう?
0114デフォルトの名無しさん
2010/11/13(土) 19:06:11~Form1()と同じprotectedには出来ないのかコンパイル時に警告がでる。
privateにしたらどう?
private: cliext::queue<array<String^>^ > queue_dwnload;
0115デフォルトの名無しさん
2010/11/13(土) 22:52:090116デフォルトの名無しさん
2010/11/14(日) 14:34:28まずコンパイルが警告なしで通るかどうか。
通るならデバッグ実行とデバッグなし実行で差があるかどうか。
別のPCでも再現するかどうか。
0117デフォルトの名無しさん
2010/12/02(木) 11:27:46プロジェクト:CLR クラスライブラリ
目的:コピーコンストラクタ、代入演算子を潰したい
エラーの出ないコード。
ref class Hoge sealed {
private:
Hoge % operator=( Hoge const % rhd ) { return *this; } ;
Hoge( Hoge const % src ) {} ;
}
実装したいコード。
ref class Hoge sealed {
private:
Hoge % operator=( Hoge const % ) ; // error LNK2020 未解決のトークン(06000001) Hoge::op_Assign
Hoge( Hoge const % ) ; // error LNK2020 未解決のトークン(06000003) Hoge::ctor
}
C++/CLIでメンバ関数の実装をせずに放置というのは可能でしょうか?
0118デフォルトの名無しさん
2010/12/02(木) 18:43:310119デフォルトの名無しさん
2010/12/02(木) 19:44:11代入演算子やコピーコンストラクタはそもそもオーバーロードできないし
constも使えないし参照渡しや参照返しもダメ(そもそもref classだから無意味)
つかまずC#やるべき。.NETの常識が無さすぎ。
0120117
2010/12/02(木) 22:33:30そうなんですか、回答ありがとうござます。
>>119
回答ありがとうございます。
http://msdn.microsoft.com/ja-jp/library/sy1y3y1t(VS.80).aspx
このサンプルコードのコンパイルが通らなかったのですが、そもそもサンプルが間違ってるという事なのでしょうか?
あと、.NETの常識を学ぶのにオススメの書籍などあれば教えていただけると幸いです。
0121デフォルトの名無しさん
2010/12/03(金) 11:24:33間違ってると言うより、そこは問題とは関係ない部分なだけ
0122117
2010/12/03(金) 12:41:30回答ありがとうございます。
別途実装をするしか無いという事ですね。分かりました。
そうすると >>119 の回答から考えて、C#などから使わせるつもりが無いなら、
・演算子のオーバーロードはstaticにする必要はない
・代入演算子やコピーコンストラクタはオーバーロードできる
・constも使えて参照渡しや参照返しもOK
ということでしょうか?
0123デフォルトの名無しさん
2010/12/03(金) 15:36:41C#やVBと相互運用しないとしてもconstパラメータは事実上役に立たない。
0124デフォルトの名無しさん
2010/12/04(土) 13:39:31C++スタイルでやりたいだけなら、そもそもC++/CLI 使う必要性がないんでない?
0125117
2010/12/04(土) 14:33:18回答ありがとうございます。
Hoge % operator=( Hoge % arg ) { 代入処理の実装 } ;
これだと代入元が書き換えられそうで気持ち悪いですけど、そういう流儀なのですね。分かりました。
>>124
>>122 の質問に関しては元々あった疑問ではありません。
>>119 の解答に書かれている内容に関しての事実確認です。
趣旨に関してはスレ違いだと思いますので書きません。
0126デフォルトの名無しさん
2010/12/04(土) 14:48:36ref classだから常にポインタ渡し
0127デフォルトの名無しさん
2010/12/05(日) 13:03:24MSのサンプルだか自動生成されるコードだかで、
あんな風にrefクラス上でC++っぽいことをやっているものを見た覚えがある。
元の質問者のコードもそういうのに影響されたのではないかと思う。
0128デフォルトの名無しさん
2010/12/05(日) 14:36:18UInt32 data[5];
};
これがコンパイル通らないんだけど、
array<UInt32>^ data;とかにしていちいちgcnewするしかないんですか?
データ宣言するだけのためにコードなんて書きたくないので、うまい解決法お願いします。
0129デフォルトの名無しさん
2010/12/05(日) 15:20:340130デフォルトの名無しさん
2010/12/05(日) 21:27:52この手の機能でC#に負けてどうする
0131デフォルトの名無しさん
2010/12/05(日) 21:36:00atlstr.h、atlbase.h、atlapp.hは入れてるけどコンパイルとまる
0132デフォルトの名無しさん
2010/12/06(月) 21:09:33System::windows::form::timer で一秒ごとにlabel->textを更新していますが(要は時計です)
最小化から復帰するとlabel->textが更新されなくなります、何故でしょう。
0133デフォルトの名無しさん
2010/12/07(火) 22:12:400134デフォルトの名無しさん
2010/12/08(水) 00:35:19MSDNにもはっきりそう書いてあるだろ
0135デフォルトの名無しさん
2010/12/08(水) 00:44:46故意に止めるようなことはしていないんですが、そういう仕様なんでしょうか?
0136デフォルトの名無しさん
2010/12/08(水) 00:46:00えぇぇぇぇぇ。時間分解能が悪いとかあの辺ですか!ヽ(´Д`;)ノアゥ...
スレッドタイマークラスとかに変えます。ご教授ありがとうございます。
0137デフォルトの名無しさん
2010/12/08(水) 00:57:53どこだったか忘れたけど
0138デフォルトの名無しさん
2010/12/08(水) 11:59:01俺も最初使ってみて混乱した
0139デフォルトの名無しさん
2010/12/08(水) 14:19:360140デフォルトの名無しさん
2010/12/09(木) 00:12:13C++/CLIでラップしたネイティブのライブラリから例外が発生して、
C++/CLI側でcatchした時に、
ネイティブ側のインスタンスのデストラクタが呼ばれません。
これはバグと考えて良いのでしょうか?
VC++2010 expressでは普通に呼ばれたので・・
0141デフォルトの名無しさん
2010/12/09(木) 03:14:40あれからいろいろいじりまくっていたんだけど、どうもフォームの透過色(TransparencyKey)が特定の色の場合
この問題が発生しているようです。引き続き調べてみます。
0142140
2010/12/10(金) 18:48:44解決したので適当に報告しときます。
とりあえず、ネイティブのライブラリオプションを
/EHscから/EHaに変更することで、デストラクタが呼ばれるようになりました。
どうやらオプションの違いでABIに互換性が無くなり、
例外をハンドルできても、その後のアンワインディングを正常に実行できていなかったようです。
デフォルトのオプション設定だと上記のような状態になるので、
自分みたいに知らずに組んでる人はメモリリークし放題ですね。
0143デフォルトの名無しさん
2011/01/11(火) 22:48:33event Action^ Foo;
とやると
エラー1error C2955: 'System::Action' : クラス ジェネリック を使用するには ジェネリック 引数リストが必要です
って出てくる…
0144デフォルトの名無しさん
2011/01/11(火) 22:54:330145デフォルトの名無しさん
2011/01/11(火) 22:57:47ありがとう…
おまえそんなところにいたのか…
0146デフォルトの名無しさん
2011/02/05(土) 21:22:18それともインテリセンス使うために2008書いてる?
それともC++/CLI書かない?
0147デフォルトの名無しさん
2011/02/05(土) 21:30:17書かざるを得なくなるかもしれなくてちょっと憂鬱
0148デフォルトの名無しさん
2011/02/05(土) 22:28:460149デフォルトの名無しさん
2011/02/05(土) 22:49:37C++自体が言語として糞だから仕方がない。
それと互換性保ちながらここまで実現したということを考えると、かなりすごいと思う。
0150デフォルトの名無しさん
2011/02/05(土) 22:50:520151デフォルトの名無しさん
2011/02/05(土) 22:54:50え。それは、今では使うのは好ましくないとされているレガシー関数群をいまだにお使いになられているからではないですか?
0152デフォルトの名無しさん
2011/02/06(日) 11:47:30CLIの部分については互換性ゼロなんだから
■ このスレッドは過去ログ倉庫に格納されています