C++/CLI part3at TECH
C++/CLI part3 - 暇つぶし2ch322:デフォルトの名無しさん
08/12/01 20:31:51
Native C++の2次元配列から、C++/CLIの2次元配列に値をコピーしたいのですが、1つ1つの要素を代入する以外の、
一発でコピーできる方法が分からなくて困っています。
1次元配列の場合は、
double nativeVec[3] = {1, 2, 3};
array<double> ^cliVec = gcnew array<double>(3);
System::Runtime::InteropServices::Marshal::Copy(IntPtr(nativeVec), cliVec, 0, cliVec->Length);
でコピーできますが、
2次元配列の場合はどうすればいいのでしょうか?
以下のコードでは動きませんでした。
double native2DVec[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
array<double> ^cli2DVec = gcnew array<double, 2>(3, 3);
System::Runtime::InteropServices::Marshal::Copy(IntPtr(native2DVec), cli2DVec, 0, cli2DVec->Length); // ここでエラー
エラーは、
error C2665: 'System::Runtime::InteropServices::Marshal::Copy' : 16 オーバーロードのどれも、すべての引数の型を変換できませんでした
です。


323:デフォルトの名無しさん
08/12/01 21:08:52
ピンしてmemcpyでどうだ。
#include <cstring>

double native2DVec[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
array<double, 2> ^cli2DVec = gcnew array<double, 2>(3, 3);
pin_ptr<double> p = &cli2DVec[0, 0];
std::memcpy(p, native2DVec, sizeof native2DVec);

std::copyでもできたけど、書くのが面倒だった。

ところで多次元配列の要素の連続性の保証ってあるよね?

324:デフォルトの名無しさん
08/12/01 21:52:35
>>323
できました!
連続性の保障は怪しい気もしますが、とりあえずは手元で動くのでokということにしておきたいと思います…

325:デフォルトの名無しさん
08/12/02 00:28:22
マネージ多次元配列はメモリレイアウトに関してなんら保障してなかったような・・・
ジャグ配列にして一行ずつコピーした方がいいんでね?
マーシャリングはともかくアクセスはジャグの方が速いし。

326:デフォルトの名無しさん
08/12/02 03:54:37
>>325
3x3行列なので、ジャグ配列にするのもなんかなあ、という気分なのです。
最悪2重forでコピーかなあ。

327:デフォルトの名無しさん
08/12/02 20:04:50
小さい行列を大量に扱うんだったら>>322-323みたいなのはかなり非効率だと思うよ
3×3と決まってるなら手打ちでいいじゃん

328:デフォルトの名無しさん
08/12/12 00:25:00
MFCのダイアログアプリで質問です。
画面上のボタンを押すとWindowsForm画面を開いています。
こんな感じです

ボタンの処理
Form1 ^ fm = gcnew Form1;
fm->Show();

画面は普通に開きますが
別プロセスみたいにメイン画面の下に隠れます
親ハンドルを指定すればいいのかな?と思い
下のようにしても裏に隠れます

Form1 ^ fm = gcnew Form1;
fm->Show(fm->FromHandle(GetSafeHwnd()));

親子関係にするにはどうやればいいのかわからないです。
fm->Parentやfm->Ownerを設定してもダメでした

MFCダイアログとWindowsForm画面の親子関係は無理なんでしょうか?
やりたいことはMFC画面上に.NETコンポーネントである
グラフコントロールを表示したいだけです。
素ではダイアログに組み込めないのでWindowsForm画面に組み込み
子画面として特定の位置に固定させようとしています。
画面は表示できたのに位置合わせだけがダメです。



329:デフォルトの名無しさん
08/12/12 08:05:01
MFC 側で Window Activate 時に Form を前にしてやればいいんじゃね?

330:デフォルトの名無しさん
08/12/12 08:07:09
後は、ホストするか
URLリンク(msdn.microsoft.com)(VS.80).aspx

331:328
08/12/12 08:28:12
レスありがとうございます。
少し進展がありました。

ラッパーというのを作って
public ref class HwndWrapper : public IWin32Window
{
public:
HwndWrapper(HWND handle)
{
this->handle = static_cast<System::IntPtr>(handle);
}

virtual property System::IntPtr Handle
{
System::IntPtr get()
{
return handle;
}
}

private:
System::IntPtr handle;

};



332:328
08/12/12 08:29:03
Showのところでこうやると親子関係できました。

HwndWrapper ^ww = gcnew HwndWrapper(GetSafeHwnd());
fm->Show(ww);

ただ、親が動いても子は元の位置のままなのでちょっと不便です
ウインドウ上にボタンが乗ってるように一緒に移動してくれません。
MFC側でコントロールするとどうしても遅れが生じるので不自然っぽいです。

どうもうまくいかないので教えていただいた
「MFC ダイアログ ボックスとしての Windows フォーム ユーザー コントロールのホス」
の方をやってみます。

333:デフォルトの名無しさん
08/12/12 10:02:59
子ウィンドウとownedウィンドウの区別も付いてないのか

334:328
08/12/12 10:52:09
ホストの方法でいけました
ありがとうございました

335:デフォルトの名無しさん
08/12/13 18:30:25
ぬこでも~のwindows SDK編のイントロダクションのコードが
cygwinでコンパイルで通りませぬ・・・
VSでも無理だったんですが原因わかりますか?

URLリンク(www.kumei.ne.jp)

336:デフォルトの名無しさん
08/12/13 18:38:46
スレチ、winAPIスレへ行け

337:デフォルトの名無しさん
08/12/13 18:53:26
char使ってるからunicodeがらみだろうが
すれ違いの上エラーの内容も書かない阿呆か。

338:デフォルトの名無しさん
08/12/15 01:57:38
VS2005の環境でプログラム書いていたのですが、
テキスト形式のデータを読みだそうとすると以下のエラーが出てきてしまいました。

System.ObjectDisposedException' のハンドルされていない例外が mscorlib.dll で発生しました。

追加情報: 閉じている TextReader から読み取ることはできません。

System.ObjectDisposedExceptionのことを調べてもいま一つどういうことなのかがわからなかったので、
何がダメだと言われているのか教えていただけないでしょうか?
初心者なので意味不明な質問になってしまっているかもしれませんが、よろしくお願いします。

339:デフォルトの名無しさん
08/12/15 02:03:39
端的に言えば、Close/Disposeを読んだ後に、まだ何かやろうとしてるということ。
自分でそれらを呼んでいるか、自動変数のスコープを抜けるときに自動的に呼ばれたか。

340:デフォルトの名無しさん
08/12/15 10:29:08
元のコードに原因がある。

341:デフォルトの名無しさん
08/12/15 13:12:47
>338
こっち池

くだすれ.NET(超初心者向け)
スレリンク(tech板)

342:デフォルトの名無しさん
09/01/04 04:35:53
参照クラスって、使用しなくなったインスタンスを自動開放してくれるって
ことでいいんだよね?

343:デフォルトの名無しさん
09/01/04 14:11:08
そんな単純なものじゃない
住む世界が違う

344:デフォルトの名無しさん
09/01/11 01:45:20
この言語でMFCは使えるんですか?

345:デフォルトの名無しさん
09/01/11 01:46:21
使える

346:デフォルトの名無しさん
09/01/11 02:07:07
フォームアプリからMFCサポートに変更
MFCアプリから.NET使用&フォームアプリダイアログ作成
できるんですか?

347:デフォルトの名無しさん
09/01/11 02:08:36
できる。聞くばかりじゃなくて、やってみればいいだろ
単純な MFC アプリケーション作って、そこで CLR サポート有りにすればいい

348:デフォルトの名無しさん
09/01/11 02:11:00
MFCウィンドウ内に.NETコントロールを置くほうはCWinFormsControl/View/Dialgのクラスもある。

349:デフォルトの名無しさん
09/01/11 16:10:30
全然わかりません、MFCで共通言語ランタイムサポートを選ぶと/MTと一緒はダメと言われます。どの項目を選んでもダメです。
これはどうすればいいんですか?

350:デフォルトの名無しさん
09/01/11 16:38:36
MFC の共有DLLを使えよ。どの項目を選んでも駄目ですって条件反射で書いてるんじゃねぇ

351:デフォルトの名無しさん
09/01/12 11:22:55
VS2008を再インストールしたら治る可能性があります。とかいうからやったらほんとに治った
共通言語ランタイムサポートにできました!

352:デフォルトの名無しさん
09/01/18 05:10:12
アンマネージからrefクラスの関数を呼び出すにはどうすればいいんですか?

353:デフォルトの名無しさん
09/01/18 05:36:03
managed -> managed で呼び出すのと同じ

354:デフォルトの名無しさん
09/01/18 05:39:11
>>352
静的メンバなら>>353の言うとおり。
非静的メンバの場合、#pragma unmanagedや/clrなしの領域から直接呼ぶことは不可能。
#pragma managedな領域にそれを呼び出すだけのラッパー関数を置くしかない。
インスタンスの保持だけは、<msclr/gcroot.h>してmsclr::gcroot<>で可能。
例えばこんな感じ。
#include <msclr/gcroot.h>
msclr::gcroot<System::Object^> CreateObject()
{
return gcnew System::Object;
}
int GetHashCode(msclr::gcroot<System::Object^> const& h)
{
return h->GetHashCode();
}
#pragma unmanaged
#include <iostream>
int main()
{
msclr::gcroot<System::Object^> h = CreateObject();
std::cout << GetHashCode(h) << std::endl;
}


355:デフォルトの名無しさん
09/01/18 05:40:25
ラッパーはmanaged領域でのネイティブクラスでも可能。ただし、依然としてmsclr::gcrootは必要。
#include <msclr/gcroot.h>
class XObject {
public:
XObject() : o(gcnew System::Object) {}
int GetHashCode() {return o->GetHashCode();}
private:
msclr::gcroot<System::Object^> o;
};
#pragma unmanaged
#include <iostream>
int main()
{
XObject o;
std::cout << o.GetHashCode() << std::endl;
}

356:デフォルトの名無しさん
09/01/18 05:51:22
はっきり言って全然わかりません。同時に使うのは厳しすぎますね
じっくり解読しますありがとうございます。


357:デフォルトの名無しさん
09/01/18 07:01:49
354と355のコードでは、refクラス = System::Object、関数 = GetHashCodeとして書いてある、一応。

358:デフォルトの名無しさん
09/01/30 01:24:35
なぜに、MFC+.NETなんて使う必要があるんだ?
.NETが許される案件なら.NETで押し通せばいいじゃん

大抵の案件は、.NETは拒否られる



359:デフォルトの名無しさん
09/01/30 01:28:02
自分の狭い世界で語られてもな

360:デフォルトの名無しさん
09/01/30 02:06:05
.NETは遅い

361:デフォルトの名無しさん
09/01/30 02:35:18
そーだね
でもrubyよりは速いよ
起動以外は

362:デフォルトの名無しさん
09/01/30 21:08:41
Visual Studio 2008がやたら、重いんで
ちょっとしたテストプログラムはテキストエディタで作成して
コマンドラインからビルドしたいんですけど、どうすればいいのかしらん?


363:デフォルトの名無しさん
09/01/30 21:16:08
nmake か VCBuild を使う

364:デフォルトの名無しさん
09/01/30 22:18:18
C++/CLIのString型とC言語のchar文字列は、
どのようにデータをやり取りさせればいいのでしょう?

char c_str[]="1234";
String ^cli_str;

cli_str = c_str; // cli_strに"1234"をコピー

と言った事をやりたいのですが。



365:デフォルトの名無しさん
09/01/30 22:31:23
cli_str = gcnew String(c_str);


366:デフォルトの名無しさん
09/01/30 22:34:52
2008以降ならmarshal_asおよびそのソースコード

367:デフォルトの名無しさん
09/01/30 22:40:43
バカ正直にやるならASCIIEncoding

368:デフォルトの名無しさん
09/01/30 22:46:30
その実体はMultiByteToWideChar

369:デフォルトの名無しさん
09/01/30 22:49:20
ありがとうございます。
コンパイルやってみて上手く動きました。

String型文字列をchar型にコピーするのについても質問したいのですが、

c_str[0]=cli_str[0];

というのを繰り返す事でコピーできる事まで調べました。
これを行う為の関数のようなものはあるのでしょうか?

370:デフォルトの名無しさん
09/01/30 23:00:33
・・・みんないっぱい検索キーワード出してるじゃん
まじめに探したの?

371:デフォルトの名無しさん
09/01/30 23:08:35
marshal_contextを使うか、CString/CStringA/CStringWを使うか。
どっちもexpress edtionだと使えなかったと思う。
裏技的にはsprintfを使う方法がある。


372:デフォルトの名無しさん
09/01/30 23:12:30
だから、WideCharToMultiByte があるじゃないか

373:デフォルトの名無しさん
09/01/30 23:17:04
>>372
それは単なるUNICODE-ANSI変換でない?

残りの方法はこんなとこ、使い方はぐぐってね。
Marshal::StringToHGlobalAnsi
Marshal::StringToHGlobalUni
PtrToStringChars

374:デフォルトの名無しさん
09/01/30 23:18:12
>>369
それ仮名・漢字が入ると死ぬよ。

375:デフォルトの名無しさん
09/01/30 23:19:24
Encodingが一番確実か

376:デフォルトの名無しさん
09/01/30 23:25:26
>>373
Unicode -> MBCS変換だろうけど
WideCharToMultiByteは変換に使えないの?

377:デフォルトの名無しさん
09/01/30 23:28:02
>376
そのまえにToArrayしてpin_ptrして、サイズ計算して、領域確保して変換だから
ほかの方法のほうが断然楽

378:デフォルトの名無しさん
09/01/31 01:33:06
>>377
ToArrayよりPtrToStringCharsだろ。
いずれにせよ、pin_ptr<const wchar_t>化してしまえば、
既存のライブラリが使えるので、持ち合わせがあればそんなに悪くない選択肢だと思う。

379:デフォルトの名無しさん
09/01/31 14:04:04
C++/CLIで書いたプログラムって
Monoで動く?


380:デフォルトの名無しさん
09/01/31 14:09:57
動くのもあるし、動かないのもある

381:デフォルトの名無しさん
09/01/31 14:23:46
/clr:safeのものは動く。
ただしSTL/CLIのサポートはまだのようだった。

382:デフォルトの名無しさん
09/02/01 01:06:00
cl.exe でコマンドラインからコンパイルすると
~.exe.manifest
なるものも生成され、削除すると~.exeが起動しなくなります。

exe単体で起動できるようにするにはどうしたらいいのですか?


383:デフォルトの名無しさん
09/02/01 01:13:32
>>382
mt -manifest HOGE.exe.manifest -outputresource:HOGE.exe;#1
これやると、manifestがexe内に埋め込まれるので、manifest無しで動く。

384:デフォルトの名無しさん
09/02/01 01:29:08
>>383
ありがとう

できました。多謝です

385:デフォルトの名無しさん
09/02/01 23:49:39
CLIスレ伸びませんねw

実際に使ってるところある?

386:デフォルトの名無しさん
09/02/02 00:27:50
仕事で事前調査用に使ったが、周りに理解されず、本番はVC++6.0でMFC4.2ときたもんだwww

なんか、布教にいい道具があればいいのだけど…。

387:デフォルトの名無しさん
09/02/02 01:41:31
WPFとかに対応しない限りまず消滅すると思った方がいいだろうね。


388:デフォルトの名無しさん
09/02/02 02:25:50
WPFが俺の思ってる物と同じなら、対応するとかナニ言ってるんだって感じ。

まあ、Cのポインタ全部絶滅させられるならどっちでもいいがw

389:デフォルトの名無しさん
09/02/02 02:27:19
>>388
絶滅させられないからこそのC++/CLIじゃないの?w

390:デフォルトの名無しさん
09/02/02 08:48:55
今のところMFCのCArchive使ってファイル保存していた古いデータを
.NET側から簡単に読み込むためのモジュールを作るのに重宝してるってぐらいだなぁ。




391:デフォルトの名無しさん
09/02/02 19:55:31
WPFみたいなほとんどマネージコードによるマネージコードのための超高レベルフレームワークを
わざわざC++で使う意味がわからない

392:デフォルトの名無しさん
09/02/03 01:32:22
まぁP/InvokeやCOWだけじゃ困る場面もたまにはあるわけだし。
やってることは凄いんだが評価されないC++/CLI。

とりあえず「C++屋のための.NET言語」という勘違いをされ気味なのはなんとかすれ。

393:デフォルトの名無しさん
09/02/03 02:17:17
進化したMS版C++Builderくらいにしか思ってませんでしたw

394:デフォルトの名無しさん
09/02/03 02:20:41
使いやすいGUIライブラリ付きのC++という捉え方は誤解の元だね


395:デフォルトの名無しさん
09/02/03 02:27:14
どうして誤解なのか解説しちくりくり

396:デフォルトの名無しさん
09/02/03 03:16:05
使いやすくないからな。
GUI部分はC#でいいべ。

397:デフォルトの名無しさん
09/02/03 09:07:45
C#の「#」は、++++ で C++++の略でしたっけ?

398:デフォルトの名無しさん
09/02/03 09:21:42
>>396
まあそうなんだが、GUIだけ分けるのもかえって面倒だったりするしな。


399:デフォルトの名無しさん
09/02/03 15:51:47
>>389
何言ってんだお前

400:デフォルトの名無しさん
09/02/04 00:28:07
>>397
別に略ではないな

401:デフォルトの名無しさん
09/02/04 15:17:24
で、どうしろと?

402:デフォルトの名無しさん
09/02/04 21:50:29
とりあえずチンコでも揉んでみたら

403:デフォルトの名無しさん
09/02/04 22:13:08
チンコとかの話しかしない人に必要な言語は
C++/クリ(ry

C++/CLIは地味だけど、商用デスクトップアプリで
.NET使う場合はよけて通れない言語じゃないかなぁ。
.NETなアプリはまだ本家MS様も出してないよね?
Expression もハイブリッドだし。


404:デフォルトの名無しさん
09/02/04 22:18:08
ネイティブとマネージドのミックスタイプのアプリはMSのプロダクトに増えたけど、
基本的にホスティングがおおいな。
C++/CLIはあまり見かけない。

405:デフォルトの名無しさん
09/02/04 22:53:46
>>404
あ~。ホスティングだったのか。
勘違いを正してくれてありがトン


406:デフォルトの名無しさん
09/02/04 22:59:00
XNAのWindows向けアセンブリくらいだろうなぁ。

407:デフォルトの名無しさん
09/02/04 23:36:35
俺の言ったカンファレンスじゃ、ベンダーがC++/CLI がベストと言って楽しそうだった

408:デフォルトの名無しさん
09/02/04 23:51:11
WPFも一部C++/CLIだな
XNAのフレームワーク部分はC#だよ

409:デフォルトの名無しさん
09/02/05 00:03:15
>>408
んー? Reflectorで眺めた結果で予想してるだけだが、
Microsoft.Xna.Framework.Game.dll以外はほぼC++/CLIのアセンブリでしょ。
FBXインポータが3MB超なのも、もろにfbxsdkのバイナリとマージしてるからかと。

410:デフォルトの名無しさん
09/02/05 01:17:05
ネイティブとマネージドのミックスタイプのアプリは現在、どの程度可能
なのか?

C++Builderでは、確かDelphi(Object Pascal)のコードがコンパイルできたと思う
が、こういうことがネイティブとマネージドの間で透過的にできるのか?

もちろん、マネージドコードとネイティブコードの混在ははるかに難しいと
思うが、これを簡単に実現できる方法を提示してもらわないとマネージドは
使う気になれない。

大体、トラブルがリンカエラーで出てくるというのは、エラー箇所の特定が
非常に難しく、最悪の状態ではないか?






まぁ、C#が良いみたいだけど、結局、VBだろが、VC++だろが、C#だろが
Windowsプログラミングになるとどの言語だろが関係ない。

結局、MIcrosofが決めた訳の分からん取り決めに振り回されることになる
から。

411:デフォルトの名無しさん
09/02/05 01:18:58
日記もつけたし今日は寝る。お休み。

412:デフォルトの名無しさん
09/02/05 01:29:23
>>410
その混在を実現しているのが今のところC++/CLIだけ。

#pragmaでネイティブとマネージドどっちのコードを吐くか切り替えられる。
ネイティブクラスとマネージクラスの混在(has Aでの包含)は
透過的ではないものの、手段は用意されている。

413:デフォルトの名無しさん
09/02/05 02:22:24
URLリンク(blogs.msdn.com)

ただのネイティブ関数呼び出しであるP/Invokeですら
導入した瞬間にこんだけの「隙」が出てきてしまうのだから
簡単に実現できる方法って言われてもお花畑だよなぁ。

理想に対する泥臭い現実解としてはイイ線いってると思うけどねぇC++/CLI。

414:デフォルトの名無しさん
09/02/05 02:58:44
とりあえずガンガン使っていくので今後ともよろしく>C++/CLI

使って情報を出さないとね。ググった結果に引っかかるサンプル増やせば
ちったあ底辺広がるだろうし。

415:デフォルトの名無しさん
09/02/10 09:57:12
バイナリフォーマットで100MBほどのデータを
シリアライズしようとしているのですが、
デシリアライズするときにメモリを数倍も消費して
ロードできないのですが、

デシリアライズをカスタマイズしないとできないのでしょうか?

GC::Collectするとメモリがいっぱい回収できます。


416:デフォルトの名無しさん
09/02/10 20:58:03
諦めてXmlReaderかストリーミングでLINQ to XML使った方がいい

417:415
09/02/10 23:00:48
結局、自前で読み書きするようにしました。


418:デフォルトの名無しさん
09/02/11 13:54:41
>>392
> やってることは凄いんだが評価されないC++/CLI。

MSがC#を前面に押し出したから見向きされなくなったよね。
それにC++はもともと敷居が高い言語だけど、
マネージドが入るとさらに敷居が高くなるからね。
員数仕事じゃ使うの無理じゃない?


419:デフォルトの名無しさん
09/02/11 13:58:36
>>418
>MSがC#を前面に押し出したから見向きされなくなったよね。
その頃はまだmanaged C++といってほとんど試作品」だったよ

420:デフォルトの名無しさん
09/02/11 13:59:16
C++/CLIのコンパイラのソース出してくれないかなあ。
CLIじゃなくて、JVMのバインディング、面白そう。

421:デフォルトの名無しさん
09/02/11 14:00:00
>>419
「その頃」違いです。

422:デフォルトの名無しさん
09/02/11 17:01:01
そもそも、.NETはお金を頂くソフトウェア作るには不向き
・遅い
・ソース丸見え
・フレームワークインストール必須
・FAでは絶対に無理

枚挙に暇がない

423:デフォルトの名無しさん
09/02/11 17:35:54
今時そんなのが問題になるのか?


424:デフォルトの名無しさん
09/02/11 17:48:12
>・ソース丸見え
あっちこちでネガネガしてる奴のようだ。ほっとくに限る。

425:デフォルトの名無しさん
09/02/11 18:58:12
組込みでC言語、VB6を少々

しかやった事無いけど、CLRでデータロガ作ってみた。
Windowsの知識はほとんど無いけど、すごく簡単ね

Win32Apiでやろうと思ってたけど、自分のツール程度ならCLRでいいかな。
とりあえず田舎で本が手に入らないからゴリ押し(ほぼC言語w)で作成中、
勉強すればもっと便利に使えると思うんだけど・・・。

皆さんはどうやってC++/CLRを勉強したの?

426:デフォルトの名無しさん
09/02/11 19:00:29
勉強?
どこをどう勉強する必要があるんだ??


427:デフォルトの名無しさん
09/02/11 19:17:43
>>425
C++の経験者が使う言語だと思ったほうがいい。
Win32APIやCのライブラリを使わないならVB.netやC#やったほうがいい。

428:デフォルトの名無しさん
09/02/11 19:18:12
デフォルトでスマートポインタなCOMの一種と考えるとそれほどでもない

429:デフォルトの名無しさん
09/02/11 21:36:59
C++とC#の経験があればそのまま使える
というか,そういう人にしか旨味のない言語
簡単だと思うのはC#やVB.NETを触ったことがないから

430:425
09/02/12 03:33:22
>>426-429
ありがとう、意見を参考に、ずっとC#のサンプルコードいじってた。
とりあえず腹減ったので寝ようかな。

>>427
当初Win32APIをやろうと思ったけど、開発効率重視で諦めました。

*組込み屋なんで速度と柔軟な処理が可能かが気になりましたが、
そんな難しいもの作るわけじゃ無いので。

431:デフォルトの名無しさん
09/02/14 19:15:48
E-mail欄ってほとんどE-mail欄の役割は果たしてないよね。

432:デフォルトの名無しさん
09/02/14 21:38:35
果たしてるスレもあるよ、カードゲームのトレードスレとか

433:デフォルトの名無しさん
09/02/21 13:57:06
良い時は悪い時。
悪い時は良い時。

434:デフォルトの名無しさん
09/02/22 11:54:55
C++/CLI なんですが、教えてください。
(スレ立てるまでもないスレで誘導されてきました)

<NewDataSet>
 <OYA>
  <DATA1/>
  <KODOMO>
   <DATA2/>
  </KODOMO>
 </OYA>
</NewDataSet>

こんな感じの xml データを操作したいと思います。
DATA1 なら、 DataSet.Tables[ "OYA" ]->Rows[ 0 ][ "DATA1" ] で参照できるのですが、
DATA2 にはどのようにしたら参照できるのでしょうか。

435:デフォルトの名無しさん
09/02/22 12:00:31
>>430
デスクトップでプログラム書く時は、組み込み脳は捨てろ。

436:デフォルトの名無しさん
09/02/22 12:12:44
>434
それ C++/CLI と関係ないし

Schema はどう定義されているの? XML読み込んだDataSetからSchemaを見てみたら?

437:デフォルトの名無しさん
09/02/22 12:13:36
そういう質問は軽くC#の書き方覚えてC#スレで聞いたほうが早いよ

438:434
09/02/22 14:27:57
別の方法で解決できました。ありがとうございました。

>>436
こんな感じです。
(xs:schema とか xs:complexType など、なくてもわかりそうなところは消しています)

<xs:element name="OYA">
 <xs:element name="DATA1" type="xs:string" minOccurs="0" />
 <xs:element name="KODOMO">
  <xs:element name="DATA2" type="xs:string" minOccurs="0" />
 </xs:element>
</xs:element>

このスキーマ自体も DataTable.Add や DataColumn.Add などでプログラムで作成したモノを
ファイルに落としていました。

>>437
その言葉がヒントになり、System::Xml::XmlElement などを使って解決することを思いつきました。
意外なほど簡単でびっくりです。

439:デフォルトの名無しさん
09/02/22 14:31:08
C#で試したらLINQに行っちゃう気が

440:デフォルトの名無しさん
09/02/22 14:49:58
LINQ楽なんだよな~
3.5に移行する気ないからテストプログラムでの使用オンリーだけど

441:デフォルトの名無しさん
09/02/22 15:36:22
System.Xml.Linqの使いやすさは異常
言語としてのLINQサポートがなくても十分使いやすいと思う

442:434
09/02/22 18:19:33
確認したらウチの 2008 standard にも C# 入ってたし、覚えようかな。。。

443:デフォルトの名無しさん
09/02/24 23:47:48
覚えても使う機会が(ry

444:デフォルトの名無しさん
09/02/25 18:13:15
おれ、がめついからVS2008EEを全部インストールしたけど
一番使わないと思ったVC++を今一番使ってる

445:デフォルトの名無しさん
09/02/25 18:18:35
cl vjc fsi jsc ... やっぱり一番使うのはmlでっしょ

446:デフォルトの名無しさん
09/02/25 19:16:16
いちばん使わんのはVBだな

447:デフォルトの名無しさん
09/02/25 19:20:23
ILASM最高

448:デフォルトの名無しさん
09/03/01 13:03:01
newとgcnewって
マルチスレッドでコンパイルすれば、
スレッドセーフですか?


449:デフォルトの名無しさん
09/03/01 14:48:00
当然だ。でなきゃ使い物にならないだろ。

450:デフォルトの名無しさん
09/03/03 23:00:37
早急に回答を頂きたいのですが、
テキスト(アスキー)をバイナリに変換する方法を教えてください。
本当に急いでいます。よろしくお願い致します。
悩んでいます。本当に。

451:デフォルトの名無しさん
09/03/03 23:07:42
テキストもバイナリの一種ではあるのだが。とか言ってみる。w
なにをしたいの?

452:デフォルトの名無しさん
09/03/03 23:07:56
エスパーさん
出番ですよー

453:450
09/03/03 23:11:59
>>451

>なにをしたいの?
出世です。

bitconverterあたりを調べても何も出てきませんよ。ため息以外は。
本当に急いでいます。今日は寝ません。本当に。

454:デフォルトの名無しさん
09/03/03 23:13:54
>>453

>>451

> >なにをしたいの?
> 出世です。

> bitconverterあたりを調べても何も出てきませんよ。ため息以外は。
> 本当に急いでいます。今日は寝ません。本当に。

455:デフォルトの名無しさん
09/03/04 00:19:50
printfでいいじゃない。ヘキサダンプもバイト出力も自由自在。

456:450
09/03/04 00:29:54
出力させても意味はないのです。
バイナリデータにしないといけないのですよ。
回答まだですかね? 眠くなってきましたわ。
本当に。

457:デフォルトの名無しさん
09/03/04 00:47:16
だから冗談抜きでテキストはバイナリなんだけど

458:デフォルトの名無しさん
09/03/04 00:50:25
じゃあfprintf

459:デフォルトの名無しさん
09/03/04 01:00:36
適当に圧縮して保存すればおk

460:デフォルトの名無しさん
09/03/04 01:42:09
charまたはstringをintにキャストしたいという意味だろうか

461:デフォルトの名無しさん
09/03/04 02:09:17
ならばsprintfで

462:デフォルトの名無しさん
09/03/04 05:20:49
C++/CLIではC#のようなAnyCPUのEXEやDLLは作れないんですか?


463:デフォルトの名無しさん
09/03/04 08:22:34
>462
/clr:safe にすれば?

464:デフォルトの名無しさん
09/03/04 10:05:25
あーそんなオプションがあったんですね
ありがとうございます

465:デフォルトの名無しさん
09/03/04 10:09:17
C++/CLIを使う価値99.9%減だけどな

466:デフォルトの名無しさん
09/03/04 10:20:32
/clr:safeだとコンパイル通りませんでした;;

467:デフォルトの名無しさん
09/03/04 10:26:08
/clr:safeの場合はネイティブコードを混ぜられないからな
単なる劣化C#になっちゃうからC#使った方がいいよ

468:デフォルトの名無しさん
09/03/04 10:42:40
0x1234 みたいなテキストをバイナリの2byteとかにしたかったのかな...

そんな事で出世できる会社がうらやましいわw



469:デフォルトの名無しさん
09/03/04 13:24:29
何がしたかったんだろうな
エスパーじゃないからさっぱりわからん

470:デフォルトの名無しさん
09/03/04 13:30:49
GZipStream でも使えばよかったのにな

471:デフォルトの名無しさん
09/03/04 18:15:31
C++/CLIのコードで「reinterpret_cast」の部分を選択してコピー ( Ctrl + C ) したらVSが固まるのって俺だけ?

472:450
09/03/04 23:48:34
>>468
まさに、それがしたかったのですよ。
やっと理解者が現れたか。

473:デフォルトの名無しさん
09/03/04 23:57:01
>>468 の才能に嫉妬。w

sscanf とかでもいいんじゃないの。もっといいのあったと思うけど。

474:デフォルトの名無しさん
09/03/05 00:05:52
Converter でいいんじゃね?
今度はエンディアンの違いとかで騒ぎそうだけどさwww

475:デフォルトの名無しさん
09/03/05 00:20:51
C 互換の数値リテラルなら strtol() かな。
書き下ろしても大したこと無いように思うけど。

476:デフォルトの名無しさん
09/03/05 12:48:19
>>472
そうかわかったぞ
GoogleのTwitterをいち早く読んで
出世にいかそうとしてるんだ・・・・なんてなw

477:デフォルトの名無しさん
09/03/05 22:25:34
こんなこと言うのはなんだけど、そんなのC++/CLIでやる
ことじゃないよな・・・
しかも、C#とかJavaとかCとかならまだしも、なぜC++/CLI ・・・

478:デフォルトの名無しさん
09/03/06 00:35:00
いままで MFC を主に使ってた人間が C++/CLI を使い始めようというときに、
よい参考書ってないかな? ネットで調べつつ、特に問題なく書くことは出来るんだけど、
なにか見落としてそうで怖い。

他のところでも聞いてみたんだけど。。。

479:デフォルトの名無しさん
09/03/06 01:15:33
C++は初心者では無いけど、.NETは全くの初心者というのなら多分無い

既に知っているかもしれないが、C++も.NETも使いこなせるような人がその両方を活かすために選択するのがC++/CLI
C++を勉強するために選択するべきものではないし、.NETを勉強するために選択するべきものでもない

480:デフォルトの名無しさん
09/03/06 10:10:56
>478
現状で特に問題がないなら、むしろ .net framework の癖というか、ライブラリの作り方が
載っている C# の本を買ったほうがいいお
そこらに載っていることをC++/CLIで表現できれば十分じゃない?

481:デフォルトの名無しさん
09/03/06 11:10:11
C++/CLIで書かれてる情報だけを調べて特に問題なく書けてきたなら尊敬に値する

482:デフォルトの名無しさん
09/03/06 11:40:00
URLリンク(msdn.microsoft.com)(VS.80).aspx
とりあえずこれ読むといいよ。

前にマネージ型の実行時型情報の扱いでちょっと苦労したな。
SomeClass::typeid でType型が返ることさえ分かってしまえば
全部解決なんだが、なかなかそこに辿り着けなかった。
つーかなんでIntelliSenseで出ないんだこれ。

483:デフォルトの名無しさん
09/03/06 11:44:05
それアンマネージC++→C++/CLIじゃなくてManaged C++→C++/CLIだよ
ひたすら表記の違いだけが書いてあるだけ
.NET初めてなら実行時型情報なんてそもそも何のことかわからんでしょ

484:デフォルトの名無しさん
09/03/06 12:04:54
あのぅ、RTTIは…

485:デフォルトの名無しさん
09/03/06 12:51:46
>>483
そうだけど、ManagedとCLIでほとんど全部変わってるので、
結果的にC++/CLI構文の端的な解説みたいになってる。
まあマネージドの概念とかeventみたいな特殊なのは
他のところで頑張って覚えてもらうしかないが、
その場合もここで出てきたキーワードでMSDNライブラリ引けば
だいたい解説があるし。

あと実行時型情報なんて必須知識ではないし、
他のも必要なものだけ覚えりゃいいと思うよ。
人によっては value class や enum class も必要なかろう。

486:478
09/03/06 23:02:03
たくさん、ありがとう。
とりあえず >>482 さんの教えてくれたサイトを読んでみます。

自分でも調べているところですが、>>479 さんも仰られているように .NET を
まず覚えないといけなさそうですね。いただいたレスの中にさえ見覚えのない
単語がある状況からしてなんとかしないと。

>>481
意外となんとかなるモノですよ。
まあ、C++/CLI そのものではないけど、ちょっとずついろいろと触ってきてるし。

487:デフォルトの名無しさん
09/03/06 23:05:34
最低限C#は読めないと話にならないよ

488:デフォルトの名無しさん
09/03/07 17:56:55
ネット上のサンプルコードの量はVBが一番多い気がする
でもVBのよさが分からない。


489:478
09/03/07 19:08:36
調べていての感想は
「‥‥なんか VB みたい」
でした。w


C# は読むだけなら別に問題なくできたりします。
(ネットで拾った C# のコードを C++/CLI に置き換えたりしてお勉強してます)

一番戸惑うのは、自分が欲しい機能を持った関数がどこにあるのか見当が付けづらいことですね。
基本的な手順などは Windows の API や MFC を使う場合と大差ないような気がするので、
既存のコードを読む場合には VB でも C++/CLI でも C# でもわかるのですが、自分で書く場合に
どこにその関数があるのかわからず途方に暮れるというか。w

昨日も、マネージ拡張でちょっとしたツールを書いてたのですが、書いてる時間よりも
必要な関数の情報を集める方に圧倒的に時間を要してました。むー。

490:デフォルトの名無しさん
09/03/07 22:09:50
C++/CLIは異なるアーキテクチャを混ぜただけだからややこしくなる。

APIやMFCを使いたいならC++の方が制約なしに使えるし。
.NETフレームワークを使いたいならC#だろうし。
初めのうちはどちらかを選んで情報を収集したほうがいいよ。


491:デフォルトの名無しさん
09/03/07 22:54:05
C#やVBなら慣れてくるとインテリセンスでテキトーにメンバ探せる
だまされたと思ってちょっとVC#触ってみたら?
異次元の使いやすさでアホらしくなるからw

492:デフォルトの名無しさん
09/03/17 17:03:00
畑を荒らしてるのはモグラじゃないよ。
モグラの穴を利用しているネズミだよ。
モグラは肉食だから野菜は食べないよ。

493:デフォルトの名無しさん
09/03/18 17:00:28
穴掘る時点で荒らしてます。

494:デフォルトの名無しさん
09/03/23 19:03:10
アンマネージのコードで作成されたウィンドウにマネージコードのコントロールを乗せる方法ってないですか?

495:デフォルトの名無しさん
09/03/23 20:13:41
あります。

496:デフォルトの名無しさん
09/03/23 21:07:38
>>495
出来ればヒントだけでもお願いします。
あるソフトのプラグインで複雑なGUIを組みたいのですがC++ CLIの情報自体が少ない上に
こんなニッチなことをしている人はいないみたいなので。

497:デフォルトの名無しさん
09/03/23 22:41:29
>496
上の方のスレ読んだ?

498:デフォルトの名無しさん
09/03/24 05:01:11
>>497
ありました。
MFCですか。使ってないけどなんとかやってみます。

499:デフォルトの名無しさん
09/03/28 14:31:53
いま、C++/CLI の勉強中なんですが、C# との連携をやってみたくなりました。

C# で画面系を作って、それ以外を C++/CLI でやってみるとか考えているのですが、参考になりそうな HP とかないですかね。
自分でも調べ始めたところなんだけど、間違った方向に行かないようにするためにも最初だけは他力に縋ってみたくて。

500:デフォルトの名無しさん
09/03/28 15:10:23
春休みかあ

501:デフォルトの名無しさん
09/03/28 22:47:42
>499
C++/CLI は普通にアセンブリを作れるから、C++さえわかっていればC#からそれほど
離れている訳じゃなく、構文上の癖だけ理解すればいいんだけど、C++はできるんだよね?

502:デフォルトの名無しさん
09/03/28 23:53:08
>>501
C++ は特に問題ないす。
C# とかもたぶん問題ないです。書かれているのを読むだけなら普通に出来ます。

C++/CLI を調べるときに MSDN を読むとほとんど常に C# とか VB とかの関数も併記されているので
一緒に使えるんだろうな、とか思ったのが連携させたいと思ったきっかけでした。

「アセンブリ」、調べてみます。


>>500
まあ、あの質問の仕方ではそう思われるすね。たしかに。

503:デフォルトの名無しさん
09/03/28 23:56:18
まあ参照設定すれば見える。
それも同じソリューションなら適宜やってくれるはずだし。

504:デフォルトの名無しさん
09/03/29 00:28:25
>502
ほれ。これで充分じゃね
URLリンク(vene.wankuma.com)

アセンブリはメタデータ付きのDLLのことだお。.NETでは EXE と DLL は両方ともアセンブリで
違いはスタートアップの有無だけ。だから、EXE も参照することができるんだお

505:デフォルトの名無しさん
09/03/30 09:07:35
従来のC関数もEXEからエクスポートできたりするわけだが。

506:499
09/04/03 22:25:42
返信をくれた方、ありがとうございます。
アク禁を食らってました。(某報道機関所属じゃないですw)

いただいたアドバイスを元に試験用プロジェクトをいじり倒した結果(そこまではしてないけど)、
普通に C# と C++/CLI でプログラムを組めるところまで来ることが出来ました。

‥‥ほんっとに便利な世の中になったモノです。
文字コードの変換も数行で終わっちゃうんだもの。(´・ω・`)

507:デフォルトの名無しさん
09/04/17 09:39:44
ageさせてもらいます。
C#の方からC++/CLIを経由(ラッパ)してアンマネージのMFCクラスを使う方法で困っています。
C#→C++/CLI→CWndのCreate()を呼ぶと、内部のAfxGetInstanceHandle()でassertが出ちゃうんです。
どうもMFCの初期化をしてやらなくちゃならない様なのですが、さっぱり情報がありません。


508:デフォルトの名無しさん
09/04/17 12:15:00
URLリンク(bbs.wankuma.com)
同じ質問を見たな

509:デフォルトの名無しさん
09/04/17 14:14:21
解決しました。
MFC拡張DLLをひっつけるのではなく、単なるクラスライブラリにしたら
うまく行きました。
お騒がせしました。

510:デフォルトの名無しさん
09/04/18 00:48:46
CLIはヘッダーに実行コード書くのに違和感が...

511:デフォルトの名無しさん
09/04/18 00:52:27
それは、単にVC++の新規プロジェクトで作成されるコードがそうであるというだけのことだろ。

512:デフォルトの名無しさん
09/04/18 09:03:44
そうだけど、いちいち書き直すのめんどくさいんだよな。
普通に宣言と実装に分けてくれればいいのに、
なんでこんなことになってんだろう。

513:デフォルトの名無しさん
09/04/18 11:09:53
C# とか他の .net 開発言語?でそうだからなんじゃない。
ヘッダとコードが別々な C/C++ の方が珍しいってどこかで聞いた。

そんな分離の話よりも、ひとつのフォームとかのコードをすべて同じファイルに記述する
人が多いことの方が気になる。ちょっと規模が大きくなるとごちゃごちゃして分かりづらいことこの上ない。
そのほかにも VB6 の頃に不満に感じてたことを、いまここでまた目にするとは。。。

514:デフォルトの名無しさん
09/04/18 11:43:50
VBは知らんが、今のC#はデザイナで作ったコードと
ユーザーが実装したコードは別になってる。
あれと同じようにしてくれればそれでいいんだが。
VS2010でC++に大きく手が入るってことになってるが、
ぜひ変更して欲しいところだ。

515:デフォルトの名無しさん
09/04/18 20:45:17
むしろヘッダに実装全部書いても問題のない言語デザインに変更してほしい

516:デフォルトの名無しさん
09/04/18 21:21:25
プロパティなんていちいち分離して書いてられないもんな
ただでさえ面倒な文法なのに

517:デフォルトの名無しさん
09/04/18 21:43:11
>>515
むしろ、ヘッダを書く必要のない言語にだろう。
D言語ではコンパイラがコンパイルするときにヘッダファイルを自動生成してくれるらしい。

テンプレートとかどうなってるのかは知らんけど。

518:デフォルトの名無しさん
09/04/18 22:03:28
よく知らないけど n1778 とか

519:デフォルトの名無しさん
09/04/18 23:57:24
まあC++はC++の文法であることが存在意義だからな。
嫌ならおとなしく最近の言語を使うしかあるまい。

520:デフォルトの名無しさん
09/04/19 19:31:20
そうかなあ

521:デフォルトの名無しさん
09/04/19 23:03:28
C++/CLIは進化したC++として使うための言語じゃないでしょ
逆に「C#アンマネージ拡張」でよかったのに

522:デフォルトの名無しさん
09/04/21 08:50:34
ヘッダとソース分けると
using namespaceがうざいことになる。

まーヘッダだけフルパスで書けばすむんだが。

523:デフォルトの名無しさん
09/05/11 10:57:13
過疎スレに質問。

C#やVB.NETってdecompiler使うと生ソース丸出しになっちゃうけど、
C++/CLI で clrsafeでないソース書いてもやっぱ丸出しになっちゃう?


524:デフォルトの名無しさん
09/05/11 11:18:22
マネージド部分は当然

525:デフォルトの名無しさん
09/05/11 16:29:59
しかし何で、見えるのを気にする奴がいるんだ。
はっきり言ってどうでもいい。どうせ見てもわかる奴は見ないし。
見たい奴はわからないだろうから。

526:デフォルトの名無しさん
09/05/11 16:39:17
.NETの場合はメタ情報がしっかり残ってるというのがポイントだな。
それと逆コンパイルのツールが手軽に手に入るといったところか。
ソースが逆生成できるというならそれなりのツールを使えばCからでも
相当の精度で可能なのだが、マクロやテンプレートの展開でソースが
スパゲッティになったり関数やクラス名など型情報が抜け落ちるので
その分解析しづらい。
.NETでもクラス名や関数名のメタ情報を書き換える程度の
難読化ツールを使えば解析しづらくなるから使ったらいい。

527:デフォルトの名無しさん
09/05/11 16:42:57
実際ある程度の規模のソースになると、仕様書もコメントもないソースを提示されても
見る気も起きないのが普通。
見られて困るといってるのはパスワードを入れるとエロ画像が拝める系のしょうもない
シェアウエアの作者と相場は決まっている。

528:デフォルトの名無しさん
09/05/18 16:58:48
表記法がまるで入れ替わっていて美しくないと思うけど、
仕様でミスった方はC#でいいよね。

C#
ファイナライズ ~MyClass()
ディスポーズ IDisposable.Dispose()

C++/CLI
ファイナライズ !MyClass()
ディスポーズ ~MyClass()


529:デフォルトの名無しさん
09/05/18 17:58:59
>>528
C#使ったことあるの?

530:デフォルトの名無しさん
09/05/18 18:02:26
あったらこんなこと書かないでしょw

531:デフォルトの名無しさん
09/05/18 18:52:35
C#でもディスポーズを~MyClass()と定義するべきだったと思う。

532:デフォルトの名無しさん
09/05/18 19:11:06
>>531
ヒント:経緯。順番。

533:デフォルトの名無しさん
09/05/19 23:57:42
C#のディスポーズは歴史的な失敗作

534:デフォルトの名無しさん
09/05/20 00:11:45
って、いうかGCに対応する為に
覚えなきゃならない概念が増えるのがイヤだ。
弱い参照だのトラッキング参照だのファイナライズだの

535:デフォルトの名無しさん
09/05/20 08:20:08
VS2010ベータが出たので入れてみたがC++/CLIでIntelliSenseが使えなかった。


536:デフォルトの名無しさん
09/05/20 11:35:35
>535
C++って0x対応とIntelliSense強化がメインじゃなかったっけ?


537:デフォルトの名無しさん
09/05/20 12:02:59
CLIじゃないC++ではIntelliSense使えるし、
C#にあったコンパイル前にエディタ上でエラー表示する機能も追加されてる。

なのになぜかC++/CLIでは
IntelliSense: 'Unavailable for C++/CLI'
と表示されてしまう。

538:デフォルトの名無しさん
09/05/20 15:40:46
助けてくだちい
C#からC++のクラスライブラリを使いたいので、
C++/CLIでラップするクラスライブラリを作っていたら、
何かC++のクラスのインスタンスをC++/CLIでnewすると、
例外が出てしまいますーorz
アンマネージコードのデバッグを有効にするとセーフ
回避する方法ありますか?


539:デフォルトの名無しさん
09/05/20 17:46:50
別のDLLのクラスをnewしようとしてるんじゃねぇ?

540:デフォルトの名無しさん
09/05/20 18:23:56
>>538
gcnew

541:デフォルトの名無しさん
09/05/20 22:05:06
>538
人にものを聞くときは例外ぐらいコピペしろよ、このデコ助野郎

542:デフォルトの名無しさん
09/05/21 11:16:43
>> 541

すみません。
例外は以下の通り。

System.Runtime.InteropServices.SEHException はハンドルされませんでした。
Message="外部コンポーネントが例外をスローしました。"
ErrorCode=-2147467259(0x80004005)

>> 540
アンマネージの実体は、newで作るんですよね?

>> 539

C++のクラスライブラリは、static libです。
dllにしても変化なし。
C++のクラスに、virtualの関数が無ければOKです。
何故??

543:デフォルトの名無しさん
09/05/21 11:45:45
InteropServices の例外?
COMオブジェクトでもコンストラクタで生成してるの?
ライブラリの実績はあるんだよね

544:デフォルトの名無しさん
09/05/21 13:39:10
>> 543
C++の方は、DirectShow(COM)を使いに行きます。
ライブラリの方は、C++ではちゃんと動いてます。

自分も、COM辺りが怪しいのかなと思って、COMを一切アクセスしない
空のクラスをテストで作ってみたのですが、それでもダメでした。

上で書いたvirtualというのは間違いで、今色々試したところ、
クラスにメンバ変数があるとダメの様です。意味不明。

ただ、DirectShowのサンプルにあるBaseClassesというlibを流用しています。
それが引っ付いてるのですが、グローバルでstaticな変数定義とかがあるので、
その辺りで何か問題があるのかもしれないですね。

545:デフォルトの名無しさん
09/05/21 13:56:01
> 外部コンポーネントが例外をスローしました。
と書いてあるとおり、COM内部で例外を投げている。
原因はいろいろあるが、何れにしてもCOM内部での話なのでCLRには関係ない。

546:デフォルトの名無しさん
09/05/21 14:00:42
>>545
わかりました。
COMが例外出しているのですね。
有難うございましたm(__)m

547:デフォルトの名無しさん
09/05/25 20:02:57
DataGridViewで、下のコードで、コンボボックスをセルの中に入れたいんだが、
デフォルトが必ずブランクになる。
アンマネージの時みたいに、デフォルトのIndexって、設定できないの?

//---create a new bindingsource control---
BindingSource^ bindingsource = gcnew BindingSource;

//---add the items into the control---
bindingsource->Add("Type A");
bindingsource->Add("Type B");
bindingsource->Add("Type C");


//---create a combobox column---
DataGridViewComboBoxColumn^ comboBoxCol = gcnew DataGridViewComboBoxColumn;

//---set the header---
comboBoxCol->HeaderText = "Types";

//---data bind it---
comboBoxCol->DataSource = bindingsource;

//---add a combobox column to the DataGridView control---
dataGridView1->Columns->Add(comboBoxCol);




548:デフォルトの名無しさん
09/05/25 22:19:11
アンマネージの時みたいってのがさっぱりわからないが
DataGridView::RowAddedイベントかBindingSource::ListChangedイベントで

549:デフォルトの名無しさん
09/06/04 06:24:44
俺はVisual Stidio 2003なので、CLIは使えん。
マネージ拡張C++だけになるが、そのタイトルのスレは無いので、ここに書いても
かまわないか、それともだめか。

550:デフォルトの名無しさん
09/06/04 09:13:45
ここは今無き ManagedC++ スレの直系だからおけー

551:デフォルトの名無しさん
09/06/04 10:24:36
/clr:oldSyntax で今でも一応使えるが、もうすっかり忘れてしもーた。

552:デフォルトの名無しさん
09/06/05 01:20:50
愚痴。

VC6ソースなアンマネージDLL内の関数が、FLIE*な引数を要求してくるんだ。
で、C++/CLI内でラッパークラスを作ってそこでfopenした結果を渡してやると
書き込み時に例外 System.AccessViolationException が出て使えない。

この手のストリームをアンマネージな相手に渡すときに注意することは
なにかあったかなぁ...。

553:デフォルトの名無しさん
09/06/05 01:58:27
そのDLLはVC6でビルド済みなの? 
だったらCRTのバージョン非互換の可能性もあるけど。


554:デフォルトの名無しさん
09/06/05 02:29:44
愚痴とか言わずに、素直に 「誰か知ってたら教えて!!」 って言えばいいのに


555:デフォルトの名無しさん
09/06/05 02:33:21
そしてお前が次に言う台詞は
ググレカス

556:デフォルトの名無しさん
09/06/05 22:22:04
>>552
CRT境界を超えるなあほう

557:デフォルトの名無しさん
09/06/05 23:28:39
くり

558:デフォルトの名無しさん
09/06/07 01:40:19
>>556
いやまあしかし、逆方向には渡せるし使えるからなぁ。
この辺のやっていい事か否かの判断は難しいね。

559:デフォルトの名無しさん
09/06/07 03:11:04
俺もね、CRTで悩んでるのよね。
DLLの中にグローバル変数置いてるんだけどさ、
CRTのデバッグ系DLLをリンクすると問題ないのに
リリース系DLLをリンクすると、アプリケーションの
初期化に失敗しましたってなっちゃうんだよね。
何なんだろうねコレCRTかんけーねーじゃん。
つーかC++/CLIにも関係ないか。

560:デフォルトの名無しさん
09/06/07 13:21:48
これからC++/CLIを学ぼうとおもっているのですが、
なにが良いサイトを紹介していただけますでしょうか・・・。

561:デフォルトの名無しさん
09/06/07 14:13:00
いまのスペックは?

562:デフォルトの名無しさん
09/06/07 14:17:09
500000です

563:デフォルトの名無しさん
09/06/07 14:21:46
私なんて52万ですよ。ホホホ

564:デフォルトの名無しさん
09/06/07 14:40:53
VBの関数を使えると聞いたのですがどうやって使うのでしょうか?
若しくは解説しているページはありますか?
くだスレというスレで聞きたかったのですが、dat落ちしてしまったようです

565:デフォルトの名無しさん
09/06/07 14:55:32
VBがVB.NETであることと、C++/CLIが何か分かっていての質問?

プロジェクトの右クリックで参照...の「新しい参照の追加」でMicrosoft.VisualBasic追加すればいい。
using namespace Microsoft::VisualBasic;
で探すといくつかサンプルあるかもよ。

566:デフォルトの名無しさん
09/06/09 12:58:38
>>558
出来るとやっていいは違うべ
DllMainでMessageBox呼ぶのだって同じだろ

567:デフォルトの名無しさん
09/06/12 01:41:29
品薄みたいなのでボランティア出品しました。必要な方どうぞ
業者さんには悪いですが、1万ほど値を下げさせてもらいました
すごく安いと思います。
amazonです

568:デフォルトの名無しさん
09/06/18 22:37:07
int send_data_[64];
char buf[128];
memset(buf, 0, sizeof(buf));
memcpy(buf, reinterpret_cast<char*>(send_data_), sizeof(send_data_));
これがやりたいんですが

array<int>^ send_data_;
send_data_ = gcnew array<int>( 64 );
array<Byte>^ sendBytes;
sendBytes = gcnew array<Byte>( 128 );
sendBytes->Clear( sendByte, 0, sendByte->Length );
このあとどうすればいいんでしょうか?

569:デフォルトの名無しさん
09/06/18 22:53:48
>>568
コピー元と先のサイズが一致してないぞ
System::Buffer::BlockCopy
あとarray<T>^は初期化されるのが保証されてるからClearはいらない

570:デフォルトの名無しさん
09/06/19 00:21:25
あとは、pin_ptr 刺して memcpy でいいんじゃないか?

571:デフォルトの名無しさん
09/06/19 12:46:11
テンプレート使ったときのメモリー処理を超低レベル関数と組み合わせるのって心情的に怖いなぁ

572:デフォルトの名無しさん
09/06/19 14:19:21
テン・・・プレート・・・だと?

array は int[] と書く代わりに array<int> と書いているだけで、メモリの直列性は保証されて
いるから問題ない


573:568
09/06/19 23:02:54
System::Buffer::BlockCopy( send_data_, 0, sendBytes, 0, send_data_->Length * sizeof(int) );

解決しました。レスありがとうございました。


574:デフォルトの名無しさん
09/06/21 22:03:43
checkedListBoxでフォーカスされたアイテムのテキストをTextboxに設定したいのですが
GotFocusで飛んできたときにSystem::Object^ sender, System::EventArgs^ eからどうやって
検索なり変換なりをして扱うのかわかりません、どなたかわかれば教えてください。

575:デフォルトの名無しさん
09/06/21 22:18:46
そもそもGotFocusはコントロール自身がフォーカスを得るときに発生するんであって
現在のアイテムが変更されたときには発生しないんだが?

576:デフォルトの名無しさん
09/06/22 04:27:56
いや現在のアイテムが変更されたときではなく複数のアイテムがあって
そのアイテムの選択が変わったときにTextboxの内容を変えたいだけ。

577:デフォルトの名無しさん
09/06/22 04:48:08
まず用語を明確に定義して
アイテムって何
現在のアイテムの変更って何
複数のアイテムって何
アイテムの選択って何
フォーカスはどこ消えた

578:デフォルトの名無しさん
09/06/22 08:03:07
アイテムは
int sCount = 0;
checkedListBox_A->Items->AddRange(gcnew cli::array< System::Object^ >(1) {L"A" + sCount});
で増やした項目のことをさしてます。そのアイテム(A,B)が複数あった場合にBからAに選択された時に
Aが選択されたときにAが選択されてることを知りたいです。

579:デフォルトの名無しさん
09/06/22 09:37:30
GotFocus 事態は発生してるんだろ?
sender のオブジェクトは何が入っているのか、中身を確認すればいいだけじゃね

580:デフォルトの名無しさん
09/06/22 11:54:06
>>579
GotFocusは他のコントロールから移ってきたときに発生するイベントだって

CheckedListBox::SelectedIndexChangedイベント
CheckedListBox::Itemsプロパティ
CheckedListBox::SelectedIndexプロパティ
この辺
SelectedItemを直接変更はNG

581:デフォルトの名無しさん
09/06/22 12:33:05
神の焦点?

582:デフォルトの名無しさん
09/06/22 14:00:41
>580
なるほど。WPFとかだとItemsにLabelを入れてLabelのGotFocusにdelegate食わせれば
いけるんじゃね。WinForm の場合も、Object にLabelを放り込んでできないか?

583:デフォルトの名無しさん
09/06/22 22:53:15
>>580 のイベントを拾うのが一番普通な気がする


584:デフォルトの名無しさん
09/06/23 06:13:33
URLリンク(118.82.122.42)
で使われてるみたいな左にウィンドウの幅が変更可能なTreeViewと
右に別のやつみたいなことをしたいのですがこの構成は何かにはめ込んで
実現されてるのでしょうか?

585:デフォルトの名無しさん
09/06/23 10:01:09
なんだかこないだから、これの宣伝でもしてるのか?
C++/CLIのスレで聞くってことはフォームの範囲で聞いてるのかな。

586:デフォルトの名無しさん
09/06/23 12:53:06
WinFormの質問なら.NET汎用かVB,C#すれで聞いたほうが早い。
おそらく宣伝だろうね。

587:デフォルトの名無しさん
09/06/23 23:17:38
VC2008 C++/CLI
UDPClient マルチキャスト通信です、MSNのサンプルのままですがReceiveからかえってきません。

 UdpClient^ rClient = gcnew UdpClient( RemoteIpEndPoint );
 try
 {
  data = rClient->Receive( RemoteIpEndPoint );
 }
 catch( Exception^ e )
 {
  Console::WriteLine( e->ToString() );
 }

Sendは問題なくできています。何か他に設定が必要なのでしょうか?


588:デフォルトの名無しさん
09/06/23 23:34:59
リモートホストが何も送ってこないだけじゃね?

589:587
09/06/23 23:57:49
>>588
1台のPCで複数アプリ間での通信なんです。
Socketを使って確かめたけど、送られてはいるんですよ。

590:デフォルトの名無しさん
09/06/24 00:45:58
JoinMulticastGroup

591:デフォルトの名無しさん
09/06/25 22:11:11
Form1とForm2のように複数のフォームがある場合での質問です。
Form2で定義したテキストボックスのテキストをForm1でボタンを押したときに変更したいんですが
どういう風にすれば違うフォームのオブジェクトを操作できますか?


592:デフォルトの名無しさん
09/06/25 22:15:18
>>591
>>586

593:デフォルトの名無しさん
09/06/25 22:17:02
winforms以前の問題だ
悪いことは言わん
C#からやりなさい

594:デフォルトの名無しさん
09/06/25 23:44:21
>>591 やり方は幾つか(てか、いくらでも)ある。質問の仕方が悪すぎる。

595:デフォルトの名無しさん
09/06/26 11:03:32
C++/CLIってやっぱ素のC++は使えない?
例えばポインタとか。

596:デフォルトの名無しさん
09/06/26 11:08:19
使えるよ。何でそう思ったの?

597:595
09/06/26 11:09:24
managed C++だと、素では使えなくて、
unsafeだとか要ったキガス

598:デフォルトの名無しさん
09/06/26 11:20:26
unsafeってそれC#
/clr:safe としない限りは使える。
ただしマネージドオブジェクトに対しては参照を使用する必要がある。

599:595
09/06/26 11:25:56
つまり、マネージドオブジェクトを参照しない限り、通常のC++プログラムと実行ファイルになるんだ。

600:デフォルトの名無しさん
09/06/26 11:40:41
>>599
C++/CLIを選択した時点でそうはならんよ。あくまでマネージコード上で実行されるネイティブコードだ。
実行時の構造はObjective-Cあたりとは逆のイメージだな。

てゆーか質問してんのか自分の思い込みに賛同してほしいのかどっちなんだよ。

601:600
09/06/26 11:45:43
>マネージコード上で実行されるネイティブコード
あ、間違えた。C++だけで書いても#pragma unmanaged指定しない限り基本的にマネージコードだった。

602:595
09/06/26 11:46:35
.NET調査です。
解析系ライブラリはC++なのでC#やVB.NETは㍉。
今までのC++アプリに.NET混ぜれば良いのかなと思うのですが、
どの部分に.NETを使えば良いのか調査。

603:595
09/06/26 11:50:44
>C++だけで書いても#pragma unmanaged指定しない限り基本的にマネージコード

C++で開発しておいて、.NETバイナリが欲しくなったら、ドットネットコンパイルすればおk?

604:デフォルトの名無しさん
09/06/26 11:55:45
DLL か COM のラッパー作った方がいいんじゃねぇの?

605:デフォルトの名無しさん
09/06/26 12:00:48
その用途ならCLRのホスティングだな。ネイティブアプリからCOMで.NETの呼び出し。
CorBindToRuntimeExあたりでググれ。

もうひとつのパターンはネイティブアプリのルーチンをライブラリ化して.NETアプリから呼び出す。
C++/CLIはこれの橋渡しみたいなもんだ。C#+P/Invokeなどでも可能。

606:595
09/06/26 13:11:14
>ネイティブアプリからCOMで.NETの呼び出し。

解析処理はC++で書かれてるので呼び出す.NETって何だろう?

>.NETアプリから呼び出す。

.NETアプリは現状無い。。。

607:デフォルトの名無しさん
09/06/26 13:19:19
C++で書かれてて、それで使えていて、あえて.NETとMIXしたい理由ってナニ?
よくあるのは画面とか入出力を.NETで簡便に作りたいというのが多いけど。

608:デフォルトの名無しさん
09/06/26 13:35:39
>606
解析処理で使うんだから、あえて処理の実態をC++/CLIで作る必要はないだろ
解析部はDLLかCOMにしておいて、C++/CLIからそれを呼べばいい
なんか変な夢を見て、どっかんと大きく変えて失敗した責任をC++/CLIに押しつける羽目に
なりそうだな

609:595
09/06/26 13:55:12
最近、会社に来る人材派遣系とか中途応募してくる人的に.NET経験者が多いということから、.NETとの関わり方を調査することとなりました。

単純思考でC++&.NETと考えたのですが、”将来○○だから、.NETと折り合いが必須」みたいなビジョンを模索中。

会社的にはITRON系OSを使ってるのでソース共有の観点から、C++をC#に書き変えたくない。

610:デフォルトの名無しさん
09/06/26 14:23:02
>609
あのさ、正直、あんまりちゃんと領域を考えていないだろ
たとえば漏れの知っている例で言うと、解析エンジンをクラウド上に乗せて管理周りやUIを
.Net でと言う話とかも聞くよ。だがな、解析エンジンというのはある意味ノウハウの結晶さ
強制的に置き換えても、今までと結果が変わったり、初期依存周りのパラで挙動が
変わったりするさ。そういうことを考えずに、安易に両方できるから C++/CLI とか
手を出したら痛い目に遭うよ
まずやるべきことは、既存エンジンに影響が出ないよう、DLLやCOMでラッピングして
.Net からインターフェイス経由でやりとりできるよう、エンジン周辺をきれいに設計する
ことじゃね?


611:595
09/06/26 15:06:21
なるほど、エンジンはC++にしておいて、
実行環境が.NETが有利な環境で画面でも.NETで作れば良いですか。

Winで.NETは少し抵抗があるが、LinuxやMac、泥井戸ではありかも。

612:デフォルトの名無しさん
09/06/26 17:56:54
いやWinだからこそ.NET
特にC++/CLIはWinでしか使えない

613:595
09/06/26 18:01:04
>C++/CLIはWinでしか使えない

そうなんかorz

GUIに関しては、C++ Builderでペタペタやってるので、超快適だお

614:デフォルトの名無しさん
09/06/26 18:30:00
ネイティブコードさえ混ぜなければ他の環境で動かないこともないよ
ただその場合はそれこそポインタすら使えないのでC#で全部書き直した方がマシなレベル

615:デフォルトの名無しさん
09/06/26 18:37:58
そんなこと、このスレで言われても。。。

616:デフォルトの名無しさん
09/06/26 19:17:45
やる気ないのに調査しろと命令されて、仕方なく2chに丸投げした感じだな。

617:デフォルトの名無しさん
09/06/26 22:26:41
なんかたまたま C# のDLLImport を調べてたら・・・ 実は Wikipedia の記事が一番シンプルで
わかりやすかった

URLリンク(ja.wikipedia.org)

618:デフォルトの名無しさん
09/06/26 22:28:53
地味に誤爆しました

619:デフォルトの名無しさん
09/07/04 18:24:19
C#2008を使い始めました
CLIのenum型を一個ずつ追加していくにはどう書いたら
いいのでしょうか?
具体的にはRegexOptionsをNoneの状態から追加して
いきたいのですが・・。


620:デフォルトの名無しさん
09/07/04 18:27:38
質問の意図が読み切れんが、|=

621:デフォルトの名無しさん
09/07/04 18:40:44
むむ
RegexOptions^ Option = gcnew RegexOptions();
Option |= RegexOptions::CultureInvariant;
これでコンパイルエラーerror C2676が出てしまいました・・。



622:デフォルトの名無しさん
09/07/04 18:50:26
それはこれと意味的に大体同じ 見るだに意味不明だろう
int* x = new int();
x |= 3;

623:デフォルトの名無しさん
09/07/04 19:04:53
enumってそもそも静的に定義を列挙して使うものじゃないのかな?
リフレクション関連を駆使すればenumの内容を動的に追加とか出来るかもしれないけど・・・。

624:デフォルトの名無しさん
09/07/04 19:10:38
フラグを立ててるだけで別にメンバを追加してるわけじゃない
ごく普通の使い方
列挙型は値型だから^はいらない

625:デフォルトの名無しさん
09/07/04 19:14:21
なるほど・・。
*Option = *Option | RegexOptions::CultureInvariant;
でコンパイル通りました。
ありがとう!



626:デフォルトの名無しさん
09/07/04 19:16:18
斜め上だなー……

627:デフォルトの名無しさん
09/07/04 19:17:06
そっちの勘違いをしてたのか。
C++/CLIでは値型をgcnewするとBoxingされた状態で生成されてしまう。

RegexOptions Option = new RegexOptions(); // C#
RegexOptions^ Option = gcnew RegexOptions(); // C++/CLI
は同じ意味じゃない。

628:デフォルトの名無しさん
09/07/04 19:20:23
基本的に値型に^は付けない
パフォーマンスが落ちるし、C#など他のほとんどの.NET言語ではサポートされてないので良くない

629:デフォルトの名無しさん
09/07/07 21:49:30
2008 でコンパイルした dll とか exe を 2003 のプロジェクトで参照って出来ないよね?
両環境用に作ってやらないとダメかな。。。

630:デフォルトの名無しさん
09/07/07 23:42:26
できるけど必ずしも完全な互換性があるわけではないので
可能なら避けるべき

631:デフォルトの名無しさん
09/07/07 23:51:11
ん~。やっぱりそう?
プロセス間 I/F のクラスを作ってそれぞれで共用しようと思ったけど、
同じ仕組みのを 2003/2008 別個に作ることにするよ。

632:デフォルトの名無しさん
09/07/14 04:10:47
URLリンク(www.webtech.co.jp)
の右にあるようなものをC++/CLIで表現したいのですが似たようなものが見付かりませんでした。
何かそれに近いものや組み合わせればいけそうなものがあれば教えていただけますか。

633:デフォルトの名無しさん
09/07/14 04:29:24
要素の数が多そうだからコントロールを並べるより、
Graphicsで直接書いたほうがいいかも。
C++/CLIはあんまり関係ないな。VBかC#からはじめなよ。

634:デフォルトの名無しさん
09/07/17 23:25:44
教えて欲しい。

VS2008 の C++/CLI でメール関連のプログラムを書いているんだけど、
System::Net::Mail::Attachment を使って添付ファイルをつけると、プログラムが
終了するまで添付ファイルに使用したファイルを操作することが出来なくなる。

で、調べて、System::Net::Mail::Attachment は使い終わった後に、Dispose すると
ヘルプにもネットの記事にも書かれているようなんだが‥‥コンパイルすると C2039 エラーで
そんなメンバはないと怒られる。

エラーメッセージを読むと「代わりにデストラクタと呼べ」とあるので試しに delete してみたら
使用したファイルを普通に操作できるようになった。

マネージ環境では delete はしないモンだと思ってたんだけど、これでいいんだろうか?
期待通りに?動くからいいんだけど。。。

635:デフォルトの名無しさん
09/07/17 23:32:08
Destructors and Finalizers in Visual C++
に書いてる

636:デフォルトの名無しさん
09/07/17 23:37:05
C++/CLI では C# のDisposeパターンはデストラクタで実装されている

637:デフォルトの名無しさん
09/07/17 23:38:58
そんなもんC++/CLIで作るなよ

638:デフォルトの名無しさん
09/07/17 23:39:38
deleteを直接呼ぶのはDisposeを直接呼ぶのと同じだから避けるべき。

C#ではusingを使うのが常識だけど、C++/CLIで同じことをやるには、
自動変数の形で使うか、それが無理ならauto_handle/auto_gcrootを使う。

639:デフォルトの名無しさん
09/07/17 23:51:18
delete を・・・直接、呼ぶ?
ざわ・・・ざわ・・・

640:デフォルトの名無しさん
09/07/18 00:00:31
別におかしくない
C#でもDisposeの呼び出しを単独で書くことはしない
絶対にusingを使うかfinallyの中で呼ばないといけない

641:デフォルトの名無しさん
09/07/18 00:09:01
classのメンバにDispose持ちがいたら普通に単独で呼ぶが

642:デフォルトの名無しさん
09/07/18 00:14:34
その呼び出しの発端は単独ではないだろ

643:デフォルトの名無しさん
09/07/18 00:17:49
>>641
でもその場所はどうせデストラクタ・ファイナライザの内部以外に有り得ないでしょ。
それくらいだったらいいと思うけど。

でも、C++/CLIならauto_handleをクラスメンバにできなかったっけ?

644:デフォルトの名無しさん
09/07/18 00:23:20
でも、単独での呼び出しを書くことがあるというのは事実だよねって話

>>643
そいやC++/CLIってメンバに^付きで書かなきゃメンバのDisposeも勝手に読んでくれるんだよね

645:デフォルトの名無しさん
09/07/18 00:24:29
ファイナライザでDisposeは絶対ダメ
ファイナライザでメンバのマネージオブジェクトにアクセスするのは原則禁止

646:デフォルトの名無しさん
09/07/18 00:29:22
誤解を招くなぁそれ。C++/CLIのファイナライザ構文なんて
勝手にDispose呼び出しを生成してんぞ。

引数付きのDisposeパターンを守れってだけでしょ。

647:645
09/07/18 00:36:47
すまん言葉足らずだった
ファイナライザで"メンバの"Disposeはダメ

648:634
09/07/18 11:29:44
thx
こんなに沢山の人がいたんだ。。。

だいぶ慣れたと思ってたけど、まだわかってないことが多いみたい。
もっとお勉強するよ。
今回のは >>638 の auto_gcroot を使ってみようと思う。

>>637
C++ が好きなんだもん。w

649:デフォルトの名無しさん
09/07/18 15:01:37
auto_handleはマネージクラス・マネージコード内、
auto_gcrootはネイティブクラス・ネイティブコード内で使う。

650:デフォルトの名無しさん
09/07/18 15:51:27
C++好きなのはいいけど.NETに慣れる意味でも一度はC#やってみたほうがいいよ
なぜ本スレでさえアンマネージコードとの相互運用という本来の目的以外での
C++/CLIの使用に否定的な人が多いのか理解できるはず

651:デフォルトの名無しさん
09/07/18 15:57:56
相互運用ならC++/CLIはいい。もうC#でDllImportする気が起こらない。

652:デフォルトの名無しさん
09/07/19 00:02:11
URLリンク(clrinterop.codeplex.com)

653:デフォルトの名無しさん
09/07/19 00:13:08
いや、DllImportさえ簡単に貼り付けられればC#で問題ない、という程度のことではないから。

654:634
09/07/19 00:54:11
>>649
thx
勘違いして入れ替わってたよ。

auto_gcroot は変数定義した後に代入できるけど、auto_handle は変数定義の時の
初期化でしか代入できないとか、多分、何かの都合があるんだろうけど、面白いね。

>>650
どっちでも一応書ける。
だいたい画面系に C# 、それから呼ぶライブラリ関連に C++/CLI を。(最初にそうお勧めされた)
いまいち「目的外での C++/CLI に否定的」ってのがよくわかってないんだけど。。。
感覚的にはわかるような気もするけど、言語として C# の方に抵抗を感じたりして。

655:デフォルトの名無しさん
09/07/21 12:12:27
>>650
やっぱ、CLIは無意味?

656:デフォルトの名無しさん
09/07/21 18:51:25
>>655
ブリッジ


657:デフォルトの名無しさん
09/07/21 18:56:51
ドトネトにブリッジする理由は???

658:デフォルトの名無しさん
09/07/21 21:47:10
.NET開発の補助として使うものであって、決して
「.NETが使える便利なC++」ではない

659:デフォルトの名無しさん
09/07/21 23:02:04
適材適所という言葉があってだな(ry

660:デフォルトの名無しさん
09/07/22 08:06:27
この天気、日食どころじゃねーな。

661:デフォルトの名無しさん
09/07/22 09:19:19
それ食えるのか?

662:デフォルトの名無しさん
09/07/22 10:12:57
ドトネト材の適所って何?

663:デフォルトの名無しさん
09/07/22 10:35:54
Java+JNIと比べるとはるかに優れているな。
だれか、javaVM用のC++/CLI?を作ってくれ。

664:デフォルトの名無しさん
09/07/22 10:41:19
ハンドルの指すアドレスの最初の4バイトは何のデータですか?
昔.NETを勉強したときに、
オブジェクトヘッダーは同期ブロックインデックスと
クラス定義へのポインタで構成されてると
読んだ記憶があるんですが

665:デフォルトの名無しさん
09/07/22 12:55:00
>>664
知ってどうするんだよ?


666:デフォルトの名無しさん
09/07/26 16:56:25
おしえて。

フォームアプリのテキストボックスとかにデータバインディングで、
DataTable の要素を関連づけて入力値を管理したい。

ここで、テーブル中のレコードが1つの場合はいいんだが、複数あって
かつ、バインドするレコードを動的に変更したい場合ってのはどうすれば
いいのだろうか?

よくわからなかったので、

・バインド用に同じ構造のテーブルを用意して
・そこにレコードをひとつだけ作り
・そのレコードに元テーブルの任意のレコードの値をコピーする
・フォーム終了後にもとのテーブルのレコードに値をコピーし直す

方法で使おうとも思ったのだけど、もっと直接的な方法がありそうな気がする。
いかがだろうか。教示いただけると嬉しい。

667:デフォルトの名無しさん
09/07/26 17:08:13
>>666
ここよりもC#、VB、ADO.NETスレあたりで聞いたほうが早いと思うよ。

668:デフォルトの名無しさん
09/07/26 18:06:25
そう? じゃ、C# のスレに移動するよ。
thx

669:デフォルトの名無しさん
09/07/27 23:44:45
質問です。
自転車って制限速度が無いと聞いたことがあります。
一方で、系車両は制限速度30km/hと聞いたことがあります。
自転車に関してはどうなのでしょうか。
自転車に速度計装着の義務付けが無い以上、
制限速度自体、無意味なことだと思うのですが。


670:デフォルトの名無しさん
09/07/27 23:50:41
無料で難読化できるソフトはありますか

671:デフォルトの名無しさん
09/07/28 00:34:28
ある

672:デフォルトの名無しさん
09/07/28 10:55:16
>>669
軽車両には車両種別による速度制限はありません。標示の制限に従ってください。

673:デフォルトの名無しさん
09/07/28 14:57:05
C++/CLI的には見られたくないところはネイティブコードで書けばいい

674:デフォルトの名無しさん
09/08/04 06:16:44
PictureBoxの左上を座標(0,0)としてマウスでクリックしたときの
PictureBoxの左上からのオフセット座標を取得したいのですが
いい方法ありますでしょうか。


675:デフォルトの名無しさん
09/08/04 06:47:44
>>674
取得したいも何も、MouseClickイベントで受ければ
MouseEventArgsに入ってるだろ。

676:デフォルトの名無しさん
09/08/06 06:26:04
質問です。
初期化時にPictureBoxに格子上の線を描画したあと、PictureBox内をクリックした場所に図形を描画したんですけど
再度クリックしたときにその図形を消したい場合は一度RefreshやClearなどをしたあとに格子上の線・図形は再度描画
するしか方法ないですよね。

677:デフォルトの名無しさん
09/08/06 06:27:14
___
←樹海| 
 ̄|| ̄ ┗(^o^ )┓三
 ||    ┏┗  三
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄



678:デフォルトの名無しさん
09/08/06 09:04:47
>>676
毎回描画し直します。
C++/CLIに限らない.NET Frameworkの使い方についてはC#かVB.NETのスレで質問することをお勧めします。
(C++/CLIにしかない機能を使わないならC++/CLIを使うこと自体お勧めしません)

679:デフォルトの名無しさん
09/08/12 11:52:55
質問です。
プロジェクトの新規作成で自動的に作成されるFrom1.hですが、
簡単に一括で、それらしい名前(CalcMainForm.h等)に変換で
きる方法はありますか?(自動生成されるコード内のClass名称
なども追従したい)

今は、手作業でファイル名の変更後、コード内の名称を置換しています。


680:デフォルトの名無しさん
09/08/12 12:10:44
VSのアドインとかでリファクタリングのツール探してみては

681:デフォルトの名無しさん
09/08/12 18:06:34
ファイル名はファイルのプロパティの名前
クラス名はクラスのプロパティのName
簡単と感じるかは人による

682:デフォルトの名無しさん
09/08/15 10:36:57
俺はウィザード直後に即削除。
新しく任意のFormクラスを作成→コードゴリゴリw

683:デフォルトの名無しさん
09/08/23 00:11:09
クラスを参照渡しするときに、mainで渡すと問題なく実行できるのですが
クラスの中で渡すと下記のエラーが発生してしまいます。

"演算子 '%' は、値型または ref クラスのインスタンスにのみ適用できます"

このエラーを回避するためにはどのようにすればいいでしょうか?


おk:
main(){
A^ a;
B^ b;
b->(%a);
}

マズー:
ref class Z{
A^ a;
B^ b;
b->(%a);
}


684:デフォルトの名無しさん
09/08/23 01:50:23
クラスの中に処理は直接書けない。メソッドの中に書く。
エラーを回避とかそういう次元の問題ではないのでまずはC#かC++を一通り勉強するべき。

685:デフォルトの名無しさん
09/08/23 02:10:25
これからC++/CLIを勉強しようと思うんだけど
どんな本読んだらいいのかしら?^^

686:デフォルトの名無しさん
09/08/23 02:21:17
VisualStudio2008ExpressEditionをイジリ倒す。

687:デフォルトの名無しさん
09/08/23 02:24:20
C++とC# (またはVB7-)をどのくらい理解してるかでいろいろ違ってくる。
両方まだなら手を出さないほうがいい。

688:デフォルトの名無しさん
09/08/23 06:57:30
というかC++もC#も両方使いこなせる人にしかC++/CLIを使う意味がないし使う必要もない。

689:デフォルトの名無しさん
09/08/23 07:16:52
C++はGOF本を読むレベルっす。オブジェクト指向設計も任せてネ★
MFCはまぁそこそこ。ATLはさっぱり。WTLはみたこともない。

C#? なにそれ?
マイクロソフトローカルな糞言語になんてまったく興味ねぇんだよっ

690:デフォルトの名無しさん
09/08/23 08:07:39
C++/CLIのスレで、よくそんなことがいえるな。
C++/CLIがよりいっそうマイクロソフトローカルな糞言語なのを理解しているのか?

691:デフォルトの名無しさん
09/08/23 09:37:50
所詮はつぎはぎで緊急避難するときだけ使う補助言語だからな

692:デフォルトの名無しさん
09/08/23 10:16:28
ワロタ
>>689は自分がどこに書き込んだのかもわかってないのか

693:デフォルトの名無しさん
09/08/23 11:20:47
自分は C++/CLI については 実践C++/CLI 極めるための基礎と実用テクニック を読んだだけだな。
あとは C# まで含めてどうとでもなったよ。

ただ。最初のコードを見る限り、基本からわかってないと思うけど。
C++ がどうとかではなくて、プログラミングの基礎からって意味で。
ちゃんと基礎からやった方が、結局は時間の節約になると思う。

694:デフォルトの名無しさん
09/08/23 22:41:47
つまり、。NETについて学ぶにはまずC#を習得して来い…と。
C#…なぁ。Javaならまだ学ぶ気あるんだけど。
(J++1.0が出た当時にちょろっとかじったから、基本はあるんだよ^^
 でも最近はJava5とかいうのらしいから、勉強しなおしかな^o^;)

どうせ5年もしないうちに「なかったこと」にされるような言語なんて
学ぶだけ資源の無駄だしなぁ。どうしようかなぁ。ああー。

695:デフォルトの名無しさん
09/08/23 22:51:22
C#が世に出て既に8年ほどたつが、まだなかったことにはなってないな
C++/CLIのほうがよほど…

696:デフォルトの名無しさん
09/08/23 23:00:41
これって何に使うの?
C++Builderの代わり?

697:デフォルトの名無しさん
09/08/23 23:15:50
てか、基礎のある人間なら、わざわざ覚えるってほどのモンでもないだろ。
MFC わかるんだよね?

698:デフォルトの名無しさん
09/08/23 23:20:23
J++のWFC、delegate、J/Directを理解してるならそれはそれですごいな。
delegateはC#のとも一味違うぞ。


699:デフォルトの名無しさん
09/08/24 06:41:25
C#やったことなくてもC++/CLIは使えるかもしれないけど
C#で.NETの流儀に慣れてないと.NET的にはとんでもないコードが確実に出来上がる

700:デフォルトの名無しさん
09/08/24 12:49:28
>>699
慣れてないせいか、Disposeルールが
なんか気持ち悪い。


701:デフォルトの名無しさん
09/08/24 16:13:03
>>700
あれはネイティブなC++でいうところの単なるデストラクタなんだが……

702:デフォルトの名無しさん
09/08/24 19:24:05
そう思っているなら確実に
>.NET的にはとんでもないコード
を書いてるな。


703:デフォルトの名無しさん
09/08/25 21:04:58
MFCのDLLがあってCLIでラップしてVB.NetとC#で利用しようとしてるんですが
unsigned char *の配列データを受け渡しするところがあって
VB.NetだとこれはByte()になるんだろうけどどういう変換すればいいのでしょう?
Byte()の引数ってCLI側での表記方法も分からないし

704:デフォルトの名無しさん
09/08/25 22:13:16
Byte[] に変換するなら、

 cli::array< System::Byte >^ a = System::Text::Encoding::GetEncode( "エンコードの種類" )->GetByte( "String型の文字列" );

ただ、Byte[] に変換したいのではなくて、String から char* に変換したいんだろうから、だったら、

 ::sprintf( a, "%s", "String型の文字列" );

‥‥本当に出来る。w
正しい?方法は StringToHGlobalAnsi でぐぐれ。

705:デフォルトの名無しさん
09/08/25 22:25:20
いえ、画像データなんで本当にバイト列が必要なんです

706:デフォルトの名無しさん
09/08/25 22:25:55
バイナリデータであるByte()やbyte[]を渡したいだけかもしれないぞ。
もしそうなら、cli::array<System::Byte>^型が対応するのでこれを使えばいいだけ。
自分はcli::array<unsigned char>^と書く方が好みだがまあどっちでも同じ。

707:デフォルトの名無しさん
09/08/25 22:36:09
unsigned char* だから普通に byte 配列だろなんとなく。
分かりにくいので以下の説明は BYTE* で行くな。

まず、BYTE* -> byte[] はそのままでは無理。byte[] を
構築してコピーする。

BYTE source[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
array<Byte>^ arr = gcnew array<Byte>(10);
pin_ptr<Byte> p = &arr[0];
memcpy(p, source, 10);

次に、byte[] -> BYTE* は可能。上でやってるが、pin_ptr でおk。

pin_ptr<Byte> p = &arr[0];

ちなみに、VB だったら GCHandle で Pinned しなさい。IntPtr が
取れる

まとめ。なんで両方の方向の説明したかというと、コピー発生させ
たくないならマネージで byte[] なバッファ作成して(ここポイント)、
それ使うといいよみたいな。


708:デフォルトの名無しさん
09/08/25 22:42:03
いやcli::arrayってByte()と同じ形なの?
双方向でやりとりするんだけどコピーではなくて共有して書き出すからポインタを変換しないといけない
例えば
DLL側
array<Byte> ^GetData();

VB側
dim bytes as Byte[] = dll.GetData()
bytes[0] = 255;

みたいな使い方がしたい

逆にVB側のByte[]を渡してDLLに中身を書き込ませるような処理もある

ポインタのキャストがうまくいかないんだけどどうすればいいの?

709:デフォルトの名無しさん
09/08/25 22:54:02
cli::array< Byte >^ と Byte[] は同じ型だよ。
言語による表現の違いなだけ。

うまくいかないって、どんなエラーなわけ?

710:デフォルトの名無しさん
09/08/25 22:56:11
エラーというかキャストの仕方が分からない

711:707
09/08/25 22:56:55
>>708
・・・伝わってねぇかなぁ。その例なら

void Hoge(BYTE* p) {
 p[0] = 255;
}

void Piyo(array<Byte>^ arr) {
 pin_ptr<Byte> p = &arr[0];
 Hoge(p);
}

array<Byte>^ GetData() {
 array<Byte>^ arr = gcnew array<Byte>(10);
 pin_ptr<Byte> p = &arr[0];
 Hoge(p);
 return arr;
}

これで分かる?

712:デフォルトの名無しさん
09/08/25 23:01:19
>>711
GetDataは元がunsinged char *なんで
それごどうにかしてarray<Byte>^にしないといけないんですが

713:デフォルトの名無しさん
09/08/25 23:06:34
仮にarray<Byte>^にして渡した後ってVBのガーベージコレクタに殺されたりする?
それはまずいな

714:デフォルトの名無しさん
09/08/25 23:09:10
ということはVB->DLLの方向の時だけByte[]で受け取って
DLL->VBの時はラッパーDLLでアクセスを仲介するような関数を容易するべき?
例えばWriteByteみたいな関数を入れてDLLの保持してるメモリはVBでは触れないようにした方がいいの?

715:デフォルトの名無しさん
09/08/25 23:12:05
managed側のメモリはpinすればunmanaged側でいじれるが、
逆は出来ないんじゃないかなぁ。
基本はコピーになるはず。

unmanaged側でメモリを保持して、managedにはハンドルやクラスの形で
渡してやるのがセオリーだと思うよ。

716:デフォルトの名無しさん
09/08/25 23:13:32
なんかdllの仕様まで変更できるような話になってるが

717:デフォルトの名無しさん
09/08/25 23:20:04
メモリへのポインタを渡したいのか、ただデータを入れた配列を渡せればいいのかわかんね。
キャストの仕方っても、どんなところでなにをやろうとしてるのかわかんね。
dynamic_cast とかをキーワードにして調べてみたら? 自分で。

718:デフォルトの名無しさん
09/08/25 23:23:42
>>715
じゃあGetDataの部分はIntPtrを返してVB側でMarshal.ReadByteするのが適切?

>>716
CLIのラップDLLはGCの影響は受けないでしょ

>>717
ポインタを渡して中身を双方で共有して直接いじりたい
メモリは確保した方が解放するというのがルール

719:デフォルトの名無しさん
09/08/25 23:30:55
そう。

byte[](マネージバイト配列)ってのはマネージヒープに確保
されてそこにあるやつ。アンマネージで勝手に確保した
なぞの領域にあるところをさしたポインタってやつはそうじゃ
ないから当然変換できないしコピーするしかない。
マネージにあるやつのポインタ化(pin_ptr) は可能だが、逆は
無理。

結局シームレスにいじりたい領域はマネージ側で確保して
やるしかない。アンマネージポインタしかないんなら、コピーとか
マーシャリングとかしかない。

CLS 非準拠だと CLI は一応 T* みたいな形式も持ち運べは
するんだけどな。準拠させるためには IntPtr とかのやり取りと
なる。
…VB じゃなく C# ならそのポインタシームレスに使えるのだがな。

720:デフォルトの名無しさん
09/08/26 00:12:20
とりあえずラップDLLに読み書き専用の関数を持たせることで解決しました

721:デフォルトの名無しさん
09/08/26 14:58:37
プロパティの書き方で、ヘッダー(h)とソース(cpp)に分離する方法を教えてください

property float X
{
float get();
void set(float value);
}

ヘッダーにこのように書いたところ、
1>Vec3.obj : error LNK2020: 未解決のトークン (06000008) Fwm.Math.Vec3::get_X
1>Vec3.obj : error LNK2020: 未解決のトークン (06000009) Fwm.Math.Vec3::set_X

と言われたので、ソースに
float Vec3::get_X() { return 0; }

と定義してみたのですが書き方が間違っているようでコンパイルが通りませんでした

722:デフォルトの名無しさん
09/08/26 15:02:46
Vec3::X::get

723:デフォルトの名無しさん
09/08/26 15:10:32
そこかぁあああああああ!!!
ありがとう!!

724:デフォルトの名無しさん
09/08/26 15:14:58
インテリセンスに出ると思うんだがな

725:デフォルトの名無しさん
09/08/26 15:18:17
ところがどっこい出なかった

726:デフォルトの名無しさん
09/08/26 17:44:34
CLRでも<summary>指定したらインテリセンスにでまつか?

727:デフォルトの名無しさん
09/08/26 19:23:04
CLRが何だと思ってるのか詳しく聞かせてもらいたいな

728:デフォルトの名無しさん
09/08/27 02:05:29
C++/CLIとC++ネイティブのコード共存で開発してるんですが、

C++ネイティブクラスのメンバーをDataBindingするのって不可能ですか?

こんな感じでやってみたいのですが、System::Object^型にsrcを変換できずに
コンパイルエラーを吐きます。。。

class src {
public:
int m;
};

src = new csrc;
textBox1->DataBindings->Add(gcnew Binding("Text", src, "m"));

※textBoxのTextプロパティにintの値を設定しようとしているのは、例なのでスルーしてください。


729:デフォルトの名無しさん
09/08/27 06:51:20
中でリフレクション使ってるんだからできるわけがない
マネージクラスでプロパティとしてラップする

730:デフォルトの名無しさん
09/08/27 09:06:34
C++/CLIでも<summary>指定したらインテリセンスにでまつか?

731:デフォルトの名無しさん
09/08/27 09:20:42
出るよ

732:デフォルトの名無しさん
09/08/27 09:29:31
/// <summary>
/// クラス解説
/// </summary>
public ref class Test

って書いたら
<summary>
クラス解説
</summary>

って出た。<summary>消したら
クラス解説

って出た。なんか違うかな・・・

733:デフォルトの名無しさん
09/08/27 14:50:40
XMLドキュメントを出力するオプションは有効になってる?

734:デフォルトの名無しさん
09/08/27 16:29:59
ありがトン
なってませんでした
有効にしたら隣に~.xmlってのが出来たけど
やっぱりインテリセンスには出てこねぇ

735:デフォルトの名無しさん
09/08/30 12:38:18
デリゲートで関数のポインタを変数に渡そうとしてるんだけど
うまくいかない。

delegate void startCallback();
startCallback^ cb_start;

cb_start = gcnew startCallback(start);
fn = &cb_start;
cb_startがデリゲートの変数なのですが。
どうしたらいいでしょう?

736:名無しさん@そうだ選挙に行こう
09/08/30 12:40:23
&はいらん
^の意味解ってる?

737:735
09/08/30 12:50:37
>>736
確か似そうでした。
で、&を外してみたところ
error C2440: '=' : 'startCallback ^' から 'void (__clrcall *)(void)' に変換できません。
とかいうエラーが・・・。
どういう意味なのでしょう?



738:名無しさん@そうだ選挙に行こう
09/08/30 13:06:42
デリゲートと関数ポインタは別物だから。

739:名無しさん@そうだ選挙に行こう
09/08/30 16:30:32
>>735
fnやstartがどう定義されているか見えないけど、
fn = start でいいでない?

740:735
09/08/30 17:37:50
fn=start だと
error C3867: 'start': 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&start' を使用してください
となって、fn=&startとすると737 のエラーとなるという。

fnもstartも同じ型でvoid (*dsfunctions::start)(void)なのだが、
c++/CLIだとだめらしい。

関数ポインタを渡したいだけなんですがどうしたもんでしょう?


741:名無しさん@そうだ選挙に行こう
09/08/30 18:03:47
もしかして、スタティックでない関数をその書式で使用しようとしてない?
ちがうなら、下みたいにすべきじゃね?

cb_start = gcnew startCallback( [startメンバを含むクラスインスタンス], start );

742:名無しさん@そうだ選挙に行こう
09/08/30 18:07:28
生のC++でもクラスのメンバ関数というか仮想関数の関数ポインタはカオスだからなぁ。

743:デフォルトの名無しさん
09/08/30 22:24:58
マネージドとネイティブでポインタや関数の互換はないから
関数自体をどちらかにラップするしかないだろう。
以下は関数ポインタとデリゲートの使用例
int native1(int x, int y) { return x+y; }
class Foo {
 public:
  static int nativeS(int x, int y) { return x+y; }
  int nativeV(int x, int y) { return x+y; }
};
delegate int MyCallback(int x, int y);
ref class Hoge {
 public:
 static int ManagedS(int x, int y) { return x+y; }
 int ManagedV(int x, int y) { return x+y; }
};


744:デフォルトの名無しさん
09/08/30 22:27:07
int main() {
  Hoge^hoge = gcnew Hoge();
  Foo foo;
  int (*f1)(int, int) = &native1;
  int (*f2)(int, int) = &Foo::nativeS;
  int (__thiscall Foo::*f3)(int, int) = &Foo::nativeV;
  //int (__clrcall *f4)(int, int) = &Hoge::ManagedS;
  //int (__clrcall Hoge::*f5)(int, int) = &Hoge::ManagedV;
  MyCallback^ f6 = gcnew MyCallback(Hoge::ManagedS);
  MyCallback^ f7 = gcnew MyCallback(hoge, &Hoge::ManagedV);
  System::Console::WriteLine(f1(100, 1));
  System::Console::WriteLine(f2(100, 2));
  System::Console::WriteLine((foo.*f3)(100, 3));
  System::Console::WriteLine(f6(200, 6));
  System::Console::WriteLine(f7(200, 7));
  return 0;
}
clrcall型の関数ポインタはdelegate作成時にしか使用できない。


745:デフォルトの名無しさん
09/08/31 01:47:06
^は「へ」って読むんだぞ

746:デフォルトの名無しさん
09/08/31 01:47:31
へー

747:デフォルトの名無しさん
09/08/31 10:30:09
実践C++/CLI 極めるための基礎と実用テクニック
アマゾンに入荷したね

748:デフォルトの名無しさん
09/08/31 20:52:39
え。出品者からお求めいただけます、じゃなくて?

749:デフォルトの名無しさん
09/09/01 03:42:45
うん。昨日見たときアマゾン新ピンが2800円ぐらいで売ってた
今見たら終わってたw

750:デフォルトの名無しさん
09/09/01 14:33:06
ていうかアマの技術書は一度の入荷数が少ない
近くの書店で取り寄せすればすぐだ

751:デフォルトの名無しさん
09/09/02 00:29:13
自分が確認したときにはすでになかったから、釣りかと思ったわ。
情報ありがとう。普通に取り寄せてみるよ。

752:デフォルトの名無しさん
09/09/02 01:16:03

C++の保守チームからCLIのチームに移ってきた新参者です。
C++の頃に良くみた無名名前空間でのリテラル文字定数の宣言

namespace {
const std::string EngFileName = "XXXX"
const std::wstring JpnFileName = L"XXX"
}

と同じことがしたくて

namespace {
const String^ EngFileName = "XXXX"
const String^ JpnFileName = L"XXX"
}

にしたらコンパイラ君に怒られてしまった。
もしかして、CLIではできない? 
const char* const EngFileName = "XXXX" みたいにC言語風に明記しないとだめなのでしょうか?

753:デフォルトの名無しさん
09/09/02 01:18:30
適切なクラス作って静的メンバにするのが.NETのやり方

754:デフォルトの名無しさん
09/09/02 01:33:56

そうなんですか!! ありがとう。
C++のころは、cppで使いまわすだけの定数をヘッダーに追加すると、
結構、コンパイルに時間がかかったので、無名名前空間に押さえ込んでました。

あ、そういえば自動生成されるコードもCLIは全部、ヘッダーに展開されますね。
無名空間はだめで、静的メンバであればOKってのが理解できないので、
ちょっくらテストしてきます。 注意点とかあれば教えていただけますか?

755:デフォルトの名無しさん
09/09/02 03:23:27
>>754
なんか分かってなさそうなので念のために言っておくけど、
適切なクラスというのはref classのことだぞ。


756:デフォルトの名無しさん
09/09/02 08:44:54
>754
const は String^ にはつけられないから literal 使え

757:デフォルトの名無しさん
09/09/02 15:51:30
initonlyも忘れないで。外へ公開するメンバなら特に。

758:デフォルトの名無しさん
09/09/02 18:24:19
initonly と literal はアセンブリ化したときの文字列確定のタイミングが違うから気をつけろ

759:デフォルトの名無しさん
09/09/02 22:48:46
やば。initonly を完璧に忘れてた。。。

760:754です。
09/09/04 19:08:41

ありがとうございます。
準備した参考書では、literalもinitonlyも明記がなかったので、なかなかできませんでしたが、
ようやくテストできました。(結果もOKでした。)

ただ、literal と static const の違いだけが分かりませんでした。
どちらも同じ結果になるので・・・。
CLIで追加された宣言なので、literalを使えば良いのかな?

それにしても、CLIの情報は探すのが大変ですね・・・。みなさんはどうしてますか?(どうやって覚えました?)

761:デフォルトの名無しさん
09/09/04 20:26:10
>760
String^ は追跡参照なのでポインタのようにアドレスが一定ではない。だから、const
指定できない。(const が有効だとGCがString^を移動できない)その代わりに literal が
あると思っていい

762:デフォルトの名無しさん
09/09/04 20:38:18
literalって単なるアセンブリのメタデータだし

763:デフォルトの名無しさん
09/09/13 01:12:57
>>879
パレスチナ問題って深刻だね。

764:デフォルトの名無しさん
09/09/13 04:02:10
C++/PLO
うむ、一文字しかあってない

765:デフォルトの名無しさん
09/09/14 19:53:24
pin_ptrのようにオブジェクトの移動を制限する方法って他にないでしょうか
スコープを抜けてもずっと固定していたいんですが

766:デフォルトの名無しさん
09/09/14 20:02:36
GCHandleを割り当てる

767:デフォルトの名無しさん
09/09/16 22:06:03
C++からの移植で下位のような変換を行ってみました。

clss NameHolder
{
   NamaInfo _Name;
public:
   NamaInfo getNameInfo();
}

ref clss NameHolder
{
NamaInfo^ _Name;
public:
NamaInfo^ getNameInfo();
}

768:デフォルトの名無しさん
09/09/16 22:10:18
C++からの移植で下位のような変換を行ってみました。

// C++の場合
clss NameHolder
{
  NamaInfo _Name;
public:
  NamaInfo getNameInfo();
}

// CLIの場合
ref clss NameHolder
{
  NamaInfo^ _Name;
public:
  NamaInfo^ getNameInfo();
}

C++の場合だと、getNameInfo()で取得したNamaInfo を呼び出し元で変更しても、
元の値(NameHolder)は値が変わりませんが、 CLIの方だと変わってしまいます。
ハンドルだからといわれそうですが、CLIで値を保持するクラスより、クラス側の値を取得するのは
一般的にどのように実装すべきでしょうか?

769:デフォルトの名無しさん
09/09/16 23:09:46
value class使え

770:デフォルトの名無しさん
09/09/17 02:04:27
ありがとうございます。
value class を使用することで、目的の動作ができました。
ただ、疑問が残りまして、該当クラスには、セッター関数もありまして

(1) void setNameInfo( NamaInfo^ Name) { _Name = *Name; }
(2) void setNameInfo( NamaInfo& Name) { _Name = Name; }
(3) void setNameInfo( NamaInfo Name) { _Name = Name; }

もどれも同じ挙動でした。(3)にすると、実体がコピーされて遅そうなので、
(1)か(2)かと思ったのですが、一般的にはどちらを使うものなのでしょうか?

771:デフォルトの名無しさん
09/09/17 02:08:28
実体コピーしなきゃ結局他でNameInfo変更したときに影響するだろ…

772:デフォルトの名無しさん
09/09/17 02:23:39
便乗ですまない

>>770の(1)はマネージでないとダメで、(2)はアンマネージでないとダメだと
思っていたんだけど、両方とも許される状況っていうのはあるもんなの?

773:772
09/09/17 02:37:45
value classだと(2)は問題なく参照となり、
(1)はボクシングが行われた上で、ハンドルを取得できる、と考えたけどあってるのかなぁ。
難しいなぁ

774:デフォルトの名無しさん
09/09/17 02:41:02
public value class NameInfo
{
   public: property Int32 ID;
};

public ref class NameHolder
{
   NameInfo _Name;
public:
  NameInfo get(){return _Name;}
// void set(NameInfo^ Name ){_Name = *Name;}
// void set(NameInfo& Name ){_Name = Name;}
  void set(NameInfo Name ){_Name = Name;}
};

int main(array<System::String ^> ^args)
{
  NameInfo Name;
  Name.ID = 10;
  NameHolder Holder;
  Holder.set(Name);
  NameInfo Buf1 = Holder.get();
  Console::WriteLine(Buf1.ID);
  Name.ID = 20;
  NameInfo Buf2 = Holder.get();
  Console::WriteLine(Buf2.ID);
  return 0;
}
どれも結果は 10、 10と表示され、値は登録後の値は変わりませんでした。
根本的に、なんか勘違いしてますかね?


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch