X



くだすれC++/CLI(初心者用)part2
■ このスレッドは過去ログ倉庫に格納されています
0001./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
0750デフォルトの名無しさん
垢版 |
2013/11/10(日) 13:53:11.58
C#で書いて問題になるほど遅かったら移植すればいいでしょ
実際そんなに変わらないけどな
パフォーマンスの心配は9割無駄だからくだらないこと気にしてないでまずは動かせ
先入観でパフォーマンスを考えるほど無意味なことはない
0751デフォルトの名無しさん
垢版 |
2013/11/10(日) 14:12:32.92
とりあえずC#で書いてみて,処理速度がDLLを呼び出す方法と対して変わらないようであれば,
DLL使わずにC#だけで書くようにしたいと思います.

ありがとうございました.
0754デフォルトの名無しさん
垢版 |
2013/11/11(月) 09:48:07.24
>748
アルゴリズムをunmanagedで書くなら、たしかにSSE2 intrinsicとか使えば圧倒的なスピードが出る。
でも、それならP/Invokeでいいのでは感がある。
0758デフォルトの名無しさん
垢版 |
2013/11/21(木) 11:24:38.95
>>757
C#が遅いとか言ってる奴いるけど、C#で多次元配列をこう書くと遅くなるんよ
ジャグ配列を使うか一次元配列で処理すれば、C++とほぼ同じ速度で処理出来るが
0759デフォルトの名無しさん
垢版 |
2013/11/21(木) 22:16:01.02
だからポインタでアクセスできると言ってるでしょ
ポインタ使えば多次元配列でも1次元配列をforループで回して最適化が効いた時と同程度には速くなるよ
0760デフォルトの名無しさん
垢版 |
2013/11/21(木) 23:39:11.69
あれ?遅いのはジャグ配列じゃなかったか?
最近別言語の案件やってるんで忘れてしまったわ
0761デフォルトの名無しさん
垢版 |
2013/11/21(木) 23:47:38.45
bmp[y][x]をx方向に処理する場合は1次元配列の連続アクセスと同じなので速い
y方向だと無茶苦茶効率悪いから多次元配列のほうが有利
0765デフォルトの名無しさん
垢版 |
2013/12/16(月) 23:15:56.37
ある外部staticライブラリをつかうプロジェクトをVS2008で作ったんですが
それをデバッグリンクすると実行時にランタイムでヒープが壊れてるとか
アサートだします。
出すところは外部ライブラリで
static std::map<>;
してグローバルにmapを作ってるところです。

clrなしのプロジェクトを作ってやってみると問題ないんですがなにが悪いんでしょう?
ランタイムライブラリはどちらも/MDdで外部ライブラリと同じです。
0768デフォルトの名無しさん
垢版 |
2013/12/17(火) 17:35:03.34
OnPaintBackgroundさせないようにするため
Panel継承したMyPanelを作り、
今までgcnew Panelされてた部分をMyPanelに置き換えたら、
デザイン編集する画面がエラーになりました。

継承したコントロールをデザインで使う方法か
Panelコントロールの再描画を継承しないですむ方法ありますか?
0769デフォルトの名無しさん
垢版 |
2014/01/29(水) 15:03:47.19
C++/CLIってUNICODE使うのがデフォ?
0771デフォルトの名無しさん
垢版 |
2014/02/16(日) 08:13:15.62
VC6以来のWinアプリの仕事何だけど
最近は.net使えばグラフ表示とか簡単にできるようになったの?
それともGDI使うやり方健在?
0776771
垢版 |
2014/02/17(月) 18:45:06.84
オシロの画面みたいなのを1秒あたり10フレームくらい表示させたいのですが,,,
0780デフォルトの名無しさん
垢版 |
2014/02/20(木) 17:38:23.07
今のPCなら10fpsは全くもって問題無い
俺は初めて自力描画したが、25ms間隔でUSB送信+描画が全く問題無かった
0781デフォルトの名無しさん
垢版 |
2014/02/22(土) 18:10:01.30
C++プロジェクトとC#プロジェクトからなるソリューションを
作る場合は、DllImport を使うのが正統的なやり方ですか?
0784デフォルトの名無しさん
垢版 |
2014/02/22(土) 18:21:31.68
でもさ、C++/CLIって今はWindowsフォームアプリ作れなくなったというか、非推奨でしょ?
ヒッジョーに残念なんだけど、俺はクソなC++Builder使ってる
0785781
垢版 |
2014/02/22(土) 19:14:11.22
>>782,783,784
最近C++始めました。今まで作ったC#の自作ライブラリをC++化しようとしています。
CLRクラスプロジェクトでクラスライブラリを作ってC#アプリから使う場合は、普通に
参照設定して使えましたが、でもそれだと、クラスライブラリの中身がReflectorなどで
見えてしまうので、それで/clr無しでビルドしてDllImportの方法でC#から使えたのですが、
これが正しいやり方かどうか知りたかったのです。要するに、逆コンパイルできない
(あるいは難しい)クラスライブラリを作りたいのですが。
0787781
垢版 |
2014/02/22(土) 20:01:19.06
>>786
それも考えたのですが、C#のDLLを難読化するくらいなら、C++でDLL
作るほうが手間がかからないかなと思ったのですが。
皆さん、こういう用途には、VS2013付属の難読化ソフトで十分ですか?
0791デフォルトの名無しさん
垢版 |
2014/02/24(月) 12:18:42.22
> clr:safeや/clr:pure
これ使うならC++/CLI使う理由が消えないか?
難読化がC++/CLI使う目的ならなんか違う気がする
業務か趣味かでも違うし
0794デフォルトの名無しさん
垢版 |
2014/02/26(水) 14:39:40.34
わざわざネイティブコードがちょろっとついてたら、まっさきにそこ覗くけどね
まあしっかり考えて。
0795デフォルトの名無しさん
垢版 |
2014/02/26(水) 15:10:45.06
確かに、覗いてみたくなるな
Dependency Walkerに放り込むだけでもそれなりに見えてくるしな
0797デフォルトの名無しさん
垢版 |
2014/02/27(木) 00:13:46.26
ILが解析しやすいのはディスコンパイルできることよりも、
型名やメソッド名などのメタ情報がそのまま残ってることだから、
その辺改善したほうがましだな。
簡単な難読化ツールのやってることもその程度だし
0798デフォルトの名無しさん
垢版 |
2014/03/08(土) 21:13:21.28
>>784
俺は顧客の強い要望でVS2013 expressのVC++でWindows formアプリを作ってる。
非推奨だけど、作ろうと思えば一応作れるのね。
0802デフォルトの名無しさん
垢版 |
2014/03/11(火) 10:59:46.32
ATL/MFC無しでもCStringくらい標準にしてくれるといいのにね
System::Stringからの変換がスマートにできるのに
0805デフォルトの名無しさん
垢版 |
2014/03/11(火) 23:00:52.68
ウィザードやリソースエディタなんかがないとまともに開発には使えないだろうけど、
MFCのコードをビルドだけできるようヘッダとライブラリを公開して欲しいとは思う。
0806デフォルトの名無しさん
垢版 |
2014/03/15(土) 21:18:07.18ID:KpGSNq9a
C++/CLIとC#を相互運用するとき、IDisposableの扱いについて参考になるWebページがあれば教えてください。
0807デフォルトの名無しさん
垢版 |
2014/03/20(木) 14:59:59.03ID:svYczKSB
初歩的な質問ですみません。

^ がついた関数と ^ がついていない関数の間でやりとりをしたいのですが、
やりかたが分かりません

例えば時間を再設定するときに、
DateTime^ dth = gcnew DateTime(2014, 3, 20, 0, 0) と
DateTime dt = DateTime(2014, 3, 20, 0, 10) を作ったとして、

dth = dth->AddSeconds(10) とかではなく、

dth = dt.(なにかの変換演算子) で時間を再設定してみたいのですが、
なにか方法はありませんか?
0810デフォルトの名無しさん
垢版 |
2014/03/20(木) 17:57:34.38ID:iFIpmoD3
C++/CLIで作っているフォームの表示が気づいたらXP仕様になってしまいました
過去につくった物はWin8仕様の表示になっているのですがどこの設定で変更できるのでしょうか
環境はWindows8.1でVS2012です
0812デフォルトの名無しさん
垢版 |
2014/03/20(木) 20:28:07.59ID:svYczKSB
807です。質問の時に代入する方向が逆でしたが、もらったヒントで
無事解決できました m(_ _)m

dth = %dt; // DateTime^ = DateTime
dt = static_cast<DateTime>(dth); // DateTime = DateTime^
0813デフォルトの名無しさん
垢版 |
2014/03/20(木) 21:58:05.31ID:geioZCY7
2段目のはこれでいけるな。
dt = *dth

 -> が *. なのもCの文法と同じ。
dth->AddSencond(...)
(*dth).AddSencond(...)
0815デフォルトの名無しさん
垢版 |
2014/03/23(日) 21:20:34.11ID:HlHPSHO4
質問失礼します
クラスaの配列をメンバ変数に持つクラスbを作りたいのですが、クラスaの配列の初期化がうまく行きません。(コンパイル自体はできます)
これは初期化の方法が間違っているのでしょうか?
それともそのような設計(クラス配列を持つクラス)自体がよろしく無いものなんでしょうか?

ref class a
{
  int x;
public: a(int num){x = num;}
};

ref class b
{
  array<a^>^ array_a;
public:
  b(){
    array_a = gcnew array<a^>(10);
    for (int i = 0; i < array_a->Length; i++)
    {
      array_a[i] = gcnew a(i);
    }
  }
};
0817デフォルトの名無しさん
垢版 |
2014/03/23(日) 22:35:57.72ID:HlHPSHO4
実体がない(?)と言いますか、array_aに何かしようとすると、その関数のそれ以降の処理をすっ飛ばすようになります。

例えばクラスaにint GetX(){return x;}、
クラスbにint GetArrayA(int num){return array[num]->GetX();}みたいな関数を追加して、
ウィンドウズFormの方でLabelを一つ用意します。

private: System::Void MyForm_Load(System::Object^ sender, System::EventArgs^ e) {
  b^ test;
  test->GetArrayA(0);
  Label1->Text = "だいじょうぶ";
}

これだと、Label1->Textは「だいじょうぶ」に変わらずLabel1のままです。
しかし
>test->GetArrayA(0);
の部分をコメントアウトにするとLabel1->Textは「だいじょうぶ」になります。
0819デフォルトの名無しさん
垢版 |
2014/03/23(日) 23:36:35.34ID:HlHPSHO4
>>818
817もコンパイルは通ります
あと、今試してみたんですが出来上がったexeファイルを起動してみると
「アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。(中略)
オブジェクト参照がオブジェクトインスタンスに設定されていません」
と出ますね……
こちらもまたtest->GetArrayA(0);の部分をコメントアウトすると問題なく起動します
0822デフォルトの名無しさん
垢版 |
2014/03/24(月) 11:45:41.86ID:R2MpMn2O
デバッガ使えない環境なのかな、、、
例外起きた時は出力ウィンドウに出るぜ
0825デフォルトの名無しさん
垢版 |
2014/05/09(金) 18:40:24.14ID:avbF2wuD
c++/cli勉強したいと思っています。
>>array<a^>^ array_a;
の<a^>^ってどいういう意味ですか?
顔文字に見えます。ググりたいのですが^>^でググっても
ヒットしません。キーワードを教えてけろ。
0829デフォルトの名無しさん
垢版 |
2014/05/13(火) 09:25:37.06ID:QKhoqLLT
ジェネリックメソッドの継承がうまく行きません。

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;
}
};

同じ戻り値と引数でも、同じ関数だと認識されないようなのですが、どのようにすれば良いですか?
0830デフォルトの名無しさん
垢版 |
2014/05/13(火) 10:02:57.61ID:Kixx6i0Q
ttp://social.msdn.microsoft.com/forums/vstudio/ja-JP/2f138907-64a3-4326-bfea-d0e4b3c15fa8
仕様っぽいのであきらめてC++/CLI投げ捨ててC#で書く
0832デフォルトの名無しさん
垢版 |
2014/05/13(火) 23:30:42.34ID:OiuzuWyN
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' がデータ メンバーでなければなりません
といったエラーが発生してしまいます。
0834デフォルトの名無しさん
垢版 |
2014/05/13(火) 23:47:44.50ID:OiuzuWyN
>>833
あーeventキーワード取っ払ったら通りました。ありがとうございます。
そこでコンパイルエラーにしてくれたらいいのに…。
0835デフォルトの名無しさん
垢版 |
2014/05/14(水) 08:39:30.20ID:ICklhj5Y
event自体は正当で使う側が問題なのに、eventの方でコンパイルエラー言われても
0837デフォルトの名無しさん
垢版 |
2014/05/14(水) 23:09:07.27ID:OfRhuTl1
すいません>>832です。
禿しく勘違いしてました。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;
などとしたら上手くいきました。
0838デフォルトの名無しさん
垢版 |
2014/05/26(月) 03:20:04.74ID:l0k3Jdk0
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関数を定義することは可能でしょうか?
0843デフォルトの名無しさん
垢版 |
2014/06/16(月) 00:28:31.77ID:KzXlrctf
c#で書かれたdllを呼び出すc++/cliのラッパー
static libを作り、それを呼び出すc++のコードを
書けば、c++でc#のdllを呼び出す事が出来ますか?
0845デフォルトの名無しさん
垢版 |
2014/06/16(月) 11:06:40.38ID:KzXlrctf
>>844
コメントありがとうございます。
c#からc++を呼び出す例はググるとたくさんあるの
ですが、c++からc#を呼び出す良い例、どこかに
ないでしょうか?
0846デフォルトの名無しさん
垢版 |
2014/06/20(金) 23:37:50.80ID:oekTSRl4
std::regexで"["や"]"などの文字を扱うにはどう書けばいいですか?
たとえばテキスト中に"[43]"などの[]で囲まれた数字があるかどうか知りたいのですが。
0849デフォルトの名無しさん
垢版 |
2014/06/25(水) 18:40:03.79ID:a/L3Ky6p
こんどCLI+API+STLで久々に開発するぜ
まともにWindowsアプリ作るの15年ぶりだぜ
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況