くだすれ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
-
- 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が
ないですか?
-
- 872
- 2014/10/22(水) 13:43:12.37
-
すいません、抜けてました。
CodeDomProviderを継承したCodeProviderです
-
- 873
- 2014/10/22(水) 17:09:24.88
-
まあ混合型使えないからそれならC#でいいじゃんってことになるよね
-
- 874
- 2014/11/11(火) 14:49:35.49
-
C++のDLLをC#で使いたいのですがC++/CLIで吸収したほうがいいのかな?
C++の構造体のポインタとかあってわけわからん
-
- 875
- 2014/11/11(火) 16:50:02.76
-
構造体 マーシャリング でぐぐる
-
- 876
- 2014/11/12(水) 00:51:06.13
-
>>874の件ですがC#でなんとかがんばることにしました
お騒がせしました
-
- 877
- 2014/12/09(火) 00:10:16.60
-
C++/cli からC++のプロジェクトに定義している関数を呼び出したいんです。
C++プロジェクトのlibファイルを参照し、includeファイルをC++/cli側に
持ってきて#include すると、物凄い数のエラーがでます。
(C2011:C2079:C2504:C3395:C3699)
[1] C++/cliで参照できるよう、ビルドエラーを直すしかない
[2] 別の方法でC++の関数をビルドエラー無しに参照できる。
ちなみに、C++の関数を参照しないで自作・・・という回答は無しでお願いします。
-
- 878
- 2014/12/09(火) 10:30:47.48
-
物凄い数のエラーじゃなくてエラーの内容をチェックしろよ。
出力ログのエラーの行をダブルクリックすると問題の箇所に飛ぶから
何で再定義だとか定義がないと言われてるか考えろ。
何でその程度のレベルでC++/CLIとかやってんの。
-
- 879
- 2014/12/09(火) 10:30:56.11
-
1.C++から呼び出す
2.C#に移植する
C++/CLIでなきゃいけない理由なんてあるん?
-
- 880
- 878
- 2014/12/09(火) 22:59:58.60
-
すみません、初心者なりにエラーの原因を調べてきました。
a.h
class A : public B {}
b.h
class B {}
この時に Class B で再定義のエラーが発生していました。
a.h が先にincludeされているのが問題で、b.h を先にinclude するよう
ソース修正すれば良い・・・・・ということでしょうか??
-
- 881
- 2014/12/11(木) 12:05:51.55
-
各ヘッダの先頭に#pragma onceと書く
a.hでb.hのクラスを使っているなら
a.h内でb.hをinludeしろ
cpp側でincludeの順を気にしなきゃならないのは糞
-
- 882
- 2014/12/15(月) 20:00:30.77
-
質問です。
任意の型のマネージド配列(cli::array)を、任意の個数、引数として受け取って
それらの配列としての長さの最小値を返す関数を書きたいと思っています。
イメージとしては、
array<String^> arrStr = gcnew array<String^>(6);
array<double> arrDob = gcnew array<double>(8);
array<int> arrInt = gcnew array<int>(3);
に対して、
Function(arrStr, arrDob) = 6
Function(arrStr, arrDob, arrInt) = 3
となるような関数Functionを書きたいと思っています。
しかし、この場合の引数リストの書き方がよくわかりません。
単純に可変長の引数リストだとFunction(... array<Object^>^ args)みたいな
書き方になると思うんですが、これをマネージド配列の配列だからといって
真似てFunction(... array<array<Object^>^>^ arrays)みたいな書き方をしても、
呼び出し側(例えばFunction(arrStr, arrDob)とか)で引数リストが一致しない旨
怒られます。このような場合の適切な引数リストの書き方ってありますか?
あるいは回避策として、引数はFunction(... array<Object^>^ args)としておき
この関数の中でfor each (Object^ arg in args) { argが配列かどうか }という
コードもありえますが、肝心の、「argが配列かどうか」チェックするコードが
わかりません。
上記いずれか一方で構いませんので、解決策をご教授いただけないでしょうか?
-
- 883
- 2014/12/15(月) 20:51:05.44
-
... System::Array^ args
arg->GetLength
... System::Collections::IList^ args
arg->Count
-
- 884
- 2014/12/15(月) 22:28:59.04
-
>>883
試してみましたが、いずれの場合もコンパイルエラーC3132が発生します。
そもそもargの型を何に指定すべきなのか、というのがよくわかっていません。
例えば
int Function(... array<Object^>^ args)
{
int MinLength = -1;
for each(array<Object^>^ arg in args)
{
if ( (MinLength < 0) || (arg->Length < MinLength) )
{
MinLength = arg->Length;
}
}
return MinLength;
}
みたいなコードだと、Function(arrStr, arrInt)を実行したとき、それら引数を
System.Object[]にキャストできない旨を怒られます。
-
- 885
- 2014/12/15(月) 22:43:22.71
-
ごめんちょっとぼけてた
... array<System::Array^>^ args
for each (auto arg in args) { int len = arg->GetLength(0);
... array<System::Collections::IList^>^ args
for each (auto arg in args) { int len = arg->Count;
-
- 886
- 2014/12/15(月) 22:49:54.98
-
>>885
うまくいきました!
動作版のコードは以下の通りです。
int Function(... array<System::Array^>^ args)
{
int MinLength = -1;
for each(auto arg in args)
{
if ( (MinLength < 0) || (arg->Length < MinLength) )
{
MinLength = arg->Length;
}
}
return MinLength;
}
ありがとうございました。
-
- 887
- 2015/01/28(水) 22:20:24.42
-
String^ selectedEmployee = (String^)(ComboBox1->SelectedItem);
^ってどういう意味?
-
- 888
- 2015/01/28(水) 22:43:41.32
-
トラッキングハンドルって意味
-
- 889
- 2015/01/30(金) 16:37:12.12
-
こらこら。
普通のC++でいうところの*だよ。
-
- 890
- 2015/02/06(金) 15:15:17.14
-
>>887
参照型
-
- 891
- 2015/03/01(日) 13:44:47.71
-
既存の native C++ のプログラムからC#で作ったdllを呼び出す必要が出てきたんで
/clrを使おうと思うんだが、.NETを使う部分以外のソースを全部 #pragma unmanaged
しておけば既存のnativeのプログラムと変わらないと考えていいのかな?
スタートアップに時間がかかったりするかもしれないけど。
それ以外になにか、純粋なnativeアプリと比べてのデメリットとかあるだろうか?
-
- 892
- 2015/03/03(火) 10:49:44.41
-
拡張する度にpragma追加するのが面倒くさいからCOM exportのがいいよ
-
- 893
- 2015/03/03(火) 22:20:54.28
-
COMはregistryやGACに登録しないとならないのが。それがなければ使いたいんだけど。
pragamはまぁ、stdafx.hに仕込んどけばいいだけなんで。
で、試してみて一応ビルドは通って、DependencyWalkerで見てもほとんど同じに見えたけど、
起動時に例外が出てうまく立ち上がらなかった。
どちらにしても、ビルドに時間がかかるんで普通にwrapperだけC++/CLIで作った方が楽そう。
-
- 894
- 2015/03/03(火) 23:37:18.31
-
Register freeのcomが良い
-
- 895
- 2015/03/04(水) 00:00:58.99
-
ほー、Interopでも登録なしで使えたのか。知らんかった。
-
- 896
- 2015/04/11(土) 23:36:34.69
-
http://peace.2ch.net/test/read.cgi/tech/1420379468/279
から誘導されてきました。
質問です。
実行時にフォームをイベントごとコピーしたいのですが、
元のイベント関数のハンドラが取れず、上手く行きません。
解決策があれば教えてください。
やりたいこと:
チェックボックス等のフォームをデザイナで指定し、イベント関数もデザイナで指定します。
プログラムでこのチェックボックス等を10個ほどにコピーし、並べます。
このときにプロパティ等はコピーできますが、イベント関数がコピーできません。
理由:
位置決めが楽なので、デザイナ側で頭のFormは指定したいのです。
そして管理上分かりやすいので、イベントもそこに書いて、これをコピーしようとしています。
ところがEventInfo::GetRaiseMethodではnullが返ってきてしまいます。
ハンドラさえ取れれば以下と組み合わせて上手く行くと思うのですが。
https://msdn.microsoft.com/ja-jp/library/ms228976%28v=vs.110%29.aspx
状況:
なおC#だと以下で上手く行きます。
http://stackoverflow.com/questions/6055038/how-to-clone-control-event-handlers-at-run-time
ただしC++だと、GetField("events")がnullptrを返してくるので駄目です。
キーワードは色々試してみましたが、当たりませんでした。
前から困っている点で、とらいえずいちいち書いて対応していますが、
見ていて汚いので書き直したいと思っています。
気長に待っていますので、どなたか対策をご存じの方はレスよろしくお願いします。
-
- 897
- 2015/04/12(日) 03:07:38.87
-
auto f = (Component::typeid)->GetField("events", BindingFlags::NonPublic | BindingFlags::Instance);
auto v = f->GetValue(checkBox1);
f->SetValue(checkBox2, v);
でふるまいが同一になるけど。
-
- 898
- 2015/04/12(日) 03:39:58.42
-
>>897
お早い回答ありがとうございます。
こちらで確認した結果、確かに動きました。
(Component::typeid) のところを私は Component::GetType() にしていたのが敗因のようです。
見よう見まねでやっているため、実はここら辺のところがいまいち分かっていません。
お手数をおかけ致しました。また、ありがとうございました。
-
- 899
- 2015/04/12(日) 03:49:39.70
-
Component::GetType() は Form の中でなら GetType() と同じ。
C++で親クラスのメソッド呼ぶときの文法よ。
-
- 900
- 2015/04/12(日) 10:00:53.76
-
>>899
了解です。ありがとうございます。
FormがComponentを継承しているのを関知していませんでした。
このページを共有する
おすすめワード