2012年09月プログラム26: くだすれC++/CLI(初心者用)part2 (614) TOP カテ一覧 スレ一覧 2ch元 削除依頼
くだすれDelphi(超初心者用)その54 (902)
【アンチ】関数型言語は使えない【玩具】 2 (407)
GPGPU#5 (274)
C++11が動的言語よりも開発効率が良くなってる… (222)
WindowsDDK各種についてのスレ (739)
CLDC+MIDP+携帯電話用Javaスレッド part 9 (928)

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


1 :2010/03/15 〜 最終レス :2012/11/01
おそらく、.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 :
ドキュメントの MSDN には、System::String(SByte*); て書いてあるけども、
System::String(char*); が正解ってことか?
それとも SByte が signed char ではなくて char てこと?それは無いような気が。
ちなみに、使ってる教科書のサンプルプログラムは8bitでは char* 配列を渡してる。

3 :
厳密名の付け方が分かりません
検索しても意味不明なものしか引っかからない

4 :
開発でつかわれてるのかな?
C++/CLIって。

5 :
必要なら使われるだろ。
だからなんなんだ?

6 :
>>3
LINKにある。
/KEYCONTAINER /KEYFILE

7 :
というか必要な時だけ最小限使うもの
基本的に使わないほうがいい

8 :
最近妙にお気に入り

9 :
Managed C++でさえ一部で使われていた。

10 :
フォームの中にあるテキストボックスの内容をmainとか関数とかから書き換えたいんだけど
どんな方法があるでしょうか?
今までは強引にチェックボックスにチェックが入ると
void test(System::Windows::Forms::TextBox^ tb_log_view);
こんな感じの関数呼び出してTextBoxを強引にわたして指定の処理して
テキストボックスにメッセージ表示させてたんだけど
何せ使い勝手が悪いので・・・

11 :
String^使えばいいんちゃう?

12 :
今、「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#版を使ってます。

13 :
>  static CHAR cUpdate; 
Cさえ理解していないのがよくわかる。

14 :
うわ・・・・・
泣ける・・・・orz
回答有難うです

15 :
突っ込みどころや怪しい箇所が多すぎて、どうしたいかが見えてこない(笑
配列はC++/CLIでアロケーションしていいのかとか。
C#でいう構造体はvalue class (or struct)であって、ref structはクラスだけどどっちにしたいのとか。

16 :
目的は、「Cで書かれたライブラリをC#で使う」事なのですが、
現状は、Cの方には手を加えないように、やる方法として、C++/CLIで
ラッピングするという手段があるという事なので、作業している次第。
そこで、構造体のポインタを戻り値としている関数はどう扱えば?と
思ってましたら、
http://ap.atmarkit.co.jp/bbs/core/fdotnet/17380
このような話をみつけたので、まずはref structでやってるという状況です。

17 :
CのライブラリだったらC++/CLIなんか使わずにC#でDllImportすればいいような

18 :
>>17
説明不足でした。
(当然の疑問ですよね)
そのCのライブラリというのが、元がスタティックしか考慮されておらず、
DLL用にはなってなく(__declspec(dllexport)のような記載は一切なし)、
選択肢として
1 Cのソースをdll対応に修正(__declspecを全関数に追加)
2 元のCには手を加えず、新しくラッパーを作る
があり、今後もCの方は勝手にバージョンが上がっていくので、
それなら、元のソースに手を加えない方向でやろうとなった次第です。

19 :
だからってそのラッパーをC++/CLIで書く必要はないだろ
Cで薄ーいラッパー書いて普通のネイティブDLLとしてコンパイルすればおk
C++のライブラリとなると面倒だけどそうでないならC++/CLIはできるだけ避けたほうが賢明

20 :
>>19
その手がありましたか!
C#でDllImportして、
DLL関数に渡す構造体、DLL関数から受け取る構造体は
[StructLayout(LayoutKind.Sequential)]を用いてC#側に定義して
やりとりするという事ですね。
試してみます

21 :
【初心者歓迎】C/C++室 から誘導されてきました。
Form1とForm2があり、Form1からForm2を呼び出すようにしています。
また、Form2に配置したボタンを押すと関数が呼び出されて、所望の処理をするようにしています。
以下の2点について教えてください。
1.関数内の処理の進捗をForm2内のLabelやProgressBarに表示したいです。
2.Form2からForm1を操作したい(Form2のボタンを押すとForm1/Form2ともに終了するようにしたい)です。
両方ともポインタを使えば出来そうな気がするのですが、例えば2.の方ではForm2を指すポインタの宣言の仕方が
わからないです。
よろしくお願いします。

22 :
>>21
ポインタじゃなくて参照になる。
Form2^ form2;

23 :
>>21
動くかどうかは試してない。
【Form1.h】
ref class Form1 {
public: System::Void Form1Func() {〜}
private: System::Void Form2Func();
private: System::Void Form1_KeyDown(〜) {Form2Func();}
}
【Form1.cpp】
#include "Form1.h"
#include "Form2.h"
System::Void Form1::Form2Func(){
Form2^ form2 = safe_cast<Form2^>(Application::OpenForms["Form2"]);
form2->Form2Func();
}
【Form2.h】
ref class Form2 {
public: System::Void Form2Func() {〜}
private: System::Void Form1Func();
private: System::Void Form2_KeyDown(〜) {Form1Func();}
}
【Form2.cpp】
#include "Form1.h"
#include "Form2.h"
System::Void Form2::Form1Func()
{
Form1^ form1 = safe_cast<Form1^>(Application::OpenForms["Form1"]);
form1->Form1Func();
}

24 :
>>22>>23
ありがとうございます。
残念ながらうまくいかないです。
環境はVS2005 C++ WinXP SP3
Form1(親フォーム)からはForm2.hをインクルードして
Form2^ frm = gcnew Form2();
frm->ShowDialog();
とできるのですが、Form.hではForm1.hをインクルードすると循環参照になってしまうようでエラーになります。
また、Form2.h内で関数宣言だけしてForm2.cpp内でForm1.hをインクルードして実行部分を書こうとしましたが
Form2.h内の関数宣言(>>23のprivate: System::Void Form1Func();にあたる部分)がコンパイルエラーになってしまいます。


25 :
なんでこういう意味での初心者がC++/CLIなんてマニアックな言語触ってるんだろう……?
> Form2に配置したボタンを押すと関数が呼び出されて
> 1.関数内の処理の進捗をForm2内のLabelやProgressBarに表示したいです。
Form1関係ないよね? Form2が勝手にやってろって話
> 2.Form2からForm1を操作したい(Form2のボタンを押すとForm1/Form2ともに終了するようにしたい)です。
Form1がForm2を作ったとき、Form2のFormClosedイベントに引っかけるとかすればいいんじゃね?
// Form1内のForm2を表示させる処理
Form2^ form = gcnew Form2();
form->FormClosed += gcnew FormClosedEventHandler(this, &Form1::OnForm2Closed);
form->Show();
// Form1内で定義
private: void OnForm2Closed(Object^ sender, FormClosedEventArgs^ e) {
  this->Close();
}
×アイコンで閉じたときはForm1は閉じない、ボタン押したときだけとかなら
Form2にCloseWithParentみたいなプロパティ用意して
表示させるときのForm2^はメンバ変数に保持しておいて
OnForm2Closedで確認

26 :
C++/CLIだと、Cのランタイム例外のハンドリングが出来ない臭いんだけど、どうすれば良いんだろう…
ハンドラ設定してるのに動いてくれない
例えば_tcsftime(..., L"%h", ...);みたいなやつ
※普通の例外じゃないんで、マネージand/orネイティブでもtry catch出来ない

27 :
そもそもCRTが例外なんて投げないはずだが
> 727 :デフォルトの名無しさん[sage]:2008/07/03(木) 13:51:22
>     なんで、VC++2008の、strftime _tcsftimeは、
>     書式に無い文字を渡すと例外終了するのかなあ。
>    単に無視してくれりゃいいのに。
>    自前でパースしてから、渡してやるしか無いのかな。
> 729 :デフォルトの名無しさん[sage]:2008/07/03(木) 14:11:02
>     ちょっと見てみたけど
>     _ASSERTE( ( "Invalid format directive" , 0 ) );
>     だからデバッグ時だけの話じゃん。

28 :
>>27
http://msdn.microsoft.com/ja-jp/library/ksazx244(v=VS.80).aspx
試してみると早いかも…
int main(array<System::String ^> ^args)
{
Console::WriteLine(L"Hello World");
tm tmNow;
__time64_t tNow;
TCHAR sz[20];
try
{
_time64(&tNow);
_localtime64_s(&tmNow, &tNow);
_tcsftime(sz, 20, L"%h", &tmNow);
}
catch (...)
{
Console::WriteLine("error!");
}
Console::ReadLine();
return 0;
}

29 :
ハンドラ設定ってなんだ普通に_set_invalid_parameter_handlerで呼んでくれたが

30 :
SerialPortクラスを使ってデータを受信する際、
・SerialPort::Data_Receivedイベントで受信
・受信データはQueueクラス経由でメインスレッドから受信
・メインスレッドでは、あるバイト数を数秒以内に受信できない場合タイムアウト
を、実装したいのですが、タイムアウト処理はどのように記述したら良いのでしょうか?
// Data_Receivedイベント
private: System::Void serialPort_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e)
{
int length = serialPort->BytesToRead;
array<unsigned char>^ buffer = gcnew array<unsigned char>(length);
serialPort->Read(buffer, 0, length);

Queue^ sync_queue = Queue::Synchronized(m_queue);
for (int i = 0; i < length; i++)
{
sync_queue->Enqueue(buffer[i]);
}
}

31 :
マネージクラスのインスタンスをグローバルスコープっぽく参照する方法ないの?
全コンストラクタでやりとりするようなマンドクセ方法がいやだ

32 :
クラスの静的メンバに入れとけばいいだけ

33 :
あと public static ね

34 :
C++/CLIに書き換えてる奇特なものです
char www[100];
char* ptr;
ptr = www + i;
array<char>^ www = gcnew array<char>(100);
array<char>^ ptr;
ptr = www + i; ← ?
?の部分をご教授くださいm(_ _)m

35 :
CLI配列はポインタじゃないから無理

36 :
pin_ptr してもいいけどさ、www[i] で駄目な理由は何なの?

37 :
C++の感覚なら毎回[i+a]としないで最初からオフセット付けときたいのは当然だろ
無理なので常にwwwとiをセットにして持ちまわるのが普通
メソッドの引数にもオフセットを指定できるようにする

38 :
perlのように return a, b できるようにしてくんないかな


39 :
.NET4ではTuple型自体は導入されたのでC#やVBでは将来的に
言語レベルでサポートされる可能性はある。
C++/CLIはほぼ見捨てられてるので期待するだけ無駄。

40 :
>>34
array<char>^ www = gcnew array<char>(100);
interior_ptr<char> ptr;
ptr = &www[0] + i;

41 :
VC2010 EEを使用しています。
RS-232Cで通信を行い、プログラムを終了させようとして
this->Close();
を行うと、エラーメッセージも出ないままプログラムが固まってしまいます。
ポートを閉じてないことが原因かと思い、
serialPort1->Close();
を実行してみたところ、今度はここで同じように固まってしまいました。
http://vsug.jp/tabid/63/forumid/46/postid/9991/scope/posts/Default.aspx
を、参考に、BeginInvokeを使用していますが、ダメでした。
この場合、どこを見れば良いのでしょうか?
よろしくお願いします。

42 :
画像処理を行いたいのですが、
Bitmap、Image、Graphic・・・どのコンポーネントを使うのがお得なのでしょうか

43 :
>>42
どんな画像処理をするかが分からないと、
えらべないと思われます

44 :
カラー画像をモノクロにしたり、コントラストかけたり、拡大縮小したりの初歩的なことがしたいです。
あと、今のところはCUIで行いたいです。

45 :
>>44
俺はあまり詳しくないが、
ぐぐると
ttp://msdn.microsoft.com/ja-jp/academic/cc998604.aspx
ここで
Bitmap クラスを利用することにより、画像に対してピクセル単位で様々な処理を行うことができます
と書いてある
.netのクラスを使うなら、おそらくやりたいことはこういうことだろう

46 :
Bitmap使ってみたけれど、画像の保存の仕方がわからない・・・
WriteBitmap("C:\\・・・",data)とかdata.Save(・・・)ってな感じでできないのかな

47 :
普通にSaveメソッドあるだろ

48 :
ホントだ。ごめん、見逃してたわ。

49 :
なぜ下記のようなプログラムでエラーが発生するのかわかりますか??
 --- プログラム ---
#include "stdafx.h"
using namespace System;
using namespace System::Drawing;
int main(array<System::String ^> ^args){
  Bitmap^ image = gcnew Bitmap("test.jpeg");
  image->SetPixel(0,0,Color::Black);           ←ここでなぜかエラー起きます
  image->Save("test2.bmp");
  return 0;
}
 --- エラー内容 ---
ハンドルされていない例外: System.ArgumentException: 使用されたパラメータが有効ではありません。
場所 System.Drawing.Bitmap..ctor(String filename)
場所 main(String[] args) 場所 c:\documents and settings\***\デスクトップ\test\test.cpp:行 10
場所 mainCRTStartupStrArray(String[] arguments) 場所 f:\dd\vctools\crt_bld\self_x86\crt\src\mcrtexe.cpp:行 309

50 :
>>49
test.jpegはちゃんとプロジェクトファイルと同じ階層にある?
余計なお世話かも知れないが、.netでやるなら
C#で作ったほうが楽なんじゃないだろうか・・・
わざわざマイナーな環境で挑戦するよりもいいと思うんだが

51 :
>>49
落ちてる場所は、その上の行だぞ。

52 :
これだけ利用者に嫌われてる言語も珍しいな
初心者が質問するたびに使うなと勧められる

53 :
>>50-51
ありがとう。jpegじゃなくてjpgだったという凡ミスしていたことに気づけたわ
・・・一度C#に浮気してみる

54 :
>>52
嫌われているというか、言語自体が初心者お断りだからな
初心者が無謀なことしようとしていたら、そりゃ止めるだろう

55 :
C++も.NETも使いこなせる人が、止むを得ず使うための物。
使わなくていいなら使いたくない。

56 :
始めようにも資料が無さ過ぎる
MDI作るときどうするかとか
ちょっとしたことの逆引きがネット上で全く出てこない

ようやくOpenGL表示できるようになって
C++の頃の遺産をつかえると思ったのに

57 :
C#でできるから、それを参照にすればいい
なにもかもC++/CLIで済ませようとしないことをお勧めする

58 :
嫌ってはいないんだ
ただ何故かこの言語とのファーストコンタクトというか接し方が
一言入れておかないと不幸にしかならなそうな人が多いのよね

59 :
WinFormsデザイナとかC++/CLIにそもそも要らないんだよな
こういうのがあるから「Visual C++ 2008 で簡単GUIプログラミング」みたいな勘違い本やサイトが出て初心者が道を間違える

60 :
56ですが自分
C++の文法がある程度使えて
フォームデザインが総合開発環境上で扱えて
至れり尽くせりじゃん、と思ってとっかかりました
現実は情報が全く無く
よくわからないクラスとかいっぱいあって
解説も無くて
どうしようと途方にくれていましたが、QTとかよりは
導入コストも再勉強のコストも無いだろうと信じて使ってます。
だって、CやC++だとGUI作るの辛いんだもん
っていう理由だとダメですか

61 :
まあ正直C++の名前が付いてるだけで
マネージ部分はC++とは直接関係なくて学び直し必要だし
それなら素直にC#
C#2.0の範囲までなら多分C++/CLIより簡単だし
サンプルも多いし将来WPF/Silverlightとかにも応用できるし
C#やっとけば逆にC++/CLIを橋渡し用ぐらいなら書けるようになるし

62 :
けっきょくC++風に文法を汚したC#と普通のC++を無理矢理くっつけただけの代物だからな

63 :
>>62
それを一応形にできたところは評価できる。

64 :
#define健在なり

65 :
#define private public

66 :
LPVOIDからarray<String^>^に変換したいのですが、アドバイスください。
//////////Form1_Load//////////
HANDLE hMap;
LPVOID lpBuf;
hMap=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,1024,L"View");
if(hMap==NULL){Form::Close();}
lpBuf=MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,0);
if(lpBuf==NULL){Form::Close();}
if(GetLastError()==ERROR_ALREADY_EXISTS){//すでに同じ名前のオブジェクトが存在する
lpBuf=Environment::GetCommandLineArgs();//コマンドラインから取得//ここでエラー
///////////ここまで/////////////
つまり二重起動時に共有メモリを使いたいのですが、どうしてもできません。
先人方どんなことでもいいので教えてくだせえ。

67 :
marshal_asとかじゃねえの

68 :
> LPVOIDからarray<String^>^に変換したい
>  lpBuf=Environment::GetCommandLineArgs();//コマンドラインから取得//ここでエラー
コードの方はarray<String^>^からLPVOIDに変換したいように見える

69 :
>>67
2008 Express Editionを使っていまして・・・ヘッダーがないらしいです。
http://www.codeguru.com/forum/showthread.php?t=468408
>>68
コマンドライン引数を得た後、array<String^>^に変換しようと思ったのです。
宣言時からarray<String^>^だとMapViewOfFileでつまずいちゃうので・・・。
どちらにせよ、コマンドライン引数を得た後、
共有メモリarray<String^>^として反映できればいいのですが。

70 :
全体にコードが滅茶苦茶に見えるし
そもそもLoadイベントなんかでやる処理には見えないけど(mainでやることだろ)
共有メモリにString^を書き込みたいのなら
> ttp://www.codeguru.com/forum/showthread.php?t=468408
のリンク先にString^をポインタに変換する方法が載ってるからmemcpyなりなんなりすればいい
複数の文字列を書き込む必要があるなら\0なりなんなりで区切る

71 :
共有メモリをやめてSendMessageに妥協しました
とにかく二重起動時にコマンドライン引数を渡すことができました!
皆様、貴重なアドバイスをありがとねん

72 :
C++/CLIにおけるsafe_cast,static_cast,dynamic_castの違いについて教えてくださいよ
safe_cast   :型が合わないと例外が発生、実行コスト中
dynamic_cast:型が合わないとNULLを返す、実行コスト大
static_cast  :型が合わなくても何もしない、実行コスト小
この認識であってますか?

73 :
safe_castとdynamic_castのコストはほぼ同じ。
static_castが速くなるのはダウンキャストの場合だけ。静的に解決できる場合はsafe_castと同じ。

74 :
>>66
いまさらだけど、.NET Framework 4以降ならMemoryMappedFileクラスを使えばいいと思うよ。

75 :
.NETのハンドルのダウンキャストにstatic_cast使うのは激しく疑問
公式の説明でもパフォーマンスをえらく強調してるが、
そのためにわざわざ検証不能コードにしてまでやるほどのものなのかと

76 :
http://www.infoq.com/jp/news/2010/10/Co-Evolution-Doubts
>どうやらそれらは、レガシC++アプリケーションをWindows Phoneに移植したいと考えている多くの開発者にとって、C++/CLIは、ベストなルートに見えるのであろう。
地獄への道は善意で舗装されている

77 :
筆者自身は否定的に見えるけど、まだそんなこと考えてる人もいるんだねぇ

78 :
筆者ほんとにC++/CLI触ったことあるのかな
Silverlightで使える範囲のC++/CLIはC++とは全く互換性なくてただの汚いC#なんだけど

79 :
絶対的処理性能が必要な場合か、過去資産使う時以外はメリットよな?

80 :
検証可能なコードしか使えない場合は処理性能同じだし過去資産も使えないよ

81 :
音の再生ってC++/CLIでできるの?
画像の場合ピクチャボックスみたいな感じに楽に音楽再生させたいのだけど

82 :
ネイティブのC++でできるなら同じ方法でできる
.NET使ってもできる
どちらにしてもC++/CLIとは直接関係ない話

83 :
サンクス
これ絶対初心者向けじゃない気がする

84 :
「気がする」ではない。
絶対初心者向けではない、その通りだ。

85 :
ですよね
俺みたいな勘違い君が集まるから
スレタイ変えると平和になる気がする

86 :
「C#でアプリを作っているが、C++のライブラリで音を鳴らしたい」もしくは
「C++(非CLI)でアプリを作っているが、.NETのライブラリを使って音を鳴らしたい」
→そこだけC++/CLIを部分的に使おう
という風に特別な意図を持って言語であって、
>>81のような質問が出てくる時点でC++/CLIを使うのは間違っている

87 :
前者はCLIでなくていいだろ

88 :
そんなに大きなライブラリでなければ>>19方式がベターだな

89 :
初心者用のC++/CLIじゃなくて
C++/CLIの初心者向けのスレなんだよなw

90 :
C++/CLI初心者にクラスチェンジできる条件が、
1) C++習得レベル一定以上
2) .NET習得レベル一定以上
だからな

91 :
C++とC#があった上で補助的に使うもんだからねぇ
みんな言うように初心者が使う物じゃないね。

92 :
こんなのに熟練したくないわ
どうしても必要なときにちょっと調べてその場が凌げれば充分

93 :
C++にGCを導入した言語。そう考えれば実用性は高いはず。

94 :
C++と、GCをサポートした別の言語を混ぜた言語。
アンマネージとマネージの境界は常に意識する必要がある。

95 :
仕事では使いたくないが、趣味でいじるのなら楽しい。
Express Editionだと実行中のプロセスにアタッチできるのが
C++しかないってのも使ってる理由のひとつ。

96 :
日経のムックでC++/CLIが宣伝されてるな。
簡単GUIプログラミング!みたいな見事な勘違い記事だった。騙されて道を誤る初心者が不憫でならない。

97 :
道を踏み外しそうになり、C++Builderにシフトできました

98 :
初心者はC#いじっとけ

99 :
増えた言語仕様って、ref, ^, gcnew だけでしょ?

100 :
ジェネリック,トラッキング参照,ファイナライザ,プロパティ,イベント,デリゲート, etc
CLI拡張の部分だけでも言語仕様書の量がC#並み

101 :
2種類の言語が同居してる構造だな。

102 :
D言語よりマシ。

103 :
Z言語になるころには
なんとなくこんな感じ、って思い描いたものが
1行で組みあがるくらいに
なるわけねぇ

104 :
ref classのメンバーに構造体がある場合、その構造体のポインターはどうやって取得すればいいの?
pin_ptr<SCRIPT_STRING_ANALYSIS*> pssa = &(this->構造体型の変数);
こういう風にしてもうまくいかないんだが

105 :
>>104
自己解決した
単にpin_ptrの型を間違っていただけだった

106 :
これって変数名とかに全角文字がつかえるのだな。
  int 数値 = 0;
みたいに。
うっかり全角アルファベット混ぜたりしたら大変だな。


107 :
それCLIでない方のC++でもできるよ
コンパイラが共通なんだから

108 :
>>106
今のパソコンて、ゼロに斜線が入らないから、うっかり
int 数値 = O;
とかしてしまうとやばいぜw

109 :
どっかでOが定義済みでないと通らないだろ

110 :
Windows Mobile用のWM_GESTUREが入ったgesture.hは何を入れたら良いんですか?
Windows Mobile 6 Professional SDK Refresh.msiと
試しにVS2010EEを入れてみたけど
ダメでした
Windows Mobile 6 Professional SDK Refresh.msiは2環境でインストールして
いるのでインストーラがコケたとかでは無さそうです
定義だけなのでGoogle Codeとかでも良いのですが、MS系は上手く手に入りません。
くだすれですがよろしくお願いします。

111 :
queue<array<String^>^ > queue_dwnload;
こう宣言すると
System.ArgumentException' の初回例外が発生しました。
とイミディエイトウィンドウにメッセージが出るんだけど
宣言の仕方どこが間違ってますか?

112 :
つ STL/CLI
#include <cliext/queue>
using namespace System;
cliext::queue<array<String^>^ > queue_dwnload;

113 :
すまん書き足りなかった、インクルードはちゃんとしてて
プログラムも正常に動作してます
それでもう少しシンプルなコードで試してみたんだけど
VS2008で新規作成、プロジェクト、CLRのwindowsフォームアプリケーション
のテンプレートでプロジェクトを作成して
#include <cliext/queue>を追加
~Form1(){}の下あたりに
cliext::queue<array<String^>^ > queue_dwnload;を追加
デバッグ実行する
これだけでメッセージが出ます、キューの宣言は間違ってないみたいだけど
何が原因なんだろう?

114 :
VS2010にしてしまっているので再現できないが、
~Form1()と同じprotectedには出来ないのかコンパイル時に警告がでる。
privateにしたらどう?
private: cliext::queue<array<String^>^ > queue_dwnload;

115 :
private:付けてもだめでした

116 :
とりあえず問題の切り分けだな。
まずコンパイルが警告なしで通るかどうか。
通るならデバッグ実行とデバッグなし実行で差があるかどうか。
別のPCでも再現するかどうか。

117 :
使用環境:VS2008 Professional Edition
プロジェクト:CLR クラスライブラリ
目的:コピーコンストラクタ、代入演算子を潰したい
エラーの出ないコード。
 ref class Hoge sealed {
  private:
   Hoge % operator=( Hoge const % rhd ) { return *this; } ;
   Hoge( Hoge const % src ) {} ;
 }
実装したいコード。
 ref class Hoge sealed {
  private:
   Hoge % operator=( Hoge const % ) ; // error LNK2020 未解決のトークン(06000001) Hoge::op_Assign
   Hoge( Hoge const % ) ; // error LNK2020 未解決のトークン(06000003) Hoge::ctor
 }
C++/CLIでメンバ関数の実装をせずに放置というのは可能でしょうか?

118 :
そもそもref classは定義しない限りコピーとか無理じゃなかったか

119 :
C#などから使わせるつもりなら演算子のオーバーロードは全部staticにしないといけないし
代入演算子やコピーコンストラクタはそもそもオーバーロードできないし
constも使えないし参照渡しや参照返しもダメ(そもそもref classだから無意味)
つかまずC#やるべき。.NETの常識が無さすぎ。

120 :
>>118
そうなんですか、回答ありがとうござます。
>>119
回答ありがとうございます。
http://msdn.microsoft.com/ja-jp/library/sy1y3y1t(VS.80).aspx
このサンプルコードのコンパイルが通らなかったのですが、そもそもサンプルが間違ってるという事なのでしょうか?
あと、.NETの常識を学ぶのにオススメの書籍などあれば教えていただけると幸いです。

121 :
Lock に関係ない実装は省略して書いてるだけでしょ
間違ってると言うより、そこは問題とは関係ない部分なだけ

122 :
>>121
回答ありがとうございます。
別途実装をするしか無いという事ですね。分かりました。
そうすると >>119 の回答から考えて、C#などから使わせるつもりが無いなら、
・演算子のオーバーロードはstaticにする必要はない
・代入演算子やコピーコンストラクタはオーバーロードできる
・constも使えて参照渡しや参照返しもOK
ということでしょうか?

123 :
C++/CLIではref classのメソッドにconstを付けられないから
C#やVBと相互運用しないとしてもconstパラメータは事実上役に立たない。

124 :
趣旨がわからないね。
C++スタイルでやりたいだけなら、そもそもC++/CLI 使う必要性がないんでない?

125 :
>>123
回答ありがとうございます。
Hoge % operator=( Hoge % arg ) { 代入処理の実装 } ;
これだと代入元が書き換えられそうで気持ち悪いですけど、そういう流儀なのですね。分かりました。
>>124
>>122 の質問に関しては元々あった疑問ではありません。
>>119 の解答に書かれている内容に関しての事実確認です。
趣旨に関してはスレ違いだと思いますので書きません。

126 :
%もいらん
ref classだから常にポインタ渡し

127 :
>>124
MSのサンプルだか自動生成されるコードだかで、
あんな風にrefクラス上でC++っぽいことをやっているものを見た覚えがある。
元の質問者のコードもそういうのに影響されたのではないかと思う。

128 :
private ref struct A{
UInt32 data[5];
};
これがコンパイル通らないんだけど、
array<UInt32>^ data;とかにしていちいちgcnewするしかないんですか?
データ宣言するだけのためにコードなんて書きたくないので、うまい解決法お願いします。

129 :
うん、array<UInt32>^にしてコンストラクタ書くしかないんではないかなあ。

130 :
C#では構造体でstackallocが使えるからvalue classならいけるだろうと思ったけど無理なのね
この手の機能でC#に負けてどうする

131 :
CStringを使うには何をインクルードすればよいの?
atlstr.h、atlbase.h、atlapp.hは入れてるけどコンパイルとまる

132 :
VC++2010 ExpressEditionです。
System::windows::form::timer で一秒ごとにlabel->textを更新していますが(要は時計です)
最小化から復帰するとlabel->textが更新されなくなります、何故でしょう。

133 :
最小化したときにとめたタイマーを元に戻すんだキバヤシ

134 :
そもそもUI用のタイマで時計を作るな
MSDNにもはっきりそう書いてあるだろ

135 :
>>133
故意に止めるようなことはしていないんですが、そういう仕様なんでしょうか?

136 :
>>134
えぇぇぇぇぇ。時間分解能が悪いとかあの辺ですか!ヽ(´Д`;)ノアゥ...
スレッドタイマークラスとかに変えます。ご教授ありがとうございます。

137 :
MS公式のガイドラインかなんかで「System.Windows.Forms.Timerで時計を作らないでください」って無かったっけ?
どこだったか忘れたけど

138 :
一番使い易いところにあるのに、一番性能悪いとかひでー話だよな
俺も最初使ってみて混乱した

139 :
使い方も知らずに使うとか・・・

140 :
VS2005です。
C++/CLIでラップしたネイティブのライブラリから例外が発生して、
C++/CLI側でcatchした時に、
ネイティブ側のインスタンスのデストラクタが呼ばれません。
これはバグと考えて良いのでしょうか?
VC++2010 expressでは普通に呼ばれたので・・

141 :
>>132です。
あれからいろいろいじりまくっていたんだけど、どうもフォームの透過色(TransparencyKey)が特定の色の場合
この問題が発生しているようです。引き続き調べてみます。

142 :
全く相手にされてないようですが、
解決したので適当に報告しときます。
とりあえず、ネイティブのライブラリオプションを
/EHscから/EHaに変更することで、デストラクタが呼ばれるようになりました。
どうやらオプションの違いでABIに互換性が無くなり、
例外をハンドルできても、その後のアンワインディングを正常に実行できていなかったようです。
デフォルトのオプション設定だと上記のような状態になるので、
自分みたいに知らずに組んでる人はメモリリークし放題ですね。

143 :
C++/CLIでSystem::Actionって使えないの?
event Action^ Foo;
とやると
エラー1error C2955: 'System::Action' : クラス ジェネリック を使用するには ジェネリック 引数リストが必要です
って出てくる…

144 :
Action<T>はmscorlib.dllだがそれ以外はSystem.Core.dllだ

145 :
>>144
ありがとう…
おまえそんなところにいたのか…

146 :
聞きたいんだけどスレ住人はVC2010でC++/CLI書いてる?
それともインテリセンス使うために2008書いてる?
それともC++/CLI書かない?

147 :
C++/CLI書かない…けど次の案件がVS2010指定でネイティブDLL呼び出す必要があるから
書かざるを得なくなるかもしれなくてちょっと憂鬱

148 :
.NET用言語で一番の糞言語だからね>C++/CLI

149 :
>>148
C++自体が言語として糞だから仕方がない。
それと互換性保ちながらここまで実現したということを考えると、かなりすごいと思う。

150 :
互換性?ねーよ。

151 :
>>150
え。それは、今では使うのは好ましくないとされているレガシー関数群をいまだにお使いになられているからではないですか?

152 :
CとC++に互換性があるとは言わないだろ
CLIの部分については互換性ゼロなんだから

153 :
>>152
> CとC++に互換性があるとは言わないだろ
それは上位互換ありでしょ。完全ではないけれども。

154 :
boostを完璧にコンパイルできないだろとか言い始めるのかと思ったら
斜め上をいく馬鹿だったか

155 :
初心者です。
ストリップメニューを開くと5個ぐらい項があって
3つチェックされているとして、その3という数字を取りたいのですが
どうすれば良いでしょうか?
開く部分の変数はStripMenuItem1です。
for(int = 0;i<StripMenuItem1->項目数;i++){if(StripMenuItem1->子項目->checked == true){temp++;}}
みたいなのはありますでしょうか?どうすれば良いでしょうか?よろしくおねがいします

156 :
自前で数えろよ、毎回書くのがいやなら関数にしとけ。

157 :
>>155
StripMenuItem1.Itemsプロパティで子が全て取得できる
言っちゃ悪いけどそういう意味での初心者がC++/CLIなんか使うもんじゃない
先にC#覚えて

158 :
>>156
レスありがとうございます
申し訳ありません。理解できません
何か関数があるのでしょうか?
自前で数えるといっても、2個チェックのときは2と自動で取ってこれるようにしたいのです。
そういえば
if(項の変数->checked == true){temp++;}
を何行も書けばいいだけですね。ありがとうございました!

159 :
>>157
ありがとうございました!

160 :
ときどき勘違いした可哀想な子が紛れ込んでくるな
>>21>>42はまだC++/CLI使ってるんだろうか

161 :
次スレでは「初心者用」を消して、
> - C++プログラミング
> - .NETプログラミング (C#, VB.NET, etc.)
>
> に不自由する方はお引き取りください
とか若干きつめに書いておけばいいじゃね?
何年先になるかは分からんけどw
4,5年ぐらい?ww

162 :
WCHAR f[] = aToolStripMenuItem->Text->ToCharArray();
cli::array<Type,dimension> ^' から 'WCHAR []' に変換できません。
->ToCharArray();でWCHARが帰ると思っていたのですがなぜでしょうか?どうすれば良いですか?

163 :
そのWCHAR[]をどうしたいかによる

164 :
>>163
wcscpyしたいです。
というか元々wcscpyの引数に入れるつもりでしたができませんでした。

165 :
>>163
ちなみに、第二引数にその->TEXTの文を入れて
別に用意した第一引数のWCHAR[3][]とかに入れたいのです

166 :
>>161
もともとは初心者お断りスレもあったが、話題があまりなくて落ちた
>dat落ち姉妹スレ
>C++/CLI part3

167 :
このスレでもC++、.NETの初心者は対象外だけどな

168 :
>162
文字列操作はこれがひっかかったぞ
ttp://vene.wankuma.com/prog/CppCli_strings.aspx

169 :
>>168
サンクス
おせーよ

170 :
C++と.NETの両方を極めないとCLIは使いこなせないからな

171 :
Express EditionでもC#プロジェクトと同じソリューションに入れられればいいのになあ
VCのExpress Editionが入門者向けというより達人の縛りプレイ用になってるじゃないか

172 :
CLI使わないという選択肢はないのかw

173 :
そんな選択肢があったらこのスレにいない

174 :
>>171
金払え

175 :
ダイアログで値を入力させて、その値を親ウィンドウで処理したい場合に
どうやって値の受け渡しをすればいいの?
親にpublic関数を用意して呼び出すのが簡単なわけだけど
この.hファイルに親の.hファイルをインクルードすると子のデザイナが壊れる
子ダイアログで親の形を認識させる手段がない

176 :
子のプロパティを公開して親からアクセスすればいいんじゃねえの?

177 :
比較関数を書く形式で、リスト(cliext::list)をクラスのメンバで
ソートするにはどうしたら良いでしょうか?
こんな感じじゃないかと思うのですが
「関数呼び出しには引数リストがありません。
メンバへのポインタを作成するために '&Test::Form1::less' を使用してください」
とエラーが出ます
以下コードを簡略化して書いてます
//クラスTest
ref class Test
{
public:
DateTime date;
Test(void){};
};
//比較関数
bool less(Test^ lhs, Test^ rhs)
{
return lhs->date < rhs->date;
}
//リストの作成
list<Test^> list_item;
Test^ item = gcnew Test();
list_item.push_back(item);//(以下省略
//ソートする
list_item.sort(less);

178 :
試してないけど、static にして Test::less じゃね?

179 :
レスありがとうございます
Form1クラスの上で定義したらできました
いまいちよくわからないですが
これからじっくり理由を考えて見たいと思います、感謝

180 :
VC++のスレでこちらの方がふさわしいのではないかと言うことで移ってきました。
 VC++2010 Expressでフォームからマウスが外れているときはフォームの透明度を
あげる(薄くする)と言うプログラムを組んでいます。フォームのMouseLeaveイベントと、
MouseEnterイベント発生時にOpacityプロパティを変えることで実現を目論んだのです
が、ウインドウの外枠(サイズを変えるときにドラッグする部分や、上部のウインドウ名
が書かれている部分)にマウスがあると、MouseLeaveイベントが発生して、薄くなって
しまいます。もちろん、ここではたとえ、フォーム外側から移動してきてもMouseEnter
イベントは起きません。
 フォームから完全にマウスカーソルがそれた時のみ透明度を高めたいのですが、
どういうイベントを用いればよいんでしょうか?

181 :
で、その質問内容のどこがC++/CLIに関係しているんだ?

182 :
ってことは、.Net Frameworkのスレ探します。

183 :
.net Framework関連のスレって見つからないんですが、どこが適切でしょう。
すみません。

184 :
ふらっとあたりで聞けばいい

185 :
ref classのメンバー変数にID2D1SolidColorBrush*のようなものがある
template <class T> inline void SafeRelease(T *ppT)
{
unsigned long refCount;
if (*ppT)
{
refCount = (*ppT)->Release();
*ppT = NULL;
}
}
にID2D1SolidColorBrush*のポインターを渡すことが出来ないからpin_ptrで渡してたんだが、いい加減書くのがめんどくさくなってきた
スマートに処理しようと思い、template <class T> inline void SafeRelease(T *%ppT)というパラメーターの関数を定義したんだが、こいつへの渡し方がわからない
誰か教えてくれまいか

186 :
あるプロセスをオープンしようとしてます
読み取り専用で試したが結果は同じ
CLIとしてコンパイルしたWindowsアプリからOpenProcessを呼び出すとフル権限で開ける
C++としてコンパイルしたコンソールアプリからはOpenProcess読み取り専用でもアクセス拒否される
OSはWindows7 64bit
内部のことは分からないですが、OpenProcessは同じ標準process.h内のものを使ってると思う
少なくともソース上ではそういう記述をしてますがコンパイラが何をしてるかまでは定かじゃないです
大きな違いはコンソールアプリであることですが、それが拒否の原因になるんでしょうか?

187 :
VC2010を使用しています。
テキストボックスに文字が入力され、エンターを押されたら動作する処理を行いたいのですが、
TextChangedイベントに
if(TextBox1->Text->EndsWith("\r\n"))
では、認識出来ないのですが、どのようにすればよろしいのでしょうか?
よろしくお願いします。

188 :
フレームワークの話しはスレ違い

189 :
フレームワークの話はどこですれば良いのでしょうか?

190 :
C#の質問にして、ふらっとC#で聞くといい

191 :
>185
com::ptr で保持して、リリース処理はそっちで対応しちゃあかんの?

192 :
>>191
ref classにはcom::ptrはおけない思う

193 :
>>192
すまん。
CComPtrと勘違いしてた
com:ptrはCLRでも使えるのか

194 :
>193
それ用のクラスだぜ
あとは .net Framework の System::Runtime::InteropServices::SafeHandle を実装したら?

195 :
DirectXのリソースの解放にSafeHandleは使えないんじゃなかったっけ
最近のは知らんけど

196 :
>187
KeyPress

197 :
>195
詳しく

198 :
Direct3D自体の作成/解放が1スレッドに限定されるのに対し
ファイナライザスレッドでどーのこーのみたいな話だったか
使えないというか使う意味がない、みたいな

199 :
printfとか普通に書いたとき、
なんでprintfがアンマネージのコードって
コンパイラは理解できるの?
それらしい印になるようなキーワードを
特に書いてないような気がするのだが?

200 :
内部的には #pragma managed や unmanaged 指定がされてんじゃね?
#include か #using かで切り分けてるんだと思うけど

201 :
失礼します。
Form1からForm2を開き、Form2を表示した状態でForm1のテキストボックスにフォーカスを合わせたいのですが、何か良い方法はありますでしょうか?
Form2のShownイベントで、Form1->TextBox1->Forcus();を実行してみましたが、Form1が見つかりませんでした。
よろしくお願いします。

202 :
見つかりませんでしたじゃなくて
見つかる様にするんだよ。
作成時にインスタンス渡すとか、間を取り持つ作るとか

203 :
http://imagingsolution.blog107.fc2.com/blog-entry-109.html
ここを参考に、Ownerを指定してもダメでした。
と、言うよりサンプル通りに作ってみても
1>d:\vc2010\test\form2test\form2test\Form2.h(60): error C2039: 'Form2_Load' : 'Form2Test::Form2' のメンバーではありません。
1> d:\vc2010\test\form2test\form2test\Form2.h(15) : 'Form2Test::Form2' の宣言を確認してください。
1>d:\vc2010\test\form2test\form2test\Form2.h(60): error C2065: 'Form2_Load' : 定義されていない識別子です。
(以下略)
と、なってしまいました。
Form2.hの宣言
this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(292, 273);
this->Name = L"Form2";
this->Text = L"Form2";
this->Load += gcnew System::EventHandler(this, &Form2::Form2_Load);
this->ResumeLayout(false);
Form2.cppにて
#include "Form1.h"
using namespace Form2Test;
System::Void Form2::Form2_Load(System::Object^ sender, System::EventArgs^ e) {
Form1^ PForm;
if(this->Owner != nullptr){
PForm = static_cast<Form1^>(this->Owner);
}
}
この記述では間違っているのでしょうか?VC2010を使用してます。
よろしくお願いします。

204 :
本当にForm2はグローバル名前空間なのか?
とりあえずヒントだけ出したけど、C++、.NET、プログラミングの基礎にあたる内容はスレチだから返答は不要
というか、C++/CLIはコンパイル可能なコードすら書けないようなプログラミング初心者が使うものじゃない

205 :
VC++2010&CLIで4.0以前(4.0は含まない)のNETを使う方法はありますか?
MSDNには3.5を利用するには2008SP1を入れろとかありましたが
NETのバージョンごとに入れるのはさすがに無駄すぎるので。

206 :
http://msdn.microsoft.com/ja-jp/library/ff770576.aspx
プロジェクトファイルをテキストエディタで編集しろということらしい
C++/CLIで作った混合アセンブリはCLR2(.NET2.0-3.5)向けにコンパイルすると
CLR4では動作しなくなるので注意
インテリセンスも削られてるのでC++/CLIなら2008で作業するほうがいいよ

207 :
>>206
http://msdn.microsoft.com/ja-jp/library/47w1hdab.aspx
こちらのページを読んだところ
2010は4.0だけ、2008SP1なら3.5だけなのかと思ってしまったのですが
2008SP1は2.0〜3.5まで扱えるんですね
2008を入れることにします
ありがとうございました

208 :
質問です
画面を表示させ、ボタンを押したら表示されている画面をbitmapイメージとして保存(出来れば印刷も)したいのですが、
そういう事は可能なのでしょうか?
サンプルソース等探してみたのですが見つからなくて行き詰ってしまいました。

209 :
C# スクリーンショット でググれ
C#だぞ。C++/CLIじゃないぞ。

210 :
>>209
なるほど、C#で調べれば良かったんですね。。
自身に[Alt]+[Print Screen]を送れば良かったんですね
ありがとうございます

211 :
フォーム上にメニューバーを追加したいんですが
どういうソース書けばいいんでしょうか?

212 :
C# MenuStrip でググれ
C#だぞ。C++/CLIじゃないぞ。

213 :
サンクス

214 :
質問です。
テキストファイルから設定を読み取り、動的にリンクを生成し、別プログラムを起動するランチャーを作っています。
動的にリンクは生成できますが、イベントハンドラに仕込むコールバック関数を動的には生成できないため、
1つのコールバック関数を呼び出しそのなかで起動するプログラムを判断せざるを得ないと考えました。
gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandlerで登録される関数には、
呼び出し元のリンクが引数に渡されるので、cliext::mapで事前に、リンクとコマンドラインの組を格納して判断に用いよう
と考えました。が、リンクのハンドラ( System::Windows::Forms::Label^ )はoperator <が定義されておらず
ソートできないため使用できませんでした。
それではcliext::vectorに、リンクとコマンドラインのcliext::pairを格納しようと思いましたが、どうやらムリみたいです。
実際コンパイルエラーになりました。参考ウェブサイト:
ttp://blogs.wankuma.com/episteme/archive/2007/11/21/109646.aspx
ttp://d.hatena.ne.jp/crimsonwoods/20071130/1196384990
どうすれば、リンクとコマンドラインの型を管理できるでしょうか。
リンクの型(System::Windows::Forms::LinkLabel)を継承したクラスを定義し、
コマンドラインをメンバ変数として持たせるというのも考えましたがどうも無理やり過ぎる気がします。
何かよい方法はないでしょうか。

215 :
.NETでSTLは使うな
System.Collections.GenericのDictionary<,>使え
というか>>208以降の人はC++/CLIやる前にまずC#やったほうがいい

216 :
>>215
お早い回答ありがとうございます。
> System.Collections.GenericのDictionary<,>使え
どのようなものか、調べてみます。
> というか>>208以降の人はC++/CLIやる前にまずC#やったほうがいい
C++を既に学習しており、基本C++の文法でいける(と私が思う)C++/CLIのほうが新たにC#を学ぶより
よさそうだと考えておりましたが、
今後考えてC#を学ぶことも考えたいと思います。ありがとうございました。

217 :
やったらもう戻ってこないだろう

218 :
コントロールのTagプロパティを使う手もあるけどね
C++/CLIはC++とC#を理解して
その上でもしも両方同時に必要になったときに橋渡しするために嫌々ちょっとだけ使う言語です

219 :
>>218
そんな手もあるのですね。
結局>>214で述べた
> リンクの型(System::Windows::Forms::LinkLabel)を継承したクラスを定義し、
> コマンドラインをメンバ変数として持たせると(略
これで作ってしまいました。今回はこれでいいとして、今後はC#を学んでみたいと思います。
ありがとうございました。

220 :
>>214
手元にあるvs2010では問題なく動いた

221 :
CLIはすぐデザイナが壊れるし
IDEが自動でインデントをぐちゃぐちゃに破壊してくれるので
C++をラップするくらいにしか使わない

222 :
VSの次のバージョンではC++/CLIのWinFormsデザイナは削除したほうがいいと思う
>>219のようなかわいそうな人を生むだけで害悪しかない

223 :
C++もかわいそう
別に「統合」してくれと頼んだわけでもないのに
へんな統合開発環境の下で働かされてる

224 :
繰り返しの多い処理をするとメモリオーバーになってしまいます
どのようにメモリを解放するのですか?

225 :
再現するソース出して

226 :
こういうこと?
ttp://www.atmarkit.co.jp/fdotnet/dotnettips/021gc/gc.html

227 :
C++/CLIのコードをビルドしたアセンブリにアンマネージコードが
含まれてないかチェックする方法って知ってますか?
なぜこういうことを聞くかというとこのクラスライブラリをマネージコードから
使う必要が出てきたためです。

228 :
/clr:pure

229 :
それで分かればいいよねぇ

230 :
意味がわからん
混在アセンブリはマネージコードから使えるけど
セキュリティとか移植性とかでマネージコードしか使えないケースなんだとしたら
まず間違いなく/clr:pureではダメで/clr:safeでないといけない
でも/clr:safeなんて世の中にあるC++/CLIのコードのほとんどがコンパイルできないよw

231 :
>>228-230
レスありがとう
> 混在アセンブリはマネージコードから使えるけど
> セキュリティとか移植性とかでマネージコードしか使えないケースなんだとしたら
> まず間違いなく/clr:pureではダメで/clr:safeでないといけない
説明不足でした
とにかくC++/CLIのコードのすべてのパブリックなクラスとメンバに
マネージコードからアクセスできるようにしたいんです
アンマネージコードが含まれてるとそれができないんじゃないかと思って質問しました

232 :
アンマネージコードは含まれててもいい
というかそのためのC++/CLI

233 :
何を持って出来ないと思ったかがポイントかな。
とりあえず動くコードを張っとこう。
VS2010だとこのままで動くし、
VS2005-2008の場合はmanifestをちょこちょこいじる必要がある。
// cl /LD /O1 /clr test1s.cpp
#include <iostream>
class baz { public: void say() { std::cout << "Hello BAZ" << std::endl; }};
public ref class Foo { public: void Say() { std::cout << "Hello FOO" << std::endl; baz b; b.say(); }};
ref class Bar { public: void Say() { std::cout << "Hello BAR" << std::endl; baz b; b.say(); }};
// csc /o /r:test1s.dll test1.cs
using System;
class Program {
 static void Main() {
  new Foo().Say();
  // new Bar().Say();// internalは呼び出せない。
 }
}

234 :
clrをマネージだけで使うとかかなりマゾい人だな

235 :
そんな有り得ないというか無意味な使い方を想定するのは不毛だし
C++/CLIみたら混在しているものと見なせばいいよ

236 :
>>232-235
レスありがとう
アンマネージが含まれてもマネージから呼び出せるということだけど
C++/CLIのソースコードで画像処理とかやってて、
例えばビットマップの構造体をnewして先頭からのバイト数でアクセスするとか、
その情報を渡してWin32APIを呼ぶとかしまくってるんだけど、
これってアンマネージにコンパイルされるよね。
こんなメソッドをC#から呼んでまともに動作するんだろうかって心配なんです。

237 :
やっぱり、Managed Unmanagedの意味を取り違えてたか。
その程度ならManagedでコンパイルされてるよ。ただしunsafeだけどね。

238 :
>>237
マネージだけど暗黙的にunsafeとしてコンパイルされるから
アンマネージのように構造体やポインタが使えるってことか。
納得した。ありがとう。

239 :
文字列を逆順にするプログラムを書こうとした場合、自分で考えると以下のようになりました。
---------------------------
#include <string>
string str = "abcde"
string new_str;
int i;
int length = str.size();
for (i=0; i<length; ++i) {
new_str[i] = str[length-i-1];
}
---------------------------
なにかかカッコ悪い感じがするのですが、
一番スマートな書き方はどのような感じになりますでしょうか?
PHPのarray_popみたいのがあったらwhileで回して綺麗にかけると思うのですが、
C++のstringライブラリにありましたでしょうか?
あと、C++では i++は++iの方がよいと誰かに教わったのですが、理由を忘れてしまいました。
何故でしたでしょうか・・?
ご教示いただけますと幸いです。

240 :
スレ違い

241 :
すみません

242 :
このスレ的にはこういう回答になる(笑
// cl /FUSystem.Core.dll /clr:safe test2.cpp
using namespace System;
using namespace System::Linq;
int main(array<String^>^ args) {
  String^ str = "abcde";
  String^ new_str = gcnew String(Enumerable::ToArray(Enumerable::Reverse(str)));
  Console::WriteLine(new_str);
}
拡張メソッドは使えなかったっけ?ちとスマートじゃないな。

243 :
WCHAR [32]' から 'System::Object ^' に変換できません
というエラーがでた場合、どういう変換処理をかいたらいいんでしょうか??

244 :
System::Object^ v_obj = gcnew System::String(v_wchar);

245 :
たぶんこれかな
msclr::interop::marshal_as

246 :
>244
ありがとうございました。その逆の変換はどうするんでしょうか?

247 :
>>242
今時サロゲートペアすら考えないコーディングは絶滅すべき

248 :
>>246
http://msdn.microsoft.com/ja-jp/library/ms235631.aspx

249 :
>>247
サロゲートペア対応に挑戦しようと思うのだが、VS2010expressのコンパイラでエラーになる。
なんかスマートな対応方法ないすか?

literal String^ str = L"「叱る」と「\uD842\uDF9Fる」";
error C3850: '\uD842': ユニバーサル文字名が無効な文字を指定しています。
error C3850: '\uDF9F': ユニバーサル文字名が無効な文字を指定しています。

250 :
>>249
ググると𠮟るのユニコードは「20B9F」となってるけど。

251 :
textBoxに入力した文字を分割して配列に割り当てる方法がわかりません

252 :
C# 文字列 分割 でググれ
C#だぞ。C++/CLIじゃないぞ。

253 :
>>249
\uxxxxじゃなくて\UxxxxxxxxでUTF-32使って指定するとか?

254 :
>>250,253
CLRは内部コードが16bitのユニコードなのでこうなちゃうんですね。
C#はこれでいけるのですけどね;;
const string msg = "「叱る」と「\uD842\uDF9Fる」";
とりあえず、これで対応しました。
array<wchar_t>^ cmsg = { L'「', L'叱', L'る', L'」', L'と', L'「', 0xD842, 0xDF9F, L'る', L'」' }; 
String^ msg = gcnew String(cmsg);
サロゲート対応のコードを書いてみました。
http://ideone.com/rXbuf

255 :
string.Concat(
 StringInfo.GetTextElementEnumerator(s)
 .Cast<string>()
 .Reverse()
 .ToArray()
)
でええやん(めんどくさいからC#)

256 :
サロゲートと聞くと松田聖子を思い出す

257 :
.GetTextElementEnumeratorの戻値はIEnumerableじゃくて
IEnumertorだから直接Linqにつなげない。

258 :
文字をシフトJISに変換する方法

259 :
一行で様々な疑問を出させる才能

260 :
C++/CLIの具体的な難点ってなんでしょうか?
少し触ってみたところ、GUIも作り易い感じがするしCライブラリも簡単に使えそうだし、
いったいどういう問題があるのかなと気になりました
(VC++2008EEなのでintellisenseもとりあえず大丈夫です)

261 :
C#やVBと比較して生産性が遥かに劣る
それだけ

262 :
>>261
できればもうちょっと具体的にお願いします

263 :
・C++言語ではなくではなくてC++/CLI言語であること、
 C++/CLI独特の文法を覚える必要がある。C#との互換性もない。
・使う人が少ないので情報が少ない
・Intelisenceの不具合が多い(例え2010でも逃れられない)
・中途半端にネイティブなのでCLRとしての最適化も中途半端。

264 :
Cのライブラリ使うにしても、DllImportの手間を差し引いてもよっぽどでなきゃC#の方が楽なんだよね

265 :
どうもありがとうございます
Visual C#を試しに入れてみたところ、
何だこれは…ひょっとしてC++/CLIだけでなくVisual C++自体が手抜き…?と思ってしまいました
これだとたしかに生産性に差が出るかもと思うと同時にMSの露骨な贔屓に少し閉口してしまいました
まだほんの入口ですしCライブラリについて不安はありますが、とりあえず使ってみようと思います

266 :
VC++はネイティブC++の開発環境としては現在最高だろ
言語そのものがインテリセンスやRADに向いてない
C++にはC++にしかできないことをやらせるとMSは言ってるので
フォームデザイナを使うような用途へのサポートが強化されるようなことは今後も期待できない
C++はネイティブ特化、C++/CLIは橋渡し専用

267 :
まだVS2010のC++/CLIのインテリセンスないのか
この分だともうずっと出ないだろうな

268 :
2010で外されたってことは、MSは諦めたってことなじゃないの?

269 :
いや、次のバージョンでは復活させるって言ってる。
問題は「次」というのがSP2なのかVS2014とかになるのかが分からないこと。

270 :
その前にC++/CLI自体が…
今やMSにとってはATLでCOM触るラッパーを書くためだけの言語だからなあ

271 :
/*********************************/
/* __finallyブロックは何のために */
/*********************************/
try {
throw 128;
} catch (int num1) {
System::Console::WriteLine("catchブロック: num1 == {0}", num1);
} __finally {
System::Console::WriteLine("__finallyブロックって何の意味があるのか疑問だな");
}
System::Console::WriteLine("__finallyブロックがなくても、throwの有無にかかわらずここで実行できるじゃないか。");

272 :
だがその処理の呼び出し元でcatchしたかった時はどうする?
C++なら自分で再throwする必要があるが、
finallyを使えばそういうことを考える必要がない。
ついでに言うと、finallyブロックは
例外が起きようとも起きなかろうとも、
breakやreturnで抜けても必ず実行されるので
ファイルの閉じ忘れなどを回避する実に有効な手段である。

273 :
スタック割当構文じゃだめなの。

274 :
>>273
だいたいそれで間に合うとは思う。
auto_handleやauto_gcrootの助けもあるしな。
まあ、今までのVisual C++にも__finallyあるし、C#にもfinallyあるし、
あえてC++/CLIに__finallyを搭載しない理由もないと言ったところでは?

275 :
使ったオブジェクトのデストラクタ呼ぶだけでいいケースは確かに多いけどそうじゃないときもあるだろ
その場限りのちょっとした後処理のためにもいちいちクラス作るの?

276 :
超初心者です。
教えてほしいのですが、
hoge(int *piyo)は
hoge(int^ piyo)と
してるのですが
hoge(int **piyo)は
どのように書き換えれば良いのでしょうか
すいませんが教えてください


277 :
array<int^>^ piyo とか?

278 :
/* Hashtableのポインターへのポインターがコンパイルエラー */
using namespace System;
using namespace Collections;
const char *pc1;
const int nmax = 4;
// const char * の任意の要素数のデータを動的にメモリを割り当てて使う
const char **ppc1 = new const char *[nmax];
int n1 = 0;
*(ppc1 + n1++) = "higasi";
*(ppc1 + n1++) = "nisi";
*(ppc1 + n1++) = "minami";
*(ppc1 + n1++) = "kita";
for (n1 = 0; n1 < nmax; ++n1) {
pc1 = *(ppc1 + n1);
Console::WriteLine(gcnew String(pc1));
}
// 同様の手段で、Hashtable ^^ にメモリを動的に割り当てて任意の数
// のHashtable ^ を格納しようとするとコンパイルエラー
ArrayList ^pArrayList1 = gcnew ArrayList();
for (n1 = 0; n1 < nmax; ++n1) {
pArrayList1->Add(gcnew Hashtable());
}
Hashtable ^pHashtable1, ^pHashtable2;
Hashtable ^^ppHashtable1 = gcnew Hashtable ^[nmax]; // コンパイルエラー
ppHashtable1 = gcnew Hashtable ^[nmax];
for (n1 = 0; n1 < nmax; ++n1) {
pHashtable1 = dynamic_cast<Hashtable ^>(pArrayList1[n1]);
// ^(ppHashtable1 + n1) = pHashtable1; // コンパイルエラー
// pHashtable2 = ^(ppHashtable1 + n1); // コンパイルエラー
pHashtable1 = pHashtable2 = nullptr;
}

279 :
このコンパイルエラーになる
System::Collections::Hashtable ^^ppHashtable1;
って何とかならんかいな。多重ループで毎回dynamic_cast演算子使ってる
と効率悪いだろうし。

280 :
delete [] ppc1; を忘れとった。
それと、ppHashtable1 = gcnew Hashtable ^[nmax];
の行も 「// コンパイルエラー」を忘れ取った。

281 :
なんていうか、C++ のことは忘れた方が良いよ

282 :
/* cli::array を使ってもコンパイルエラーかいな、難しいもんだな */
cli::array<Hashtable^> ^ppHashtable1 = gcnew cli::array<Hashtable ^>[nmax];
IEnumerator ^pIEnumerator1;
pArrayList1->GetEnumerator();
while (pIEnumerator1->MoveNext()) {
pHashtable1 = dynamic_cast<Hashtable ^>(pArrayList1[n1]);
^(ppHashtable1 + n1) = pHashtable1;
pHashtable2 = ^(ppHashtable1 + n1);
pHashtable1 = pHashtable2 = nullptr;
}
pIEnumerator1 = nullptr;

283 :
間違えた
pHashtable1 = dynamic_cast<Hashtable ^>(pArrayList1[n1]);
の行は間違いで正しくは
pHashtable1 = dynamic_cast<Hashtable ^>(pIEnumerator1->Current);
だった。

284 :
using namespace System;
using namespace Collections;
typedef Hashtable^ pHashtable;
pHashtable pHashtable1 = gcnew Hashtable();
pHashtable pHashtable2 = gcnew Hashtable();
pHashtable pHashtable3 = gcnew Hashtable();
pHashtable *ppHashtable1;
ppHashtable1 = &pHashtable1; // 可能
ppHashtable1 = nullptr;
// ppHashtable1 = new pHashtable; // コンパイルエラー
// delete ppHashtable1;
// ppHashtable1 = nullptr;
// const int nmax = 3;
// ppHashtable1 = new pHashtable[nmax];
// delete [] ppHashtable1;
new演算子が使えないならSTLのvectorなら何とかなるんだろうか。
でも、.NET Framework 2.0 SDKをダウンロードしたものでは標準ライブラリの
ヘッダーファイルを#includeできないからアンマネージは使えない。

285 :
中途半端な質問をしてすいませんでした。
>>277さんレスありがとうございました。
実はDirectXのBaseClassesをCLIで書いてるのですが
GetSyncSource( [Out]IReferenceClock** pClock) ;
(IReferenceClockはmanagedインターフェイスです)
の部分をどう書けば良いかわからないです。
interior_ptrというのを使えと出てきますが、使い方がよくわかりません。
どう書けば良いか、どなたかご教示ください。

286 :
静的配列も作成できないのか。これもエラーになるのか。
typedef System::Collections::Hashtable ^pHashtable;
pHashtable pHashtable_hairetu[8];
マネージなクラスというのはどうしようもないな、困ったもんだ。

287 :
これもエラーになるのか。
やっぱりArrayListのままで甘んじるしかないようだな。
typedef System::Collections::Hashtable ^pHashtable;
pHashtable *pHashtable1 = new pHashtable();
char *pc1 = reinterpret_cast<char *>(&pHashtable1);
pc1 = reinterpret_cast<char *>(&pHashtable1);
pHashtable pHashtable2 = *(reinterpret_cast<pHashtable *>(pc1));
CLIってぼろいな。

288 :
マネージドクラスをネイティブクラスでラップしてから配列に入れるとか・・
C++/CLIは異なる言語が同居する2世代住宅言語だからなぁ。
#include <msclr/auto_gcroot.h>
using namespace msclr;
using namespace System;
ref struct Foo {
 void Say() { Console::WriteLine("Hello World !"); }
};
struct Bar {
 auto_gcroot<Foo^> foo; 
 Bar() : foo(gcnew Foo()) {}
};
int main(array<String^>^ args) {
 Bar bs[] = { Bar(), Bar(), Bar() };
 for (int i=0; i<3; i++) bs[i].foo->Say();
}

289 :
もうちょっと改良
#include <msclr/auto_gcroot.h>
using namespace msclr;
using namespace System;
ref struct Foo {
 void Say() { Console::WriteLine("Hello World !"); }
 Foo() { Console::WriteLine("Foo Created"); }
 ~Foo() { Console::WriteLine("Foo Deleted"); }
};
typedef auto_gcroot<Foo^> foo;
int main(array<String^>^ args) {
 foo ag[] = { gcnew Foo(), gcnew Foo(), gcnew Foo() };
 for (int i=0; i<3; i++) ag[i]->Say();
}

290 :
すいませんが再度質問さしていただきます
C++で
class Foo{
--色々なメソッドやメンバ--
}
である別のクラスのメソッドで
void Piyo(Foo **hoge);というのがあり
渡す値がFoo* fooとして
Piyo(&foo);とするとします。
これをCLIで実現するにはどのようにすればよいでしょうか
どなたかご教示ください。

291 :
質問の意図が良く分からないけど、こんな感じの回答でいい?
using namespace System;
ref class Foo {};
void Piyo(Foo^ %hoge) {
  hoge = gcnew Foo();
}
int main(){
  Foo^ f = nullptr;
  Piyo(f);
  Console::WriteLine(f);
  Foo f2;
  Piyo(%f2);
  Console::WriteLine(%f2);
}

292 :
.NET的には単にreturnで返すのが普通
どうしても参照渡しでやりたいなら
void Piyo([System::Runtime::InteropServices::OutAttribute]Foo^ %hoge)
こう書くのが.NET的には正解
クラスライブラリ作ってるんでなければ好きにすればいいけど

293 :
ありがとうございました。
たいへん参考になりました。

294 :
教えてほしいんですが。
C,C++なら
typedef union
{
int a;
short b;
double d;
}Union;
としたらUnionのサイズはsizeof(double)で
Union u = 1;としたら、aに1が入ると思うんですが。
CLIで
[StructLayout(LayoutKind::Explicit)]
ref struct Union
{
[FieldOffset(?)]int a;
[FieldOffset(?)]short b;
[FieldOffset(?)]double d;
};
と宣言したとして、?の部分には何の数値を入れればよいのでしょうか。
ヘルプを見ると「フィールドの物理的な位置を示します。」
と書かれているのですが、馬鹿なんでわかりません。
どなたか教えてください。


295 :
C++/CLIにおけるジェネリックメソッドとテンプレート関数の違いを説明してくださいお願いします

296 :
>>294
全部0
>>>295
テンプレートはただの言葉遊び
ジェネリックは実行時に展開される
DLLを作る場合、アセンブリのパブリックメンバにテンプレートを使ってはいけない

297 :
DirextXXinputのXInputGetState関数実行の格納先構造体
struct CONTROLER_STATE
{
XINPUT_STATE lastState;
XINPUT_STATE state;
DWORD dwResult;
bool bLockVibration;
XINPUT_VIBRATION vibration;
};
をC#で受け取れるようにするにはどうすればいいんですか?
ラップというのはどういう流れになるんですか?C++/CLIの本2冊読んだんですが解説コードからちょっとでも違うと全くわからないです
今のところの認識は、
structをそのままrefクラスに入れる>エラー大量
structの前にrefをつける>エラー大量
structから一つ一つ値を完全にC++/CLIで作った構造体に抜き出し、その構造体をC#から読み込む>これなら当然できる
ラップするとはどういうことなんでしょうか

298 :
本二冊読んでvalue classが出てこないってありえるのか…?

299 :
どういうことですか?structの前にvalueをつけたら混合型はサポートされていませんというエラーがでます

300 :
そりゃ、ref や value をつけたら C++/CLI の管理だからな
通常の C++ のポインタとか持ってちゃ、混合型になるだろ

301 :
>>297
> structから一つ一つ値を完全にC++/CLIで作った構造体に抜き出し、その構造体をC#から読み込む
もちろんこれ
単純に書くだけなら直接C#でも大して手間の差はない

302 :
まじですか・・・
何かものすごい事を期待していました・・・

303 :
ってC++CLI使わなくても直接C#からXinput呼べるんですか?
どうやるんですか?

304 :
PInvoke で渡す構造体はC#側で用意してあげればいい

305 :
ありがとうございます
意味が全く分かりませんがPInvokeを調べてみます

306 :
XInputだったらXNA使えよ

307 :
>>296さん
ありがとうございました。

308 :
再度質問さしていただきます
struct Hoge
{
union
{
DWORD dwGBitMask;
DWORD dwUBitMask;
DWORD dwZBitMask;
DWORD dwBumpDvBitMask;
struct
{
WORD wFlipMSTypes;
WORD wBltMSTypes;
} MultiSampleCaps;
};

ref struct Hoge
{
[StructLayout(LayoutKind::Explicit)]
ref struct Union
{
[FieldOffset(0)]DWORD dwGBitMask;
[FieldOffset(0)]DWORD dwUBitMask;
[FieldOffset(0)]DWORD dwZBitMask;
[FieldOffset(0)]DWORD dwBumpDvBitMask;
とまでしたのですが、
struct MultiSampleCaps
{
WORD wFlipMSTypes;
WORD wBltMSTypes;
}
の部分はどのように書けば良いのでしょうか、すいませんが教えてください。

309 :
C++/CLIでわざわざマネージ型をP/Invokeに使う意味がわからん。
しかもよりによってなぜ今時DirectDrawなのか。
[StructLayout(LayoutKind::Sequential)]struct MultiSampleCaps { ここは同じでオフセットも不要 }
/*Hogeの中*/[FieldOffset(4)]MultiSampleCaps MultiSampleCaps;
.NET関連で調べ物するときのキーワードはC++/CLIじゃなくてC#ね。
情報量1000倍だから。アホらしいと思ったらC#へどうぞ。

310 :
VC++6.0のMFCなプログラムとVC++2008 Express Edition の.NETなプログラムで
プロセス間通信したいのですがどうすればいいですか。

311 :
WM_COPYDATAとか手軽でいいんじゃないか

312 :
もしくは共有メモリ。DDEでも動くぜ。

313 :
Graphicsをつかって1ドット書きたいのですが方法在りますか?
g->DarwLineだと2ドット最小?

314 :
FillRectangle

315 :
g->FillRectangle(Brushes::White, 0, 0, 1, 1);
できた!
これからc++/cliするのとc#するのどっちがいいですか?
GPGPU & direct Xやるとしたらc++の方向のほうがいい?

316 :
C++かC#の2択、C++/CLIは無い

317 :
ありがと、c++でいく

318 :
GPGPUやDirectXならC++のみじゃね?
C#だとラッパー使うことになるし
まぁ、C++/CLIだけは無いけど

319 :
C++/CLIを使おうとした初心者を思いとどまらせるスレになってるな

320 :
進む先が地獄であることを知らない奴を追い返してやるのは当然だろう

321 :
何も知らないでVisualC++使ってWindowsアプリを作ろうと思うと、
自動的にC++/CLIになるからなー
MSは鬼や

322 :
.NET FrameworkとC++を知ってればどうって事無い

323 :
333

324 :
C++だけよりは、UI作るのは楽。

325 :
C++だとUI作り辛いし、C#だとネイティブじゃないから、
C++/CLIを使えば良いんじゃね?

326 :
こうしてC++/CLIを勘違いした犠牲がまたひとり・・・

327 :
と、思っていた時期が俺にもありましたってだけ
MSは頑張って理想通り完成させてくれよう
むしろ諦めたっぽいがw

328 :
正直、むしろ起動速度や処理の即応性とかの GUI こそ C++ でやって、ロジックとかに
.net fw を使うための言語だと思うんだが

329 :
C++とC#を使いこなしたうえで両方を使うために
C++/CLIというならいいけど、両者の利点を
生かすためにいきなりこれ、というのは無理w

330 :
>>328
起動速度や応答性を気にしないなら、C#で十分ってことだな

331 :
いや起動速度はC#と変わらないよ
ネイティブのDLLを読み込む分遅くなることはあっても速くなることはない
それからアンマネージコードとマネージコードの境界を越えるオーバーヘッドは馬鹿にならないので
下手するとマネージコードだけの方が速い

332 :
さらにC++/CLIの存在価値が下がったw
本当にラッパー専用言語だな

333 :
C++にGCを入れろと言う要望への、一つの回答。
D言語も悪いところも見えてくる。

334 :
ラッパーなら別にネイティブでいいんだよなぁ

335 :
C++/CLIがなかったら
どうやってラップするの?

336 :
C#-->C++は簡単だけど、逆は面倒。

337 :
別にスタティックライブラリだろうがC++ライブラリだろうが
なんでもかんでもDLLに包んでP/Invokeでおk
ObjCコンパイラ以上の荒業でラッパーコードが書けるのがC++/CLIの醍醐味だけど
なんか、こう、便利とは違うんだよなあ…

338 :
マネージドで、ポインタを使いまくれる。

339 :
C#でできなくてC++/CLIでなら可能なポインタ関係の操作ってあったっけ?
C#のunsafeの方が簡潔にCっぽく書けて扱いやすい気がするんだが

340 :
C#はMarshal派
C++のUIだけC++/CLIやC#みたいに自動で作ってくれるC++は無い物か
BCBなら出来るけどさ

341 :
BCBでやれば万事解決

342 :
MSからBCB出してくんねーかな
C++/CLIは無かったことにして、買収しちゃえばそれで済むのに

343 :
だからC++/CLIは「WinFormsが使えるC++」なんて生易しいものじゃないと何度言えば

344 :
Windowsは、C++でプログラミングが基本。

345 :
なぜC++は易しいのにC++/CLIは易しくないのか?
みたいな無神経な言い回しが何度も言われていた時期があった。
聞くほうも同じくらい無神経だから何度言っても通じないことは容易に想像できる。

346 :
まあネイティブのC++でGUI作るよりはずっと簡単だけど
C++/CLIでWinForms使うなっていうのは
どうせC#わからないと使えないしC++の経験があってもC#覚えたほうが早いからC#やれってこと
C++の経験があるからC++/CLIがいいだろうと思って始めた初心者が
C#のTIPSサイトですぐ出てくるようなコントロールの使い方を質問してくるとそりゃC#やれと言いたくなる

347 :
>>344
Windowsでの基本はC++だが、
WinFormでの基本はC++じゃない件

348 :
せめてVB並みのインテリセンスを実装してくれ

349 :
2010にインテリセンスのらないの確定か
vNextも最初のバージョンは載らないらしいし

350 :
GUIでUI設計ができてネイティブコードその上爆速コンパイル
Borland時代のDelphiはまさに神言語だったんだなぁと思う

351 :
C#がネイティブコード吐く言語だったとしてもコンパイルは爆速のはずだよ
C++の言語仕様が糞なだけ

352 :
Scalaはコンパイル遅いけど糞なのか?

353 :
C#も多次元配列とか使わなければ速いよ

354 :
Cが速いのは、安全性と裏腹。

355 :
Cでも安全性は確保可能

356 :
理屈では可能でも
現実の大部分のプログラムはそうなってないんだけど

357 :
そうか?
それだと原発事故と飛行機事故と自動車事故と比べて騒いでる連中と同じだぞ

358 :
Cは標準ライブラリが安全性を確保するのが難しい作りになってるだけで、
使うライブラリによっては安全に書ける、気がする

359 :
セキュリティは別にして、.NETはメモリ破壊が起きないのがいい
お前はもう死んでいる的なバグがずっと少ない

360 :
ガベコレは、理論武装とかしなくても安全性が明らかだから好感を持てるんだが、
逆に言うとガベコレ使わなくても明らかに安全な部分はCで書いていい

361 :
C++/CLIはやれば出来る子
計算部分はネイティブで書いて、GUIや描画部分は.NETにやらせることで
高速かつ生産性の高いプログラミングが出来る
・・・と、言う夢だったのさ

362 :
>>357
Cは安全性を捨てて速度得てんだよ バカか?
Cに安全性を追加したら
それは劣化C#になるから、下手に自分でかいた甘いコードで安全性をはかるよりも
C#でやるべき
お前はなんか、C++上で劣化C#作って喜んでそうなバカだな

363 :
自演乙

364 :
VS2010で作っちゃったんだけど、VS2008に変換することって出来ます?
インテリセンス無いから入力がめんどくさい・・・

365 :
無理
一応注意しとくと2008でコンパイルした混在アセンブリは.NET4でロードできなくなるよ?

366 :
あとはアドイン購入か。
http://www.wholetomato.com/default.asp

367 :
新規プロジェクトにコードだけ引っ越した方が簡単な気がするけど

368 :
俺もそう思う
projファイル書き替えでなんとかなるけどね
混在はapp.config無理やりつけてやるとか

369 :
プロジェクトをいちいち作るのがめんどくさい…

370 :
MSBuild 用のXMLなんだから、直接修正しろよ

371 :
どうでもいい事だよ C++/CLI で better C なんて

372 :
http://msdn.microsoft.com/en-us/library/windows/apps/hh454076%28v=VS.85%29.aspx
なんかわけのわからないことになってるぞ
C++/CLI切ってネイティブのC++にC++/CLI風のCOM拡張を入れるらしい

373 :
切るんじゃなくてWinRT API用の拡張。
.net framework用には今まで通りC++/CLIを使う。

374 :
.NETとCOMで共通のAPIを用意して、C++は完全ネイティブでCOM使うっていうのは
C++/CLIに比べれば至極真っ当なやり方だと思う
最初からそうしてくれてれば良かったのに

375 :
>>374
それではプラットホームに依存してしまう。

376 :
C++/CLIってCLI拡張の部分は標準化されてるけど
ネイティブコードとどう結びつけるかは実装依存でしょ
CLIに依存する記述だけ言語仕様から削ればCOMとのバインディングは実装次第ってことで問題ない

377 :
Win32アプリケーションとして作成したプロジェクトで、
作成されたウィンドウに.net framework用のコントロールを
貼ることは可能でしようか?

378 :
つ CWinForm...
http://msdn.microsoft.com/ja-jp/library/6xfx8bsa(v=VS.80).aspx

379 :
>>378
ありがとうございます。
MFCのCViewの派生なんですね。
CView系は使いたくないのでちょっとソースを読んでみます。

380 :
別にソース読まなくても、CWinFormsControl じゃ駄目なの?

381 :
>>380
CWinFormsControl で大丈夫そうですね。
ご指摘ありがとうございます。

382 :
>>362
多分わかってるだろうけど、おかしいよ。
Cは安全性を捨ててなんていない。安全性なんて無かった。

383 :
もともと持ってないものは捨てられないわな

384 :
WebBrowserコントロールにNewWindow2イベントを実装する
http://main.tinyjoker.net/Tech/CSharp/WebBrowser%A5%B3%A5%F3%A5%C8%A5%ED%A1%BC%A5%EB%A4%CBNewWindow2%A5%A4%A5%D9%A5%F3%A5%C8%A4%F2%BC%C2%C1%F5%A4%B9%A4%EB.html
これをVC2008でやりたいんですけどどう書けばいいか分かる人いますか・・・

385 :
C++/CLIならほとんど何も違わないが
C++/CLIはC++じゃないけどそれはわかってる?
そんな質問するような人がなんでC++/CLIなんか使うのか正直意味がわからない
素直にC#使うか、C++やりたいんだったらネイティブでATLやMFC使ったほうが

386 :
初心者用といっても、.NETとC++はマスターしてないと。

387 :
>>384>>385の意味がわかるまで精進しましょう

388 :
むしろ初心者はC++/CLI使うな

389 :
今までFormで自動で作る機能でストリップメニューを作ってたのですがそうすると一個づつthis->A = gcnew... this->B = gcnew...
みたいな感じで作られてしまって、ABCのときもあればABCDEの時もあるようにしたいので
ループみたいな感じでまとめたいのですが
array<System::Windows::Forms::ToolStripMenuItem>^ strips = gcnew array<System::Windows::Forms::ToolStripMenuItem>(5); というやり方だとは教わったのですがこれをメニューアイテムに登録するときに
this->StripMenuItem1->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(5) {this->AToolStripMenuItem,this->BToolStripMenuItem,this->CToolStripMenuItem・・・}
と書いてたのですがここはどうすれば良いでしょうか?

390 :
その前にusing namespace System::Windows::Forms;を入れることを激しくおすすめするw

391 :
どういうことですか?わかりやすく説明してください

392 :
array<System::Windows::Forms::ToolStripMenuItem^>^ じゃないの
っていうかC++/CLIなんかやめてC#やれ

393 :
>>392
ありがとうございます
そこは直しました
this->StripMenuItem1->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(5) {this->AToolStripMenuItem,this->BToolStripMenuItem,this->CToolStripMenuItem・・・}
ここに何を入れていいのかわかりません
C#もやってますがどちらにしろ初心者でわかりませんし・・・

394 :
配列を作ったら次は各要素にToolStripItemのインスタンスを代入する
C#の入門書買って出直してきたら

395 :
for i=0 < .. <i++
IntPtr ptr(hoge[i]);
strips[i] = (gcnew System::Windows::Forms::ToolStripMenuItem());
strips[i]->Text = System::Runtime::InteropServices::Marshal::PtrToStringAnsi(ptr);}
hoge[i]はhoge[5][20]のWCHARです
先頭の一文字しかTextに入っていません。どうすれば良いでしょうか?

396 :
> Marshal.PtrToStringAnsi メソッド
> アンマネージ ANSI 文字列から最初の null 文字に遭遇するまでのすべての文字をマネージ String にコピーし、
> 各 ANSI 文字を Unicode に拡張します。
何故、WCHAR*を入れられると思ったのだろうか
http://msdn.microsoft.com/ja-jp/library/bb384865.aspx

397 :
>>396
>アンマネージ ANSI 文字列から最初の null 文字に遭遇するまでのすべての文字をマネージ String にコピーし、
> 各 ANSI 文字を Unicode に拡張します。
どの部分がcharって意味なんですか?
ちなみにsize_t wLen = 0;errno_t err = 0;/*ロケール指定*/setlocale(LC_ALL,"japanese");/*変換*/err = wcstombs_s(&wLen, wStrC, 20, charmoji, _TRUNCATE);で直したらできました

398 :
array<System::Windows::Forms::ToolStripMenuItem^>^ strips = gcnew array<System::Windows::Forms::StripMenuItem^>(5);
のstripsをフォームいじっても消えないところでグローバル宣言したいのですがどうすれば良いでしょうか?

399 :
>>397
ANSI 文字列って書いてるんだから違うものを入れるなよ
しかも、文字列のマーシャリングとか>>397のリンク先を見れば一発で解決するような超FAQだから、
そんな無駄なコードなんか貼らなくていいよ

400 :
>>398
クラス直下に書いとけば
そんなレベルで試行錯誤してても時間の無駄だよ
悪いことは言わないからちゃんと1から言語を勉強してきたほうがいい(C#かCLIじゃない方のC++を)

401 :
arrayの内1つを消して間を詰めるにはどうしたら良いですか?

402 :
無理。新しい配列を作ってコピーする。

403 :
arrayって使わない方が良いんですか?
vectorとかの方が良いんですか?

404 :
.NETが絡むところでvectorは使うな
動的に要素数を変えたいならSystem::Collection::Generic::List<T>を使う
もういいからC#やれ

405 :
じゃあ最後にC++/CLIのメリットを教えてください

406 :
マゾ御用達

407 :
キモかわいい
array<Hoge^>^%はC#だとref Hoge[]で味気ない

408 :
for(int i=1;i<5;i++){this->textBox1->Text += (i + ". \n");}
改行しません。どうしてでしょうか?

409 :
\r\nと書かないといけないのですね
ありがとうございました

410 :
WCHAR *g; *g= this->textBox1->Text->ToCharArray()[0] ;
コンパイルは通るし画面のテキストボックスにも文字はちゃんと表示されてるのに
オブジェクト参照がオブジェクト インスタンスに設定されていません とエラーが出て止まります。どうすれば良いですか?

411 :
ぬるぽ

412 :
ちょwwぬるぽじゃなくて教えれwww

413 :
ここまであからさまなぬるぽはないわ

414 :
逝ってよし

415 :
まぁ、pin_ptr が何のためにあるのか、という話だな

416 :
C++/CLIのプロジェクトに
C#のソースも追加出来ますが(Prof以上のみ?)、
C++/CLIからそのC#のクラスを使えますか?
C#からC++/CLIのクラスは使えるようですが・・・

417 :
C#のソースは知らんが、C++/CLIから.netのクラスやら機能を使うのは.netの機能使うのと同じ

418 :
プロジェクトに追加するだけなら自由だが。
混ぜてコンパイルは無理。
dllを参照して使用するのは相互に可能。

419 :
やっぱ使えませんか
大人しくプロジェクト分けるしかないのですね・・・

420 :
アプリ起動中にpictureBox内に矩形を表示させておきたいのですが
どこにコードを書けばいいですか?
pictureBox_Paint内だと起動直後の一瞬しか表示されません

421 :
大方CreateGraphicsとか使ってるんじゃね

422 :
その通りでした。ご指摘ありがとうございました

423 :
インテリセンスマダー?

424 :
質問です。
ネイティブ(アンマネージド)なC++の静的ライブラリを
C++/CLIでリンクして使うと変な所で死んだりするんだけど、
こういう事しちゃだめなのでしょうか?
一旦ネイティブなDLLを作って、そこを介して呼べば死なないのですが・・・。
そのライブラリは実装を隠蔽するため
クラスのインタフェース部分のみ公開して、
インスタンスの生成と開放を関数化してあるのですが、
つまりはnew/deleteがライブラリ内で実行され、
ライブラリ内でnewした結果を返し、マネージドコード内で保持し、
そのポインタをライブラリに渡してdeleteしてもらう形になっています。
よく分からないのは、わざとnewをせずポインタをNULLで初期化したままにしておき、
「NULLでなければ開放関数を呼ぶ」というコードを書いただけでも、
そこで死んでしまうのです。(NULLなので開放関数は呼ばれない!)
vectorヘッダをインクルードするかしないかで、死んだり死ななかったりと、
挙動がおかしすぎて正直よく分からない状況です。

425 :
ファイナライザが別スレッドから呼ばれるからとかじゃない

426 :
using使ってるのでそこは大丈夫だと思います

427 :
(gcnew Form1)->Show();
で作成されたフォームに
元のフォームにある文字列変数を渡す方法があったら教えてください

428 :
コンストラクタの引数で渡すかプロパティ定義して渡す
つかそれだとC#もC++もさっぱりだよね? ならまだ遅くないから今すぐC#に乗り換えること。

429 :
FindWindow で探すとか、EnumWindow でタイトルを調べるとか?

430 :
Showする前に渡せば良い

431 :
同じアプリ内でしかも.NETのフォームでFindWindow/EnumWindowとかアホか

432 :
オブジェクトとメンバ関数名を与えられたときに、その関数を呼び出すことはリフレクションを介して簡単にできますが、
指定された名前のグローバル関数を呼び出すことは可能ですか?

433 :
.NETでグローバル関数なんて使うもんじゃない
クラスの静的メンバにする

434 :
ですよねー。

435 :
グローバル関数なんて無かったんや!

436 :
自作したグローバル関数を書くのはどこが一番よろしいですか?
プロジェクト全体でつかうような関数です。
stdafx.hに書いたら
error LNK2005: "int __clrcall testfunc(void)" (?testfunc@@$$FYMHXZ) は既に stdafx.obj で定義されています。
ってエラーが出るのですが( ;∀;)

437 :
そらそうだろ
C++/CLIというか、C++の基本から勉強し直してこい

438 :
インクルードガード

439 :
関数にstaticかinlineつけて内部結合にするがよろし

440 :
ガードしても意味無いだろ。
別々のソースでインクルードされてコンパイルして、
それらをリンクしたら同じ名前の関数が複数出来上がってるわけだし。
と、ついでに質問者に説明してみる

441 :
>>440
スマヌ

442 :
あるサイトを参考にUnicodeからshift_jisに代えようとしてるんですが以下のコードで
cli::array<unsigned char^>^ ToShiftJis(System::String ^ unicodeStrings)
{
System::Text::Encoding^ unicode = System::Text::Encoding::GetEncoding(1200);
cli::array<unsigned char>^ unicodeByte = unicode->GetBytes(unicodeStrings);
System::Text::Encoding^ s_jis = System::Text::Encoding::GetEncoding(0);
cli::array<unsigned char>^ s_jisByte = System::Text::Encoding::Convert(unicode,s_jis,unicodeByte);
cli::array<unsigned char^>^ s_jisChars = gcnew cli::array<unsigned char^>(s_jis->GetCharCount(s_jisByte,0,s_jisByte->Length));
s_jis->GetChars(s_jisByte,0,s_jisByte->Length,s_jisChars,0);
return s_jisChars;
}
をビルドすると
error C2664: 'int System::Text::Encoding::GetChars(cli::array<Type> ^,int,int,cli::array<wchar_t,dimension> ^,int)' : 4 番目の引数を 'cli::array<Type> ^' から 'cli::array<Type,dimension> ^' に変換できません。
とエラーが出るのですが、どうすればよいのでしょう
どなたかご教示ください。

443 :
MFC の CString 使ったら?

444 :
Encoding.GetChars()ってChar[]とるんじゃないのか?
関係ない型をボックス化して何がしたいの?
というか、Encoding.Convert()の時点で既にSJISになっているし

445 :
Hoge hoge[x];
の要素数はsizeof(hoge)/sizeof(hoge[0])で取得できますが
Hoge *hoge=new Hoge[x];
の要素数はどうやって取得すればいいですか?

446 :
>>442
unsigned charに ^ は要らないと思うが

447 :
>>445
ネイティブ配列のサイズは自分で変数や定数で覚えとくのが基本
というかC++/CLI関係ないだろ

448 :
System::Stringからchar*に変換する関数を書きました。
半角256文字以上のテキストを投げると、255文字+\0でめられてしまいます。
下記をどのように修正すればいいでしょうか?
#include <msclr/marshal.h>
inline char* toPtChar(const String^ Text)
{
String^ temp = (String^)Text;
msclr::interop::marshal_context^ context = gcnew msclr::interop::marshal_context();
return (char*)(context->marshal_as<const char*>(temp));
}

449 :
>半角256文字以上のテキストを投げると、255文字+\0でめられてしまいます。
半角256文字以上の文字列を投げると、255文字+\0で丸められてしまいます。
2000文字程度変換できれば良いのですが、
の間違いです。すみません。

450 :
関数を以下のように書き換えてSystem::String→char*しても、
やはり256文字以上は消えてしまいます。
関数ではなく、何か他に原因があるんでしょうか?
#include <msclr/marshal.h>
using namespace msclr::interop;
using namespace System::Runtime::InteropServices;
char* toPtChar(const String^ Text)
{
String^ foo = (String^)Text;
IntPtr ptr = Marshal::StringToHGlobalAnsi(foo);
return (char*)ptr.ToPointer();
}
http://is.gd/BgDTis

451 :
ttp://www.cetix.de/DotNetNews/Thread61630-String_to_string_-_truncates_at_255.aspx
これか?
試してないけど。

452 :
   ◢▀▅     ▃
     ▋    ▋  ◢▀ ▀◣
    ▌     ▌ ▌     ▌
     ▌    ▌ ▌    ▌
    ▐      ▌ ▌     ▌
     ▐     ▀■     ▌
   ◢◤         ▀▃
  ◢◤             ◥◣
  ▌              ▌
 ▐   ●       ●    ▌      馬鹿にはコピペできないの。
  ▌              ▌
  ◥◣      ╳       ◢◤
   ◢▀▅▃▂   ▂▂▃▅▀▅
 ◢◤    ▀▀▀▀▀     ◥◣
▐◣▃▌           ▐▃◢▌
◥◣▃▌            ▐▃◢◤
  ▀▅▃          ▂▅▀
     ▀■▆▅▅▅▆■█▀
     ▐▃▃▃▲▃▃▃◢▍

453 :
   ◢▀▅     ▃
     ▋    ▋  ◢▀ ▀◣
    ▌     ▌ ▌     ▌
     ▌    ▌ ▌    ▌
    ▐      ▌ ▌     ▌
     ▐     ▀■     ▌
   ◢◤         ▀▃
  ◢◤             ◥◣
  ▌              ▌
 ▐   ●       ●    ▌      馬鹿にはコピペできないの。
  ▌              ▌
  ◥◣      ╳       ◢◤
   ◢▀▅▃▂   ▂▂▃▅▀▅
 ◢◤    ▀▀▀▀▀     ◥◣
▐◣▃▌           ▐▃◢▌
◥◣▃▌            ▐▃◢◤
  ▀▅▃          ▂▅▀
     ▀■▆▅▅▅▆■█▀
     ▐▃▃▃▲▃▃▃◢▍

454 :
日本の国民の中には、外国の事情がある程度分かっている人を除けば、
放送内容を信頼している人がまだいることは確かだ。一方で、ネット
住民たちのほぼ全員が、放送番組には政府の意図が色濃く反映されて
いることを知っている。自分の国がどういう国かということが、よく
分かるようになってきているのだ。

455 :
失礼します。色々まわっていたのですが此方を勧められたので此方でも質問させて頂きます。
VC++でWindowsフォームのプログラムを組んでいるのですが、
別ファイルでextern宣言したクラス(の配列)をform1.h等で参照したいのですがコンストラクタが上手く働いてくれないのか、宣言の場所が悪いのか
ゴミ値ばかりで上手く動作してくれません。
何かヒントもらえませんか?

456 :
ソース貼るか
エラー貼るか
何かヒントもらえませんか?

457 :
いきなりcharではなくwchar_tに変換
でWinAPI使ってcharに

458 :
>>455
コードも何も書かれてないから憶測でしかないが、newとgc_newを使い分けてないとか、*と^を使い分けてないとか、その辺じゃない?
後は配列が.netのクラスをちゃんと継承してないとか
生のC++とC++/CLIは全くと言って良いほど別言語で、でも生のC++も使えちゃうからC#とC++の合わせ技より罠が多く、バグが多くなり易いよ


459 :
publicにしてないとか

460 :
dll が違うとか

461 :
VC++のプロジェクトのwindowsフォームアプリでOpenMPって使えないんですかね?
'/clr:pure' と '/openmp' は同時に指定できません
ってエラーが出てるんで、CLIでは使えないのかな?とか思ったりしたんですがどうでしょう

462 :
/clr:pureで使えるわけがないだろネイティブコード入れられないんだから
/clrならどう?
っていうかWindowsフォーム使いたいだけだったら終わってるC++/CLIなんてやめて
C#でGUI作って重い計算だけC++(/CLIでない)で書いてC#から呼んだほうがいいよ

463 :
>>461 です
/clrならできました。ありがとうございます。
よくわかっていないのですが、/clr:pureにしていたのはネイティブとごっちゃになって
変なことになるのを防ぐためなんですかね?だから/clrとしてもそこらへんを気をつければ
問題ない、ということでいいんでしょうか?
C++/CLIは初めてなんで、どう”終わってる”のかわかりませんが、C#はやったことが無いので、
できればこっちでやりたいところなんです。

464 :
大丈夫だ、C++経験者からしてもC++/CLIの習得よりC#の習得の方が楽だから

465 :
/clr:pureだとアセンブリにネイティブコードが混ざらない。
ネイティブコードを混ぜないC++/CLIなんて存在価値ゼロだから、C++/CLI使うんなら常に/clrでおk。
C#をやれ。いくらC++の経験があろうが関係ない。間違いなくC#の方が早く使えるようになるし
開発効率に天と地ほどの差がある。C++/CLIはMSに完全に見捨てられている技術。

466 :
VS2010ではもうインテリセンスすら付けてくれてないもんね

467 :
C#やってみます。
過去のレス見てきたんですけど、ひどい言われようですね
あと、あんま書き込み無いのにレスは早くて面白かったです。

468 :
いろいろと屈折した愛があるからなw

469 :
俺はこのスレに張り付いてるけど一応ちょっと待ってからレスしてるわ

470 :
呼び出し規約がよくわからないのですが、関数を宣言した場所で明示しない場合
・引数・返り値の型にマネージ型が含まれる→__clrcall になる
・含まれない→__stdcall になる。実装がマネージドコードにコンパイルされると、double-thunkingになる
という理解であっているでしょうか。
また、非マネージ型のメンバ関数においては、
managed-code -> __thiscall stub -> __clrcall のような double-thunking が発生するのでしょうか?

471 :
VS11βでもインテリセンス無いかな?

472 :
今ちょっと打ってみたが効くみたいだよ。

473 :
C1001 が出た。
みんな報告してる?

474 :
可能な限りする

475 :
やっぱそうだよな。VS11Betaで試してconnect行くわ。

476 :
VS11betaでもやっぱりIntellisSense効かなくて
"No additional information available"って言われるんだけど
何が悪いんだろう
ButtonとTextBox置いてButtonのイベントハンドラの中で
textBox1->とかやってるだけなんだけど
最初のt打っただけで上のエラーが出て
->まで打ってもエラー出たままでメンバも表示されない

477 :
http://homepage3.nifty.com/ishidate/vcpp10_20/vcpp10_20.htm
ここの一番下の図5は図6用の計算式はどの様に記入すれば良いのですか。

478 :
function1のとこだろ
どう考えてもC++/CLIでやるべきことじゃないよなこれ
内容は凄いのに…C#にすれば…

479 :
おお、派手だなw
.net framework 使いたいだけならC#でいいなーほんとに

480 :
eのこと聞いてんのかな?
Math::Exp() にすりゃいいと思うが、、、、

481 :
こういう変に優秀な勘違いがいるからC++/CLIに手を出す奴がいなくならないんだよな
C++/CLIの記事や書籍ってC#やVBに比べて妙に良質だったりするし

482 :
C/C++では配列の終端の一つ次を指すポインタは有効なポインタだったのですけど、
マネージ配列の終端の一つ次を指す interior_ptr は配列がGCで移動したときに正常に更新されますか?

483 :
いまさらですが、試してみたところ正常に移動するようでした。

484 :
(勝手な推測ですが) interior_ptr はハンドルとオフセットのペアで実装されているのではないかと思います。
array<int> ^a;
auto pa = &a[3]; // { a, 12 }
int *p;
interior_ptr<int> ip (p); // { nullptr, p }
ところで、長さ 0 の配列 (b) に対して &b[0] は IndexOutOfRangeException なんですね…。困った困った。

485 :
配列でinterior_ptrなんて必要?
君が言ってるように常に配列のハンドルとオフセットをペアにしとけばよくね
interior_ptrってクラスのインスタンスフィールド指すのに使うやつでしょ

486 :
既存コードの一部だけマネージに持っていく実験なので。
*& はできても interior_ptr<T>% はできないので、配列 + オフセットの方が便利なのはその通りです。

487 :
引数としてstring型の配列を用いたいのですが・・・
自分C#しかやったことないので・・・

488 :
void foo(cli::array<System::String^> ^bar);

489 :
Thank you sir.

490 :
cli::array<System::String^> ^hoge を char* hogehoge[] に変換したいのですが・・・

491 :
>>490
http://ideone.com/XGbqa

492 :
すまん、コンストラクタが例外安全でなかったので修正した
http://ideone.com/xbcbh

493 :
全然わかんね

494 :
cli::array<System::String^> ^hoge = ...;
char_pp p(hoge);
char** hogehoge = p.get();
ってことなんだが
char** は char* xxx[] を引数に取る関数にそのまま渡していい

495 :
Hmm...

496 :
補足しておくと
・PtrToStringCharsで内部ポインタを取得
・System::Stringはunicodeなのでwcstombs_sでマルチバイト文字列に変換
・std::auto_ptr, std::vector, char_ppはRAIIイディオムにより例外安全にするため
・try{}catch(...){throw;}もchar_ppコンストラクタを例外安全にするため
用語はググってくれ
もしC++初心者で.NETからよそのライブラリ使いたいとかなら
C#からP/Invokeした方が多分楽

497 :
P/Invokeですか・・・

498 :
そんなコード書かれたら、俺なら普通に書き直しさせるわ
文字列のマーシャリングで標準のマーシャリング以外を使うなよ
marshal_context c;
for (...) native_str[i] = c.marshal_as<char*>(managed_str[i]);

499 :
それコンパイル通るの?

500 :
MFC 使うんだったら、CString に直接放り込めばいいだろうに
CString strBuff(strManaged);

501 :
VC++2008のC++/CLIでUSBカメラが抜かれたことを検知したいのですが,どなたかわかりませんか?
USBメモリーなら
virtual void WndProc(System::Windows::Forms::Message% m) override
{
if(m.Msg == WM_DEVICECHANGE)
{
switch((int)(m.WParam))
{
case DBT_DEVICEREMOVECOMPLETE:
MessageBox::Show("out");
break;
case DBT_DEVICEARRIVAL:
MessageBox::Show("in");
break;
}

}
Form::WndProc(m);
}
で判断できたんですが,USBカメラだとm.Wparamが変化しません...

502 :
c++を使い始めたものなんですけど
こっちはちゃんとなるんですけど
http://www.dotup.org/uploda/www.dotup.org3073322.jpg
includeを使うと
http://www.dotup.org/uploda/www.dotup.org3073352.jpg

こんな感じになっちゃって・・・(´;ω;`)

だれか解決して下さいませんか?

503 :
苦Cか

504 :
>>503
正解
あれはとてもためになります
ところで
対処の方法は?

505 :
まずスレタイを読みます

506 :
>>505
読みました
さようなら

507 :
わろた

508 :
DOSで趣味でプログラム組んでた程度で、APIめんどくせ、MFCうぜえってレベルなんだが
久しぶりにちょっとしたゲームでも作ろうとして
VCに無料版があるのか!と飛びつき
無料版でフォームの統合環境まであるんか、今はMFCにかわってCLRなんかと早とちりし
ネット漁ればサンプルやら何やらゴロゴロしてるかと思えば…
何じゃこりゃ

509 :
CLRってなんだよ。CLIはMicrosoftにも見捨てられかけてるのでね…泣けてくる。
どうせ.NET使うならもうC#で全部やっちまえよって感じか?

510 :
CLIは規格の名前、それのMSによる実装がCLR
CLRに大量のライブラリ群を加えたやつが.NET Framework
CLIに対応する構文を追加したC++だからC++/CLI
>どうせ.NET使うならもうC#で全部やっちまえよって感じか?
その通り。過去の資産を使わないといけないというような、必要に迫られて仕方なく使う物だよ。

511 :
ところでVC++のC++/CLIってMS CLRじゃなくて純粋なCLIで動くの?
一応CLIではアセンブリはネイティブイメージを持てるという決まりだった覚えがあるけど
細かい相互運用のことは決まってなさそう

512 :
C++/CLIをMonoで動かそうとするとCRT使えない&/clr:pureだったよね。今は変わったのかな?

513 :
>>508
そういう用途だったら、C#おすすめだけどね。
プロトタイピングに最適!

514 :
/clr:safe だね。
using namespace System;
int main(array<String^>^ args) {
  Console::WriteLine("Hello World !");
}
cl /clr:safe test.cpp
mono test.exe
でいける。

515 :
http://www.atoker.com/blog/2012/04/12/llvm-europe-2012-cli-compiler/
ClangベースにC++/CLIコンパイラ作ったという話。
(1)と(2)とあるけど、どちらもVisual C++の吐く
混在アセンブリとは違う仕組みっぽい感じがする。

516 :
VC++のclrで,ref classはなぜref classからしか継承できないんでしょうか?
仕組み的に継承先でgcとか実装されるなら別にvalue classからとかでも継承できていいと思うんですけど……

517 :
というか普通のクラスをpublic refで継承したいのおおおお

518 :
継承出来ても仕組み上ハンドル変数にしか入れられないから意味なくね

519 :
構造体がなんかインターフェイスを実装してる場合には意味ないこともないが
CLIを拡張するのに見合った利益があるかどうか考えると当然切り捨てだろうな
あくまでC#とVBが主役なんだからC#やVBから使えないクラス作っても意味ない

520 :
混合型ェ・・・

521 :
混合型こそ仕組み的には特にできない理由がなくて比較的大きな利益のあるものだよな
CLIやCLRを弄る必要もなく、コンパイラだけで対応できるはず
永遠に将来的に対応予定だが

522 :
いや仕組み的に無理だから
マネージド領域のポインタはfixedなしに取得してはいけない
実装部分でそれを止める(無いことを保証する)には宣言部分で付加情報が必要
それがrefキーワード
ヒープ領域ならポインタを取得するのは問題ない
だからrefクラスのメンバにポインタ型なら定義可能
コンストラクタでnewしてCLIデストラクタ(IDisposable)でdeleteすること

523 :

template <typename T> ref class ref_auto_ptr{
   T* p;
public:
   ref_auto_ptr(T* ap):p(ap){}
   ~ref_auto_ptr(){delete p;}
   T* get(){return p;}
};
struct val_class{
   val_class(){Console::WriteLine(L"new val_class");}
   ~val_class(){Console::WriteLine(L"del val_class");}
};
ref class ref_class{
public:
   ref_class():p(new val_class()){}
   ref_auto_ptr<val_class> p;
};
int main(array<System::String ^> ^args){
   ref_class c;
   Console::WriteLine(L"a");
   return 0;
}
-----------------
new val_class
a
del val_class

524 :
仕組み的に無理って
C++/CLI のもともとの目的は混合型を実現することだったんじゃなかったか?

525 :
Some Notes about Mixed Types
http://blogs.msdn.com/b/branbray/archive/2005/07/20/441099.aspx

526 :
PODなネイティブ構造体をマネージ型に置いたり、マネージハンドルをメンバに持たない
マネージ構造体をネイティブ型に置いたりするのは別に問題ないが(ミスを誘発しやすいという懸念はあるが)
もっと一般的に混合型を扱えるようにする構想があったからとりあえず全部禁止しといたってことか
で結局はC++/CLIそのものが見捨てられて計画倒れになり、理不尽な制限として残ってしまったと

527 :
ちょっとした配列をメンバに持ちたいときにmallocしたりgcnewしたりしないといけないのは
なんとかならんかったんかなぁ、と思う。

528 :
>>525
Point* G(R^ r) {
pin_ptr<Point> pinp = &r.p;
return pinp;
}
これってGCの問題というよりはC++でもよくあるミスの一種だよね
ローカル変数のポインタを残すなってのと同類

529 :
初心者みたいな質問ですがすみません。
今、マネージコードからネイティブなコードを呼び出す ということがやりたいのですが
例えば、native_program.hを
#pragma unmanaged
int func(int num){
return num*2;
}
のように書き、Form.hで
#include "native_program.h"
(中略)
int num2 = func(50);
(後略)
のように呼び出しても、マネージコードでは呼び出せませんのようなエラーが出て上手くいきません。
1つのプロジェクト内で、ネイティブコードも書きながら、#pragma unmanagedを使って
コンパイルするというのは無理なのでしょうか?
http://www.atmarkit.co.jp/fdotnet/special/vcppinvista01/vcppinvista01_02.html
ここにあるようにdll化して呼び出すということをしないとダメなのでしょうか。
これだとデバッグが大変なので、1つのプロジェクト内やりたいのですが・・・・
よろしくお願いします。

530 :
include ってそこに書いたのと同じ意味になるんだがそれはわかってる?

531 :
>>530
小一時間考え、
#include "native_program.h" の下に #pragma unmanaged を入れたら通りました・・・お騒がせしました
ところで、func()は実際はクラスの中に入ってるのですが、
呼び出し側では、
Classname* classname;
classname->func();
のようにすればOKなのでしょうか。この2行はマネージコードの中に入ってるけど
特にnewとかしなくても上の一行だけでクラスのオブジェクト作られてるのかなと・・・
というか、このように書いたら動いたのでOKなのかなと思ってるのですが。

532 :
失礼、#pragma managedです。。。
書き間違いました^^;

533 :
オブジェクトは無いだろう。
thisポインタがNULLのまま

534 :
オブジェクトはないけど動いている・・・
ということは、実行ファイルを直接読んでるということか・・・
よくわからないし動いてるので気にしないことにします^^;
失礼しましたw

535 :
>>531
Classname classname;
classname.func();
ならOK

536 :
まあ素直にstaticつけようぜ

537 :
なんで動いてるか気持ち悪かったのでやっぱりnewとdelete追加しときましたw
>>535
それだとコンパイルする人がエラー出しますね
>>536
やっぱ暗黙的に静的インスタンス?みたいなの作られてて、それのポインタになるんですかね
実体がなかったら動くわけないし。
デバッガでみたらポインタは未定義の値みたいになってましたけど

538 :
仮想関数じゃねーんだから、実体があるとかどうとか関係無い。
単に関数呼んでるだけだ、未定義のthisポインタでな。

539 :
>>537
>実体がなかったら動くわけないし
ところがCやC++では動く。
速度重視のため、安全確保のための自動チェックなどは行われない。
そしてメンバ変数に代入すると何処とも知れないメモリアドレスを書き換えて
所謂セキュリティホールになったりする。
メモリアクセス違反で強制終了するのはまだ良い方。

540 :
>>539
いあいあ、実体というか、どこかに機械語のコードがなかったら動くわけないですよね?
その場所がわからないとうか、管理されてないというかんじなのかな?
OSが管理してて、そのOSによるということなのかなあ

541 :
しったかしてるから初心者みたいな勘違いしたままなんだよ

542 :
>>540
まず「ヒープ」「スタック」「コードセグメント」あたりの
基礎から勉強すべき

543 :
C++/CLIってC++と.NET両方の知識がある人向けだから
そうでない人はC#でP/Invokeを使った方がいいと思う。

544 :
今更だけど、pragma managed も push pop できたと思うよ。

545 :
まあヘッダに入れてるしC++勉強始めて3日くらいの知識でC++/CLIとごっちゃで勉強すると
後で困ると思うがなあ

546 :
VisualC++の入門書を買って来たらC++/CLIの本だったのは良い思い出・・・

547 :
「シー教えてくれ」と言われ見たらC#

548 :
そのときの「シー」は半音上がってたんだろうw

549 :
>>548
うまいw

550 :
C++/CLI で暗黙のバッキングストア使うとき、get/setで異なるスコープにすることはできますか?
C# であれば public Hoge { get; protected set; } のような感じで。
ちなみに今使っているのはVS2008です。

551 :
出来るよ。
ref class Clazz
{
  property int XXX
  {
  private:
    void set(int iA);
  public:
    int get();
  }
};

552 :
>>551
ありがとー。
本体を書かなければ自動生成されるんですね。いわゆるWeekシンボルってやつかな。
>>550
× public Hoge { get; protected set; }
○ public int Hoge { get; protected set; }

553 :
XmlTextReaderでxmlファイルを読み込むとき,ファイルがあるかないかの判別はどうすればいいですか?

554 :
例外見ればいいだろ

555 :
msdnにあるFileNotFoundExceptionを使うのでしょうか?
使い方がいまいちわかりません・・・
恐縮ですができればサンプルコードを書いていただけませんか?
XmlTextReader^ reader = gcnew XmlTextReader( "sample.xml" );

556 :
XmlTextReaderのコンストラクタを直接触るのは非推奨
try { XmlReader^ reader = XmlReader.Create( "sample.xml" ); }
catch (FileNotFoundException^ ex) { Console::WriteLine("ファイルが見つかりません。"); }
C++/CLIは君みたいな人が足を踏み入れるようなもんじゃないし
頑張ったところで特にメリットもない
今すぐC#かネイティブのC++へ移行することを強くお勧めする

557 :
C#とごっちゃになってた
XmlReader::Createの間違い

558 :
>>556-557
ご回答ありがとうございます 助かりました
基礎ができていないのは痛感しております・・・
もしおすすめの参考書があれば教えていただけると幸いです・・・

559 :
悪いことは言わん
どうしてもC++/CLIを使わないといけないのなら、まずはC#を覚えるのが近道だ
C#なら入門者向けの書籍やサイトなどもいくらでもあるし、
C++/CLIの.NETの部分はC#もどきの劣化版にすぎない。

560 :
>>559
なるほど・・・
しかし今作っているプログラムを作り直す時間がありませんので
ひと段落してからC#の勉強をしたいと思います・・・
ありがとうございました.

561 :
なぁ、実際C++/CLIの利点て具体的にどうなの?
C++で作ったライブラリもユニコード使用でないとオーバーヘッドかかるし
.NET側にC++クラスのオブジェクトを入れるとポインタ使用になるし。
まぁ、パソコンも進化続けるから、アプリの重さも気にはなくなるだろうけど。

562 :
ホスト:アンマネージ、プラグイン:.NETの場合は、C++/CLIなしでやろうとすると
COMを経由してCLRをホストしたりとかクソ面倒臭い
.NETからC++のクラスを使いたい場合、C++/CLIではなくDllImportを使うとなると
いったんC向けのフラットなインターフェイスにラップしてやらないといけなくてクソ面倒臭い
どっちにしろC#とアンマネージC++を両方使う場合にのみ役に立つ

563 :
質問させて下さい。
visual studio 2005でC++/CLIを用いて開発を行なっています。
ref struct AA
{
 public:
  int a1;
}
refクラスの上記のような構造体を定義してそのオブジェクトを2つ作り、
AA a, aa;
a = aa;    (例なので初期化せずに代入しています)
とすると「error C2582; 'operator '=' 関数を 'AA' で使用できません」となってしまいます。
実際にはrefクラスの構造体を引数として渡したかったのですがC2664になってしまいビルドが通りませんでした。
そこで一番単純な構造体の代入コードを記述したところ、上記のようなエラーとなりあました。
いろいろ調べてみると、refクラスはコピーインスタンスとコピー代入演算子をデフォルトで自動生成しない
ということが原因かと考えたのですが対策が思いつきません。
refクラスの構造体の代入とコピーの方法をご教授いただければ幸いです。よろしくお願い致します。

564 :
で、値をコピーしたいの? 参照だけで良いの?
value struct AA じゃ駄目?
^は知ってる?

565 :
>>564
レスありがとうございます。
私の勉強不足のため、クラスライブラリ側の宣言はref structで宣言しないとダメだと思い込んでいました。
しかも、クラスライブラリ以外のプロジェクトでも同様の結果になるため、勝手に環境の説明を省いてしまいました。
申し訳ありません。
ご指摘の通り、value structにすることで解決できました。ありがとうございました。

566 :
PathCombainのstd::string版ってないですかね?

567 :
この本って古本で定価の倍でも買う価値あります?
実践C++/CLI 極めるための基礎と実用テクニック
http://www.amazon.co.jp/dp/4797336277/
最近、DirectXをWPFから呼び出す必要が出てきて……
でも、VS2012と.NET4.0が出たときに
新しい本がいろいろ出版されるような気もしますよね……

568 :
2012は4.5だ

569 :
>>567
SlimDXを使うか、読めば足りるんじゃないか。

570 :
使いたいDirectXの機能によっても代わるよなぁ

571 :
> マイクロソフトから、お客様のアプリケーションがたくさんの人々の目に触れ、
> 試用および購入されるのをサポートする、新しい特典をお知らせいたします。
> MSDN サブスクライバーであるお客様は、1 回のご購入で 12 か月有効な
> Windows ストアおよび Windows Phone の開発者アカウントを取得すること
> ができます。
AzureはVLで買っても契約期間分使えるのに(厳密にいうと少し違うが)、
これはVL(2or3年)で買ってると悲しいな。

572 :
テラ誤爆…サーセン

573 :
http://toro.2ch.net/test/read.cgi/tech/1323588154/672

574 :
(;´д`)アアン

575 :
VS2010でフォームアプリの勉強をしています。
unmanagedクラスで別スレッドにて不定期で呼ばれる関数から、
managedなフォームの内容を変更したいと考えています。
下記のようにコーディングしましたが、stackoverflow(InvokeRequiredがずっとtrueのため)
で動きません。。どなたか適切な方法を教えていただけないですか?
1.managedなformメソッドとしてform編集メソッド作成
2.スレッドセーフにするためInvokeでラップ
 参考:http://blogs.yahoo.co.jp/fireis_myblood/25643271.html
3.delegate->Marshal::GetFunctionPointerForDelegate()でポインタ化
4.unmanagedの不定期呼び出され関数に2の関数ポインタを設定
5.実行

576 :
Marshal::GetFunctionPointerForDelegate の返り値を CreateThread の第四引数に渡して別スレッドから呼んでみたけど、
別スレッドからの呼び出しでは InvokeRequired は true になって、そこで Invoke した先では false になったよ。

577 :
たぶんやりたいのはこうだと思うんだけど、違うかな。
DWORD WINAPI proc(LPVOID param) {
typedef void (*fp_t)(void);
fp_t fp = reinterpret_cast<fp_t>(param);
for(int i = 0; i < 10; ++i) {
::Sleep(1000);
fp();
}
return 0;
}
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
IntPtr fp = Marshal::GetFunctionPointerForDelegate(gcnew MethodInvoker(this, &CppCli575::Form1::addText));
::CreateThread(NULL, 8192, proc, static_cast<LPVOID>(fp), 0, NULL);
}
void addText() {
if (textBox1->InvokeRequired) {
textBox1->Invoke(gcnew MethodInvoker(this, &CppCli575::Form1::addText));
return;
}
textBox1->Text += "A";
}

578 :
>>577
MethodInvoker^はメンバ変数に置いとかないと

579 :
日本人は マスコミ電波で動く ロボット人間
日本人は、先進諸国で飛び抜けてマスコミ報道を鵜呑みに
信じやすいことがこの動画で実証されています。
いわばマスコミ報道の「鵜呑度」を国際比較すると、
日本人は、先進国中ダントツに「鵜呑度」が高く70%、
最も低い国民は英国で14%です。
その他の主要欧米諸国(ロシアを含め)は20−35%です。
日本に近い国は、ナイジェリア、中国など、途上国と新興国となります。
別の言い方をすれば、日本人の70%は、
自分の頭で考えず(思考停止)、
テレビ、新聞、週刊誌などのマスコミの情報を鵜呑みにしていることを意味します。
青山は以前からこれを「観客民主主義」と言っています。
観客民主主義は、マスコ ミの情報操作による世論誘導に最も陥りやすく、
独裁にも呼応しやすい特性を持っています。
マスコミ報道「鵜呑度」
日本人70%、英国人14% You Tube
http://www.youtube.com/watch?v=ypPqsWUC6Vo
http://www.asyura2.com/12/senkyo132/msg/578.html

580 :
>578
たしかにGCされるとだめですね。フォローどうも。

581 :
>> 576-577
ありがとうございます。
実装してみたところ、確かに望みの動作をしました!!
なぜ自分のコードが動かないか突き止めるために
教えていただいたコードを変更していますが、別の問題にもつまづきました。。
申し訳ないですがもう少し教えてください。
<当面の問題:うまくコンパイルできない>
関数procを、クラス内のstaticメソッドに変更しようとした(下記)。
#コンパイル時に、未解決のトークン (0A000043) "public: static void (__cdecl* test2ch::Testproc::fp)(void)"とのエラーが発生。
class Testproc
{
typedef void (*fp_t)(void);
static fp_t fp;
public:
Testproc(LPVOID func)
{
fp = reinterpret_cast<fp_t>(func);
::CreateThread(NULL, 8192, (LPTHREAD_START_ROUTINE)Testproc::proc1, this, 0, NULL);
}
DWORD static WINAPI proc1(void)
{
for (int i = 0; i<10; ++i){
::Sleep(1000);
Testproc::fp();
}
return 0;
}
};

582 :
連投すみません。
ちなみに、元の問題の原因究明のために今後確認したいことは
(staticメソッドでラッパした)インスタンスメソッドとしてproc1()を定義し、
proc1()内ではstaticではない関数ポインタfpを実行するように変更して
スレッドを実行して所望の動作(formが変更できる)かどうかを確認
です。

583 :
>>581
C++/CLIじゃなくてただのC++の話だな。
static fp_t fp;
これの実体を定義していないだろ?

584 :
>>583
お恥ずかしい限りです・・・
ご指摘ありがとうございました。
581の問題は解決しました。

585 :
コンパイルが通りません
教えて下さい
ref class Test
{
bool& Bl;
Test(bool& bl)
{
Bl = bl;
}
};


586 :
Test(bool& bl):Bl(bl){
}

587 :
>>586
コンパイルが通りました
ありがとうございました

588 :
画面周りだけCLI使ってそこから呼び出すのはPUREなC++にしている

589 :
最初はそういう使い方してたけど
最近はp/invokeがあるからC#で別段問題ない

590 :
最初から/CXの構想で作れなかったのかねえ

591 :
>>588→画面をC#にしたら簡単すぎワロタ→内部もC#にしても速度変わんなかった→もうC#だけでいいや

592 :
既存のC++のライブラリがある場合はC#から呼び出しまくると速度ゲロ重

593 :
C++/CLIから呼んでもC#から呼んでも速度は変わらんよ
C++のライブラリはC#だとラップするのがゲロ面倒だから、その点ではC++/CLIが有利
でも本当に速度を求めるんなら、C++/CLIでもC#でも細かくネイティブコードを呼ばないで
必要なデータをまとめて受け渡しするようにして、
細かいところは全部ネイティブコードで書いてしまうのがいい

594 :
>C++/CLIから呼んでもC#から呼んでも速度は変わらんよ
C++ InteropはP/Invokeより高速だよ
http://msdn.microsoft.com/ja-jp/library/ky8kkddw%28VS.80%29.aspx
他のところは同意。まとまった単位でネイティブに切り出さないと高速化の恩恵は薄い。下手するとC#より遅くなる。

595 :
変なマーシャリングしないようにすればC#のDllImportでもそんなに遅くはならないよ
アプリに即した形でまとめてネイティブコードで処理、を突き詰めると
結局C++(not CLI)とC#でいいんだよなあ

596 :
C++/CLIはビルドが遅いから糞

597 :
必要に迫られて仕方なく使うもんですし

598 :
マネージドからアンマネージドの処理を制御するのはいいんだけど
アンマネージドからマネージドに通知したい時どうしようか悩む

599 :
gcrootで余裕
C#とDllImportだと参照管理がかなり面倒

600 :
C++/CXもここでいいの?
βでもあったし環境依存みたいだが、VS2012 for Windows8で
ターゲットwin32の時に出るコンパイルエラー対策を自分用にメモっとく
インクルードディレクトリに追加 ;$(WindowsSDK_IncludePath);
ライブラリディレクトリに追加 ;$(WindowsSDK_LibraryPath_X86);

601 :
>C++/CXもここでいいの?
全然別ものなので違います

602 :
/CXも/CLIと同様に、GUI作るのに使おうとする勘違い君がたくさん出てくるんだろうな
このスレに溢れるC++/CLIに対するネガティブな意見はほとんど/CXにも当てはまる

603 :
そう? ストア用アプリ開発をC++でやりたいって人に
思い留まらせるような要素は、C++/CXの環境には無いと思うけど

604 :
説明するだけ無駄な気はするけど、
WinMDのおかげでDllImportの手間が消えて、呼び出しコストが減って、C++製のネイティブコードを対象にしたリフレクションすら使えるようになった。
これだけ扱いやすくなってくれると高速化のために部分的に利用するってのも十分いける。
C++ AMPとか面白げな物もあるしね。
(C++やC#製のライブラリがJavaScriptからも簡単に呼び出せるので、UIをHTML5とJSで作る人が増えそう)
C++を使いこなせるならC#覚えるのは簡単。
C++が使えてもWinRT部分は全部0から覚えなおし
GUI作るのに何倍も時間がかかるわりには、同じライブラリ使っているため体感速度に差がない。
それならC#覚えて、重い処理のとこだけC++でやればいい。(HTML5+JSでもいいけど)
この辺の事情からC++/CXもC++/CLIと同様にGUIを作るためのものではないと断言する。
これだけ言われてもC++/CXだけでやりたいって言うなら止めないけど、どこまで行っても茨の道だぞ

605 :
GUIはともかくDirectX使う場合はC++/CXになりそうだがXNAないし

606 :
>>604
うーん、説明されても無駄だったなあ
C++/CXのデメリットの部分が抽象的でピンとこないや
WinMDちゅーても既存のネイティブライブラリをC#アプリにマージしようとしたら
結局ラッパークラス書かなきゃならないわけで
C++/CLI時代なら、ラッパークラスの作業量が多くなり過ぎるくらいなら
インターフェイスの粒度を洗いなおしてもうDllImportにしちまえよってことになるけど
C++/CXはそのまま全部に使うっ選択肢もありだとおもうけどね


607 :
>>605
DirectXはCX拡張使わずに普通のC++で使えるからC++/CX関係ない
設定画面などで少しだけOSネイティブのUIを使いたいときだけほんのちょっとCX使うくらいだろ
>>604
考え方が逆だと思う
これまでの.NETでは、C#からDllImportでC++を呼び出すのは簡単でもその逆は難しい
だからそこを補助するのにC++/CLIは有効
WinRTでは、C++からCXを使ってC#やWinJSで書かれたコンポーネントを呼び出す
ということが簡単に行えるから、既存のC++コードを他言語から
呼び出すためのラッパーなんて書かなくていいの
新規に作ったC#やJSのコンポーネントをC++から呼び出せばいい

608 :
まぁ、どっちの使い方も出来るんだから好きなようにやりゃいいさ

609 :
むしろC++/CXで呼び出せるデスクトップ用GUIライブラリが欲しかった…
C++/CLIはcli上にネイティブ用マーシャリングコードの生成だったけど
C++/CXはネイティブ上にCOM/WinRT用マーシャリングコードの生成なんんだよね確か
つまりObjCのパk(ry

610 :
パコパコ

611 :
問題はMSが途中で放り投げないのはどれかということだよ

612 :
C++資産の活用という目的があるから/CLIも/CXも無くなることはないだろうけど
/CXも/CLIみたいにIDEサポートがなおざりになっていく可能性が高いな
/CLIも誕生当初は.NET開発の本命とか言われてたんだし

613 :
全部放り投げて新たな言語開発したりしてw

614 :2012/11/01
MSって実験的な技術でも最初から気合入れてしっかり使えるものを出してくるから厄介なんだよね
新技術出してすぐ放り投げるのはGoogleのほうがよっぽど酷いけど
あっちは一目見て「ああこれダメだわ」とわかるからな
TOP カテ一覧 スレ一覧 2ch元 削除依頼
Androidプログラミング質問スレ Part26 (419)
JAVAってこんなことも出来ないの? (473)
Win32API質問箱 Build112 (655)
くだすれDelphi(超初心者用)その54 (902)
JavaScriptは消滅すべきだったよな (447)
JavaScriptは消滅すべきだったよな (447)
--log9.info------------------
史上最強の奪三振男は? (849)
ボビー(バレンタイン)・マリーンズを語ろう (309)
【呉越同舟】球界の不仲を語るスレ【不倶戴天】 (903)
ビジターチームのファンが数で圧倒してたこと (362)
もし古田が選挙に出たらどうするんだよ? (200)
野村野球と権藤野球はどちらが正しいのか (381)
1990年のプロ野球を語ろう (358)
1989年日本シリーズを語ろう! 巨人対近鉄! (290)
【1985】2年間の落合・バースはNPB史上最強【1986】 (824)
★★理想的な二番打者といえば、誰?Part2★★ (376)
★★★MLB統一スレッド249★★★ (292)
【TEX11】ダルビッシュ有応援スレ151【faridyu】 (466)
【一人】松井秀喜*R物語【一行】 (252)
【元NYY55】松井秀喜応援スレ1347【WBC4番最有力】 (422)
Seattle Mariners Vo.1075 (512)
【160km右腕】大谷翔平【ポストダルビッシュ】 (443)
--log55.com------------------
【マターリ】NHKマターリ実況(地震・災害関連情報)◆2506
【井上あさひ専用】きょう一日・音の風景兼用no.178
連続テレビ小説 エール ★68
首都圏情報 ネタドリ!「なじみの店が消える… 感染拡大の波紋」
今だから、新作ドラマ作ってみました「転・コウ・生」
[再]アシガール(4)「ドキドキの夜!」★3
ドキュメント72時間 選「秋田・真冬の自販機の前で」★4 修正
[再]いいね!光源氏くん(5)「恋は食品さんぷる?」