facebook twitter hatena line google mixi email
★お気に入り追加


■ このスレッドは過去ログ倉庫に格納されています

おそらく、.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

ここまで見た
  • 820
  •  
  • 2014/03/24(月) 01:50:12.79
>>819
あっ……「だいじょうぶ」になりました。
ありがとうございました!

ここまで見た
  • 821
  •  
  • 2014/03/24(月) 11:45:41.86
デバッガ使えない環境なのかな、、、
例外起きた時は出力ウィンドウに出るぜ

ここまで見た
  • 822
  •  
  • 2014/04/26(土) 12:11:13.54
c#のdynamic型に相当するものを
c++/cliで何と書けば良いですか?

ここまで見た
  • 823
  •  
  • 2014/04/27(日) 21:57:27.97
多分無い

ここまで見た
  • 824
  •  
  • 2014/05/09(金) 18:40:24.14
c++/cli勉強したいと思っています。
>>array<a^>^ array_a;
の<a^>^ってどいういう意味ですか?
顔文字に見えます。ググりたいのですが^>^でググっても
ヒットしません。キーワードを教えてけろ。

ここまで見た
  • 825
  •  
  • 2014/05/09(金) 18:46:04.26
トラッキングハンドル

ここまで見た
  • 826
  •  
  • 2014/05/09(金) 19:05:13.77
>>825
ありがとうございます。さっそくググってみます。

ここまで見た
  • 827
  •  
  • 2014/05/11(日) 22:02:14.61
参照型を内部に保持するコンテナの参照を宣言かな。

ここまで見た
  • 828
  •  
  • 2014/05/13(火) 09:25:37.06
ジェネリックメソッドの継承がうまく行きません。

generic<typename T> ref struct B;

ref struct A abstract {
generic<typename U> virtual A ^f(B<U> ^u) = 0;
};

//C4570 明示的に抽象として宣言せずに抽象関数を含んでいます
generic<typename T> ref struct B : A {
//C4490 オーバーライド指定子が不適切
generic<typename U> virtual A ^f(B<U> ^u) override {
return u;
}
};

同じ戻り値と引数でも、同じ関数だと認識されないようなのですが、どのようにすれば良いですか?

ここまで見た
  • 829
  •  
  • 2014/05/13(火) 10:02:57.61
ttp://social.msdn.microsoft.com/forums/vstudio/ja-JP/2f138907-64a3-4326-bfea-d0e4b3c15fa8
仕様っぽいのであきらめてC++/CLI投げ捨ててC#で書く

ここまで見た
  • 830
  •  
  • 2014/05/13(火) 10:44:57.11
なるほど・・・ありがとうございました。

ここまで見た
  • 831
  •  
  • 2014/05/13(火) 23:30:42.34
C#でdelegateに設定されたメソッドを調べるのにGetInvocationListを参照していたのですが、
C++/CLIで同じようなことをするとコンパイルエラーが発生してしまいます。
どのようにコーディングすればよいでしょうか?

// C#
http://ideone.com/O4j7TX

// C++/CLI
http://ideone.com/Lazyxs
※実際は23行目のauto mcd = (MulticastDelegate^)hoge->Piyo;で
error C3918: 使用するには、'Delegate::Hoge::Piyo' がデータ メンバーでなければなりません
といったエラーが発生してしまいます。

ここまで見た
  • 832
  •  
  • 2014/05/13(火) 23:41:08.55
C++/CLIの方はeventじゃん

ここまで見た
  • 833
  •  
  • 2014/05/13(火) 23:47:44.50
>>832
あーeventキーワード取っ払ったら通りました。ありがとうございます。
そこでコンパイルエラーにしてくれたらいいのに…。

ここまで見た
  • 834
  •  
  • 2014/05/14(水) 08:39:30.20
event自体は正当で使う側が問題なのに、eventの方でコンパイルエラー言われても

ここまで見た
  • 835
  •  
  • 2014/05/14(水) 11:14:20.64
ワロタ

ここまで見た
  • 836
  •  
  • 2014/05/14(水) 23:09:07.27
すいません>>831です。
禿しく勘違いしてました。C#のeventはシンタックスシュガーなんですね。
event EventHandler^ Piyo
{
void add(EventHandler^ value) { mPiyo += value; }
void remove(EventHandler^ value) { mPiyo -= value; }
void raise(Object^ sender, EventArgs^ e) { mPiyo(sender, e); }
}
EventHandler^ mPiyo;
などとしたら上手くいきました。

ここまで見た
  • 837
  •  
  • 2014/05/26(月) 03:20:04.74
c++/cli初めて作成しています。

c++プロジェクトでライブラリを作成して
void func1(const char *p){
cout << p << endl;
}
を定義して、
c++/cliプロジェクトでこの関数を呼び出すと、

func1("Hello World"); //呼び出し成功
func1("Hello" + "World"); //型 "System::String ^" の引数は型 "const char *" のパラメーターと互換性がありません

となったので、エラー解決のために少しググって、よくわからないまま
char* pStr = (char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi("Hello" + "World").ToPointer();
のようにして、
func1(pStr); //呼び出し成功
しました。

この場合、
func1("Hello" + "World");
を実行可能に出来るようにc++ライブラリ側で、この引数を受けられるfunc1関数を定義することは可能でしょうか?

ここまで見た
  • 838
  •  
  • 2014/05/26(月) 05:33:40.37
無理

ここまで見た
  • 839
  •  
  • 2014/05/26(月) 09:14:28.60
>>838
そうですか無理ですか。
出来れば、出来ない理由を教えてください。

ここまで見た
  • 840
  •  
  • 2014/05/26(月) 09:35:16.69
System::String^はネイティブでは直接扱えないから

ここまで見た
  • 841
  •  
  • 2014/05/26(月) 09:42:14.96
>>840
なるほど。ありがとうございました。

ここまで見た
  • 842
  •  
  • 2014/06/16(月) 00:28:31.77
c#で書かれたdllを呼び出すc++/cliのラッパー
static libを作り、それを呼び出すc++のコードを
書けば、c++でc#のdllを呼び出す事が出来ますか?

ここまで見た
  • 843
  •  
  • 2014/06/16(月) 03:18:12.95
出来るよ。リンク時に/MDオプションを使う必要はあったと思うけど。

ここまで見た
  • 844
  •  
  • 2014/06/16(月) 11:06:40.38
>>843
コメントありがとうございます。
c#からc++を呼び出す例はググるとたくさんあるの
ですが、c++からc#を呼び出す良い例、どこかに
ないでしょうか?

ここまで見た
  • 845
  •  
  • 2014/06/20(金) 23:37:50.80
std::regexで"["や"]"などの文字を扱うにはどう書けばいいですか?
たとえばテキスト中に"[43]"などの[]で囲まれた数字があるかどうか知りたいのですが。

ここまで見た
  • 846
  • 765
  • 2014/06/21(土) 16:55:19.23
久しぶりにVS開いたらWinFormが消えとる。もう捨てられるのか

>>844
これか
http://code.msdn.microsoft.com/windowsdesktop/CppHostCLR-e6581ee0

>>845
\でエスケープします
regex r("\[43\]");

ここまで見た
  • 847
  •  
  • 2014/06/21(土) 16:56:33.36
regex r("\\[43\\]");
こうか

ここまで見た
  • 848
  •  
  • 2014/06/25(水) 18:40:03.79
こんどCLI+API+STLで久々に開発するぜ
まともにWindowsアプリ作るの15年ぶりだぜ

ここまで見た
  • 849
  •  
  • 2014/06/25(水) 18:40:43.32
ご愁傷様

ここまで見た
  • 850
  •  
  • 2014/06/25(水) 19:43:48.20
なんでご愁傷様?

ここまで見た
  • 851
  •  
  • 2014/06/29(日) 15:12:56.12
WebBrowser::ActiveXInstanceのようなCOMポインターをObject^で返したいんですが
どう書いたらいいんでしょうか

Object^ get()
{
IUnknown* pU; //これを返したい
...
}

C#だと全部属性でやってて生ポインタをどう処理するかの参考にならないです。

ここまで見た
  • 852
  •  
  • 2014/06/30(月) 07:13:06.08
それを返した先でどうするのさ
例えばIntPtrを返しても一応Object^にはなるけど多分そういう事じゃないよね?

ここまで見た
  • 853
  •  
  • 2014/06/30(月) 08:29:40.70
Object^o=Marshal::GetTypedObjectForIUnknown(IntPtr(pU),Object::typeid);
とりあえずこうしました
addref,releaseが同じにならないといやだけど

ここまで見た
  • 854
  •  
  • 2014/07/30(水) 21:04:47.45
C++/CLI超楽しい
.Net、WinAPI、STL、Boost混在できて使いたい放題だし
何でみんな毛嫌いするの?

ここまで見た
  • 855
  •  
  • 2014/07/30(水) 22:46:45.65
C++とは似て異なるから

ここまで見た
  • 856
  •  
  • 2014/07/30(水) 23:48:31.72
最初から別言語だと思っとけばいいじゃん。
俺もC++/CLIは面白いと思うが、先がなさそうなのが残念だな。
WPFが使えるようになったらMFCのアプリを移行したいと思っていたんだが。

ここまで見た
  • 857
  •  
  • 2014/07/31(木) 13:36:46.98
やりたい放題というのは1人でやってるだけなら楽しいが
足を引っ張る仲間がいると地獄巡り満腹コースになる

ここまで見た
  • 858
  •  
  • 2014/07/31(木) 20:54:03.92
マネージ関数の中でlambda使えないとか、最近は混ざる利点みたいなものが少なく…。

ここまで見た
  • 859
  •  
  • 2014/08/05(火) 16:06:10.29
genericとtemplate混ぜたら楽しいと思ってたけど、
あんまり混ざらないようにできてる・・

ここまで見た
  • 860
  •  
  • 2014/08/05(火) 21:42:31.92
variadic template使って型パラメータの数が違うgeneric classを使えるかと思ったら、なんかエラーになるしね。

ここまで見た
  • 861
  •  
  • 2014/08/06(水) 12:55:33.48
genericクラスの中にtemplateは作れないし
その逆もできない。
できるのは、genericクラスをtemplateで
継承するくらい。

>>860 variadic genericあったらいいなぁ

ここまで見た
  • 862
  •  
  • 2014/09/26(金) 00:00:55.65
C++/CLIに直接関わる質問ではないのですが
適切なスレが見当たらなかったのでここで質問させてください。

ネイティブのnative.dllをマネージのmanage.dllが参照しているとき
native.dllにパスが通っていない状態でmanage.dllを使用すると
FileNotFoundExceptionが発生してしまいますが、
その例外の値からはnative.dllが見つからないことが原因であることを
判断することができません。

そこでmanage.dllが参照しているdllの一覧のようなものを取得したいのですが
そのようなAPIは用意されていますでしょうか?
とりあえずdumpbin.exe /dependentsで出力される結果を用いる実装にしてみたのですが
やはり外部の実行ファイルに頼るのは微妙ですし、何より処理が重いです。
Win32APIでも構いませんので何か方法がありましたらご教示ください。

ここまで見た
  • 863
  •  
  • 2014/09/26(金) 08:53:54.22
開発フェーズなら
Dependency Walkerというツールがある

ここまで見た
  • 864
  •  
  • 2014/09/26(金) 08:56:02.56
あっ、実行時の話やったか

ここまで見た
  • 865
  •  
  • 2014/09/26(金) 11:29:52.72
FileNotFoundが発生したら
LoadLibrary("native.dll");
GetLastError()してみるってのはどうだろう?

ここまで見た
  • 866
  •  
  • 2014/10/08(水) 22:50:24.63
>>862です。亀ですいませんが解決しました。
APIとしてはImageHelpライブラリ辺りが使えそうだったのですが途中で詰まったので断念。
結局ファイルを直接読んでIMAGE_DOS_HEADER構造体からたどって
インポートデータを解析することで対応できました。

ここまで見た
  • 867
  •  
  • 2014/10/16(木) 17:29:15.53
質問です。

MyCapsuleというクラスを作り、GetValue(参照渡しの引数)という仮想関数を
定義しておいて、このクラスから派生したクラスにおいてGetValueの実装を
するにあたり、与えられた引数がある特定の型に合致する場合にはその
引数に値を代入する、という動作を実現したいです。
例えばMyCapsuleIntという派生クラスでは、与えられた引数がint型だった
場合に、その引数に(何かしらメンバ変数などの)値を代入する、というもの
です。

こういう場合アンマネージドだと引数としてvoid*を使った実装になるかと
思うんですが、マネージドだとかわりにObject^%とかを使うのでしょうか?
ハンドルと追跡参照について未だによくわかっていないので、どうするのが
一般的な作法なのか見当がつきません。

よろしくお願いします。

ここまで見た
  • 868
  •  
  • 2014/10/16(木) 21:50:11.68
アンマネージからマネージの関数を呼んで
マネージドの中で作ったString^からchar*でアンマネージドに戻したいんです。

調べたところ
(char*)Marshal::StringToHGlobalAnsi("").ToPointer()ってのがあるのはわかったのです。
けど、これで戻してもアンマネージドからMarshal::FreeHGlobalが呼べないのでだめです。
一度StringToHGlobalAnsiで得たchar*を別のcharのバッファにコピーしてから戻す方法になるのでしょうか。

ここまで見た
  • 869
  •  
  • 2014/10/16(木) 22:01:55.82
Marshal::StringToHGlobal...で確保したのはLocalFreeすればいいけど
普通は呼び出し元がバッファ用意するなり、std::stringとかで返すなりするもんじゃね?

ここまで見た
  • 870
  •  
  • 2014/10/16(木) 22:15:47.60
なるほどLocalFreeで解放できるんですね。

>普通は呼び出し元がバッファ用意するなり
固定長になるからどうしようかなとおもって。

>std::string
StringToHGlobalAnsiで領域を確保したのに
stringでまた確保されるのがあれかなとか。
気にしすぎといわれればそうです・・・。

ここまで見た
  • 871
  •  
  • 2014/10/22(水) 13:38:11.49
C#みたいにCodeProviderで動的な文字列をコンパイルして
実行したいんですが、もしかしたらC++/CLIにはCodeProviderが
ないですか?

フリックゾンビ
フリック回転寿司
ここまで見た

★お気に入り追加

このページを共有する
facebook twitter hatena line google mixi email
おすすめワード