くだすれC++/CLI(初心者用)part2

■ このスレッドは過去ログ倉庫に格納されています
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
2./1256645713/662
垢版 |
2010/03/15(月) 09:45:45
ドキュメントの MSDN には、System::String(SByte*); て書いてあるけども、
System::String(char*); が正解ってことか?

それとも SByte が signed char ではなくて char てこと?それは無いような気が。

ちなみに、使ってる教科書のサンプルプログラムは8bitでは char* 配列を渡してる。
2010/03/17(水) 19:44:10
厳密名の付け方が分かりません
検索しても意味不明なものしか引っかからない
4デフォルトの名無しさん
垢版 |
2010/03/17(水) 21:02:17
開発でつかわれてるのかな?
C++/CLIって。
2010/03/17(水) 21:41:39
必要なら使われるだろ。
だからなんなんだ?
2010/03/17(水) 22:37:29
>>3
LINKにある。
/KEYCONTAINER /KEYFILE
2010/03/17(水) 22:45:13
というか必要な時だけ最小限使うもの
基本的に使わないほうがいい
2010/03/18(木) 00:33:17
最近妙にお気に入り
2010/03/18(木) 09:03:31
Managed C++でさえ一部で使われていた。
2010/03/22(月) 19:23:41
フォームの中にあるテキストボックスの内容をmainとか関数とかから書き換えたいんだけど
どんな方法があるでしょうか?
今までは強引にチェックボックスにチェックが入ると
void test(System::Windows::Forms::TextBox^ tb_log_view);
こんな感じの関数呼び出してTextBoxを強引にわたして指定の処理して
テキストボックスにメッセージ表示させてたんだけど
何せ使い勝手が悪いので・・・
2010/03/25(木) 01:29:18
String^使えばいいんちゃう?
12デフォルトの名無しさん
垢版 |
2010/03/25(木) 18:00:01
今、「Cで書かれたライブラリをC++/CLIでラッピング(DLL化)し、
C#で使おう」という目的に向けて、Cのライブラリをラッピング中ですなのですが、構造体で悩んでます。
C++/CLI側でC#側に「構造体の配列」を返す関数が見せてるのですが、実行すると思ったように動きません。

C++/CLI側
[宣言]
public ref struct SampleStruct {
  static CHAR cUpdate;
};
static array<SampleStruct^>^ pstSample = gcnew array<SampleStruct^>(10);

関数
array<SampleStruct^>^ hogehoge(){
  if(pstSample[0] == nullptr ){
    for(int i=0; i<10; i++ ){
      pstSample[i] = gcnew (SampleStruct);
    }
  }
  pstSample[2]->cUpdate = 2;
  return pstSample;
}

C#側
SampleStruct[] stTest = new SampleStruct[10];
stTest = LIBSAMPLE.hogehoge();

ここで、stTest[0].cUpdateからstTest[9].cUpdateまでを見ると
全部2が入っております。(本当は[2].cUpdateだけ2が入っていて欲しい)
どこが原因か分かりますでしょうか?
OS:XP
環境:VS2008 ExpressのC++版とC#版を使ってます。
2010/03/25(木) 18:34:20
>  static CHAR cUpdate; 
Cさえ理解していないのがよくわかる。
2010/03/25(木) 18:45:45
うわ・・・・・
泣ける・・・・orz

回答有難うです
2010/03/25(木) 18:53:51
突っ込みどころや怪しい箇所が多すぎて、どうしたいかが見えてこない(笑
配列はC++/CLIでアロケーションしていいのかとか。
C#でいう構造体はvalue class (or struct)であって、ref structはクラスだけどどっちにしたいのとか。
1612,14
垢版 |
2010/03/25(木) 19:13:48
目的は、「Cで書かれたライブラリをC#で使う」事なのですが、
現状は、Cの方には手を加えないように、やる方法として、C++/CLIで
ラッピングするという手段があるという事なので、作業している次第。

そこで、構造体のポインタを戻り値としている関数はどう扱えば?と
思ってましたら、
http://ap.atmarkit.co.jp/bbs/core/fdotnet/17380
このような話をみつけたので、まずはref structでやってるという状況です。
2010/03/25(木) 20:50:34
CのライブラリだったらC++/CLIなんか使わずにC#でDllImportすればいいような
1812,14
垢版 |
2010/03/26(金) 09:55:14
>>17
説明不足でした。
(当然の疑問ですよね)

そのCのライブラリというのが、元がスタティックしか考慮されておらず、
DLL用にはなってなく(__declspec(dllexport)のような記載は一切なし)、
選択肢として
1 Cのソースをdll対応に修正(__declspecを全関数に追加)
2 元のCには手を加えず、新しくラッパーを作る

があり、今後もCの方は勝手にバージョンが上がっていくので、
それなら、元のソースに手を加えない方向でやろうとなった次第です。
2010/03/26(金) 10:26:08
だからってそのラッパーをC++/CLIで書く必要はないだろ
Cで薄ーいラッパー書いて普通のネイティブDLLとしてコンパイルすればおk
C++のライブラリとなると面倒だけどそうでないならC++/CLIはできるだけ避けたほうが賢明
2012,14
垢版 |
2010/03/26(金) 12:05:28
>>19
その手がありましたか!
C#でDllImportして、
DLL関数に渡す構造体、DLL関数から受け取る構造体は
[StructLayout(LayoutKind.Sequential)]を用いてC#側に定義して
やりとりするという事ですね。

試してみます
21デフォルトの名無しさん
垢版 |
2010/04/25(日) 20:06:11
【初心者歓迎】C/C++室 から誘導されてきました。

Form1とForm2があり、Form1からForm2を呼び出すようにしています。
また、Form2に配置したボタンを押すと関数が呼び出されて、所望の処理をするようにしています。
以下の2点について教えてください。

1.関数内の処理の進捗をForm2内のLabelやProgressBarに表示したいです。
2.Form2からForm1を操作したい(Form2のボタンを押すとForm1/Form2ともに終了するようにしたい)です。

両方ともポインタを使えば出来そうな気がするのですが、例えば2.の方ではForm2を指すポインタの宣言の仕方が
わからないです。

よろしくお願いします。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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