10/03/15 09:41:19
おそらく、.NET開発でデファクトスタンダードに最も近いであろう
C++/CLIについて語ろうぜ!
このスレはC++および.NET Frameworkについて一定以上の知識を持っている人が対象となります。
.NETのクラスライブラリの使い方といった質問は Visual Studioスレにお願いします。
前スレッドはこちら
くだすれC++/CLI(初心者用)
スレリンク(tech板)l1
dat落ち姉妹スレ
C++/CLI part3
スレリンク(tech板)l1
スレリンク(tech板)l1
スレリンク(tech板)l1
managed C++ やろうぜ!! 002
スレリンク(tech板)l1
2:./1256645713/662
10/03/15 09:45:45
ドキュメントの MSDN には、System::String(SByte*); て書いてあるけども、
System::String(char*); が正解ってことか?
それとも SByte が signed char ではなくて char てこと?それは無いような気が。
ちなみに、使ってる教科書のサンプルプログラムは8bitでは char* 配列を渡してる。
3:デフォルトの名無しさん
10/03/17 19:44:10
厳密名の付け方が分かりません
検索しても意味不明なものしか引っかからない
4:デフォルトの名無しさん
10/03/17 21:02:17
開発でつかわれてるのかな?
C++/CLIって。
5:デフォルトの名無しさん
10/03/17 21:41:39
必要なら使われるだろ。
だからなんなんだ?
6:デフォルトの名無しさん
10/03/17 22:37:29
>>3
LINKにある。
/KEYCONTAINER /KEYFILE
7:デフォルトの名無しさん
10/03/17 22:45:13
というか必要な時だけ最小限使うもの
基本的に使わないほうがいい
8:デフォルトの名無しさん
10/03/18 00:33:17
最近妙にお気に入り
9:デフォルトの名無しさん
10/03/18 09:03:31
Managed C++でさえ一部で使われていた。
10:デフォルトの名無しさん
10/03/22 19:23:41
フォームの中にあるテキストボックスの内容をmainとか関数とかから書き換えたいんだけど
どんな方法があるでしょうか?
今までは強引にチェックボックスにチェックが入ると
void test(System::Windows::Forms::TextBox^ tb_log_view);
こんな感じの関数呼び出してTextBoxを強引にわたして指定の処理して
テキストボックスにメッセージ表示させてたんだけど
何せ使い勝手が悪いので・・・
11:デフォルトの名無しさん
10/03/25 01:29:18
String^使えばいいんちゃう?
12:デフォルトの名無しさん
10/03/25 18:00:01
今、「Cで書かれたライブラリをC++/CLIでラッピング(DLL化)し、
C#で使おう」という目的に向けて、Cのライブラリをラッピング中ですなのですが、構造体で悩んでます。
C++/CLI側でC#側に「構造体の配列」を返す関数が見せてるのですが、実行すると思ったように動きません。
C++/CLI側
[宣言]
public ref struct SampleStruct {
static CHAR cUpdate;
};
static array<SampleStruct^>^ pstSample = gcnew array<SampleStruct^>(10);
関数
array<SampleStruct^>^ hogehoge(){
if(pstSample[0] == nullptr ){
for(int i=0; i<10; i++ ){
pstSample[i] = gcnew (SampleStruct);
}
}
pstSample[2]->cUpdate = 2;
return pstSample;
}
C#側
SampleStruct[] stTest = new SampleStruct[10];
stTest = LIBSAMPLE.hogehoge();
ここで、stTest[0].cUpdateからstTest[9].cUpdateまでを見ると
全部2が入っております。(本当は[2].cUpdateだけ2が入っていて欲しい)
どこが原因か分かりますでしょうか?
OS:XP
環境:VS2008 ExpressのC++版とC#版を使ってます。
13:デフォルトの名無しさん
10/03/25 18:34:20
> static CHAR cUpdate;
Cさえ理解していないのがよくわかる。
14:デフォルトの名無しさん
10/03/25 18:45:45
うわ・・・・・
泣ける・・・・orz
回答有難うです
15:デフォルトの名無しさん
10/03/25 18:53:51
突っ込みどころや怪しい箇所が多すぎて、どうしたいかが見えてこない(笑
配列はC++/CLIでアロケーションしていいのかとか。
C#でいう構造体はvalue class (or struct)であって、ref structはクラスだけどどっちにしたいのとか。
16:12,14
10/03/25 19:13:48
目的は、「Cで書かれたライブラリをC#で使う」事なのですが、
現状は、Cの方には手を加えないように、やる方法として、C++/CLIで
ラッピングするという手段があるという事なので、作業している次第。
そこで、構造体のポインタを戻り値としている関数はどう扱えば?と
思ってましたら、
URLリンク(ap.atmarkit.co.jp)
このような話をみつけたので、まずはref structでやってるという状況です。
17:デフォルトの名無しさん
10/03/25 20:50:34
CのライブラリだったらC++/CLIなんか使わずにC#でDllImportすればいいような
18:12,14
10/03/26 09:55:14
>>17
説明不足でした。
(当然の疑問ですよね)
そのCのライブラリというのが、元がスタティックしか考慮されておらず、
DLL用にはなってなく(__declspec(dllexport)のような記載は一切なし)、
選択肢として
1 Cのソースをdll対応に修正(__declspecを全関数に追加)
2 元のCには手を加えず、新しくラッパーを作る
があり、今後もCの方は勝手にバージョンが上がっていくので、
それなら、元のソースに手を加えない方向でやろうとなった次第です。
19:デフォルトの名無しさん
10/03/26 10:26:08
だからってそのラッパーをC++/CLIで書く必要はないだろ
Cで薄ーいラッパー書いて普通のネイティブDLLとしてコンパイルすればおk
C++のライブラリとなると面倒だけどそうでないならC++/CLIはできるだけ避けたほうが賢明
20:12,14
10/03/26 12:05:28
>>19
その手がありましたか!
C#でDllImportして、
DLL関数に渡す構造体、DLL関数から受け取る構造体は
[StructLayout(LayoutKind.Sequential)]を用いてC#側に定義して
やりとりするという事ですね。
試してみます
21:デフォルトの名無しさん
10/04/25 20:06:11
【初心者歓迎】C/C++室 から誘導されてきました。
Form1とForm2があり、Form1からForm2を呼び出すようにしています。
また、Form2に配置したボタンを押すと関数が呼び出されて、所望の処理をするようにしています。
以下の2点について教えてください。
1.関数内の処理の進捗をForm2内のLabelやProgressBarに表示したいです。
2.Form2からForm1を操作したい(Form2のボタンを押すとForm1/Form2ともに終了するようにしたい)です。
両方ともポインタを使えば出来そうな気がするのですが、例えば2.の方ではForm2を指すポインタの宣言の仕方が
わからないです。
よろしくお願いします。
22:デフォルトの名無しさん
10/04/25 20:24:49
>>21
ポインタじゃなくて参照になる。
Form2^ form2;
23:デフォルトの名無しさん
10/04/25 20:26:28
>>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:21
10/04/25 23:09:54
>>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:デフォルトの名無しさん
10/04/27 01:31:54
なんでこういう意味での初心者が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:デフォルトの名無しさん
10/06/07 09:58:49
C++/CLIだと、Cのランタイム例外のハンドリングが出来ない臭いんだけど、どうすれば良いんだろう…
ハンドラ設定してるのに動いてくれない
例えば_tcsftime(..., L"%h", ...);みたいなやつ
※普通の例外じゃないんで、マネージand/orネイティブでもtry catch出来ない
27:デフォルトの名無しさん
10/06/09 20:43:17
そもそも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:デフォルトの名無しさん
10/06/10 10:35:20
>>27
つ URLリンク(msdn.microsoft.com)(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:デフォルトの名無しさん
10/06/10 13:07:44
ハンドラ設定ってなんだ普通に_set_invalid_parameter_handlerで呼んでくれたが
30:デフォルトの名無しさん
10/06/14 22:16:23
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:デフォルトの名無しさん
10/06/26 12:09:02
マネージクラスのインスタンスをグローバルスコープっぽく参照する方法ないの?
全コンストラクタでやりとりするようなマンドクセ方法がいやだ
32:デフォルトの名無しさん
10/06/26 15:55:49
クラスの静的メンバに入れとけばいいだけ
33:デフォルトの名無しさん
10/06/27 16:28:42
あと public static ね
34:デフォルトの名無しさん
10/08/05 23:46:40
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:デフォルトの名無しさん
10/08/06 00:53:22
CLI配列はポインタじゃないから無理
36:デフォルトの名無しさん
10/08/06 10:21:40
pin_ptr してもいいけどさ、www[i] で駄目な理由は何なの?
37:デフォルトの名無しさん
10/08/07 08:14:59
C++の感覚なら毎回[i+a]としないで最初からオフセット付けときたいのは当然だろ
無理なので常にwwwとiをセットにして持ちまわるのが普通
メソッドの引数にもオフセットを指定できるようにする
38:デフォルトの名無しさん
10/08/07 22:43:16
perlのように return a, b できるようにしてくんないかな
39:デフォルトの名無しさん
10/08/08 12:07:55
.NET4ではTuple型自体は導入されたのでC#やVBでは将来的に
言語レベルでサポートされる可能性はある。
C++/CLIはほぼ見捨てられてるので期待するだけ無駄。
40:デフォルトの名無しさん
10/08/17 21:49:08
>>34
array<char>^ www = gcnew array<char>(100);
interior_ptr<char> ptr;
ptr = &www[0] + i;
41:デフォルトの名無しさん
10/08/21 06:53:22
VC2010 EEを使用しています。
RS-232Cで通信を行い、プログラムを終了させようとして
this->Close();
を行うと、エラーメッセージも出ないままプログラムが固まってしまいます。
ポートを閉じてないことが原因かと思い、
serialPort1->Close();
を実行してみたところ、今度はここで同じように固まってしまいました。
URLリンク(vsug.jp)
を、参考に、BeginInvokeを使用していますが、ダメでした。
この場合、どこを見れば良いのでしょうか?
よろしくお願いします。
42:デフォルトの名無しさん
10/09/18 16:16:15
画像処理を行いたいのですが、
Bitmap、Image、Graphic・・・どのコンポーネントを使うのがお得なのでしょうか
43:デフォルトの名無しさん
10/09/18 16:36:42
>>42
どんな画像処理をするかが分からないと、
えらべないと思われます
44:42
10/09/18 16:48:33
カラー画像をモノクロにしたり、コントラストかけたり、拡大縮小したりの初歩的なことがしたいです。
あと、今のところはCUIで行いたいです。
45:デフォルトの名無しさん
10/09/18 18:01:22
>>44
俺はあまり詳しくないが、
ぐぐると
URLリンク(msdn.microsoft.com)
ここで
Bitmap クラスを利用することにより、画像に対してピクセル単位で様々な処理を行うことができます
と書いてある
.netのクラスを使うなら、おそらくやりたいことはこういうことだろう
46:デフォルトの名無しさん
10/09/18 23:40:29
Bitmap使ってみたけれど、画像の保存の仕方がわからない・・・
WriteBitmap("C:\\・・・",data)とかdata.Save(・・・)ってな感じでできないのかな
47:デフォルトの名無しさん
10/09/18 23:43:33
普通にSaveメソッドあるだろ
48:デフォルトの名無しさん
10/09/19 05:14:50
ホントだ。ごめん、見逃してたわ。
49:デフォルトの名無しさん
10/09/20 03:53:30
なぜ下記のようなプログラムでエラーが発生するのかわかりますか??
--- プログラム ---
#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:デフォルトの名無しさん
10/09/20 07:25:44
>>49
test.jpegはちゃんとプロジェクトファイルと同じ階層にある?
余計なお世話かも知れないが、.netでやるなら
C#で作ったほうが楽なんじゃないだろうか・・・
わざわざマイナーな環境で挑戦するよりもいいと思うんだが
51:デフォルトの名無しさん
10/09/20 08:08:59
>>49
落ちてる場所は、その上の行だぞ。
52:デフォルトの名無しさん
10/09/20 11:32:08
これだけ利用者に嫌われてる言語も珍しいな
初心者が質問するたびに使うなと勧められる
53:デフォルトの名無しさん
10/09/20 13:44:55
>>50-51
ありがとう。jpegじゃなくてjpgだったという凡ミスしていたことに気づけたわ
・・・一度C#に浮気してみる
54:デフォルトの名無しさん
10/09/20 13:53:46
>>52
嫌われているというか、言語自体が初心者お断りだからな
初心者が無謀なことしようとしていたら、そりゃ止めるだろう
55:デフォルトの名無しさん
10/09/20 14:01:21
C++も.NETも使いこなせる人が、止むを得ず使うための物。
使わなくていいなら使いたくない。
56:デフォルトの名無しさん
10/09/20 15:01:38
始めようにも資料が無さ過ぎる
MDI作るときどうするかとか
ちょっとしたことの逆引きがネット上で全く出てこない
ようやくOpenGL表示できるようになって
C++の頃の遺産をつかえると思ったのに
57:デフォルトの名無しさん
10/09/20 16:33:26
C#でできるから、それを参照にすればいい
なにもかもC++/CLIで済ませようとしないことをお勧めする
58:デフォルトの名無しさん
10/09/21 02:27:48
嫌ってはいないんだ
ただ何故かこの言語とのファーストコンタクトというか接し方が
一言入れておかないと不幸にしかならなそうな人が多いのよね
59:デフォルトの名無しさん
10/09/21 09:55:56
WinFormsデザイナとかC++/CLIにそもそも要らないんだよな
こういうのがあるから「Visual C++ 2008 で簡単GUIプログラミング」みたいな勘違い本やサイトが出て初心者が道を間違える
60:デフォルトの名無しさん
10/09/21 23:18:00
56ですが自分
C++の文法がある程度使えて
フォームデザインが総合開発環境上で扱えて
至れり尽くせりじゃん、と思ってとっかかりました
現実は情報が全く無く
よくわからないクラスとかいっぱいあって
解説も無くて
どうしようと途方にくれていましたが、QTとかよりは
導入コストも再勉強のコストも無いだろうと信じて使ってます。
だって、CやC++だとGUI作るの辛いんだもん
っていう理由だとダメですか
61:デフォルトの名無しさん
10/09/21 23:32:23
まあ正直C++の名前が付いてるだけで
マネージ部分はC++とは直接関係なくて学び直し必要だし
それなら素直にC#
C#2.0の範囲までなら多分C++/CLIより簡単だし
サンプルも多いし将来WPF/Silverlightとかにも応用できるし
C#やっとけば逆にC++/CLIを橋渡し用ぐらいなら書けるようになるし
62:デフォルトの名無しさん
10/09/27 13:44:31
けっきょくC++風に文法を汚したC#と普通のC++を無理矢理くっつけただけの代物だからな
63:デフォルトの名無しさん
10/09/27 14:03:20
>>62
それを一応形にできたところは評価できる。
64:デフォルトの名無しさん
10/09/27 19:28:25
#define健在なり
65:デフォルトの名無しさん
10/09/27 19:37:10
#define private public
66:デフォルトの名無しさん
10/09/28 02:31:06
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:デフォルトの名無しさん
10/09/28 02:40:23
marshal_asとかじゃねえの
68:デフォルトの名無しさん
10/09/28 02:51:50
> LPVOIDからarray<String^>^に変換したい
> lpBuf=Environment::GetCommandLineArgs();//コマンドラインから取得//ここでエラー
コードの方はarray<String^>^からLPVOIDに変換したいように見える
69:デフォルトの名無しさん
10/09/28 03:19:27
>>67
2008 Express Editionを使っていまして・・・ヘッダーがないらしいです。
URLリンク(www.codeguru.com)
>>68
コマンドライン引数を得た後、array<String^>^に変換しようと思ったのです。
宣言時からarray<String^>^だとMapViewOfFileでつまずいちゃうので・・・。
どちらにせよ、コマンドライン引数を得た後、
共有メモリarray<String^>^として反映できればいいのですが。
70:デフォルトの名無しさん
10/09/28 03:50:07
全体にコードが滅茶苦茶に見えるし
そもそもLoadイベントなんかでやる処理には見えないけど(mainでやることだろ)
共有メモリにString^を書き込みたいのなら
> URLリンク(www.codeguru.com)
のリンク先にString^をポインタに変換する方法が載ってるからmemcpyなりなんなりすればいい
複数の文字列を書き込む必要があるなら\0なりなんなりで区切る
71:デフォルトの名無しさん
10/09/29 06:10:09
共有メモリをやめてSendMessageに妥協しました
とにかく二重起動時にコマンドライン引数を渡すことができました!
皆様、貴重なアドバイスをありがとねん
72:デフォルトの名無しさん
10/10/03 12:39:42
C++/CLIにおけるsafe_cast,static_cast,dynamic_castの違いについて教えてくださいよ
safe_cast :型が合わないと例外が発生、実行コスト中
dynamic_cast:型が合わないとNULLを返す、実行コスト大
static_cast :型が合わなくても何もしない、実行コスト小
この認識であってますか?
73:デフォルトの名無しさん
10/10/03 16:11:05
safe_castとdynamic_castのコストはほぼ同じ。
static_castが速くなるのはダウンキャストの場合だけ。静的に解決できる場合はsafe_castと同じ。
74:デフォルトの名無しさん
10/10/03 20:39:28
>>66
いまさらだけど、.NET Framework 4以降ならMemoryMappedFileクラスを使えばいいと思うよ。
75:デフォルトの名無しさん
10/10/03 20:52:42
.NETのハンドルのダウンキャストにstatic_cast使うのは激しく疑問
公式の説明でもパフォーマンスをえらく強調してるが、
そのためにわざわざ検証不能コードにしてまでやるほどのものなのかと
76:デフォルトの名無しさん
10/10/08 20:22:23
URLリンク(www.infoq.com)
>どうやらそれらは、レガシC++アプリケーションをWindows Phoneに移植したいと考えている多くの開発者にとって、C++/CLIは、ベストなルートに見えるのであろう。
地獄への道は善意で舗装されている
77:デフォルトの名無しさん
10/10/08 20:28:08
筆者自身は否定的に見えるけど、まだそんなこと考えてる人もいるんだねぇ
78:デフォルトの名無しさん
10/10/08 20:52:06
筆者ほんとにC++/CLI触ったことあるのかな
Silverlightで使える範囲のC++/CLIはC++とは全く互換性なくてただの汚いC#なんだけど
79:デフォルトの名無しさん
10/10/08 21:47:31
絶対的処理性能が必要な場合か、過去資産使う時以外はメリットよな?
80:デフォルトの名無しさん
10/10/08 22:05:21
検証可能なコードしか使えない場合は処理性能同じだし過去資産も使えないよ
81:デフォルトの名無しさん
10/10/09 21:36:15
音の再生ってC++/CLIでできるの?
画像の場合ピクチャボックスみたいな感じに楽に音楽再生させたいのだけど
82:デフォルトの名無しさん
10/10/10 23:03:16
ネイティブのC++でできるなら同じ方法でできる
.NET使ってもできる
どちらにしてもC++/CLIとは直接関係ない話
83:デフォルトの名無しさん
10/10/11 00:46:33
サンクス
これ絶対初心者向けじゃない気がする
84:デフォルトの名無しさん
10/10/11 00:49:57
「気がする」ではない。
絶対初心者向けではない、その通りだ。
85:デフォルトの名無しさん
10/10/11 06:02:46
ですよね
俺みたいな勘違い君が集まるから
スレタイ変えると平和になる気がする
86:デフォルトの名無しさん
10/10/11 11:40:19
「C#でアプリを作っているが、C++のライブラリで音を鳴らしたい」もしくは
「C++(非CLI)でアプリを作っているが、.NETのライブラリを使って音を鳴らしたい」
→そこだけC++/CLIを部分的に使おう
という風に特別な意図を持って言語であって、
>>81のような質問が出てくる時点でC++/CLIを使うのは間違っている
87:デフォルトの名無しさん
10/10/11 12:08:45
前者はCLIでなくていいだろ
88:デフォルトの名無しさん
10/10/11 13:10:09
そんなに大きなライブラリでなければ>>19方式がベターだな
89:デフォルトの名無しさん
10/10/11 15:50:17
初心者用のC++/CLIじゃなくて
C++/CLIの初心者向けのスレなんだよなw
90:デフォルトの名無しさん
10/10/11 16:27:40
C++/CLI初心者にクラスチェンジできる条件が、
1) C++習得レベル一定以上
2) .NET習得レベル一定以上
だからな
91:デフォルトの名無しさん
10/10/12 02:47:19
C++とC#があった上で補助的に使うもんだからねぇ
みんな言うように初心者が使う物じゃないね。
92:デフォルトの名無しさん
10/10/12 15:18:47
こんなのに熟練したくないわ
どうしても必要なときにちょっと調べてその場が凌げれば充分
93:デフォルトの名無しさん
10/10/12 18:55:47
C++にGCを導入した言語。そう考えれば実用性は高いはず。
94:デフォルトの名無しさん
10/10/12 19:17:34
C++と、GCをサポートした別の言語を混ぜた言語。
アンマネージとマネージの境界は常に意識する必要がある。
95:デフォルトの名無しさん
10/10/12 20:52:46
仕事では使いたくないが、趣味でいじるのなら楽しい。
Express Editionだと実行中のプロセスにアタッチできるのが
C++しかないってのも使ってる理由のひとつ。
96:デフォルトの名無しさん
10/10/27 21:11:21
日経のムックでC++/CLIが宣伝されてるな。
簡単GUIプログラミング!みたいな見事な勘違い記事だった。騙されて道を誤る初心者が不憫でならない。
97:デフォルトの名無しさん
10/10/30 18:38:53
道を踏み外しそうになり、C++Builderにシフトできました
98:デフォルトの名無しさん
10/10/31 02:19:24
初心者はC#いじっとけ
99:デフォルトの名無しさん
10/11/02 23:54:01
増えた言語仕様って、ref, ^, gcnew だけでしょ?
100:デフォルトの名無しさん
10/11/02 23:59:30
ジェネリック,トラッキング参照,ファイナライザ,プロパティ,イベント,デリゲート, etc
CLI拡張の部分だけでも言語仕様書の量がC#並み
101:デフォルトの名無しさん
10/11/03 00:03:31
2種類の言語が同居してる構造だな。
102:デフォルトの名無しさん
10/11/03 04:25:15
D言語よりマシ。
103:デフォルトの名無しさん
10/11/03 16:45:49
Z言語になるころには
なんとなくこんな感じ、って思い描いたものが
1行で組みあがるくらいに
なるわけねぇ
104:デフォルトの名無しさん
10/11/03 17:28:32
ref classのメンバーに構造体がある場合、その構造体のポインターはどうやって取得すればいいの?
pin_ptr<SCRIPT_STRING_ANALYSIS*> pssa = &(this->構造体型の変数);
こういう風にしてもうまくいかないんだが
105:デフォルトの名無しさん
10/11/03 17:41:24
>>104
自己解決した
単にpin_ptrの型を間違っていただけだった
106:デフォルトの名無しさん
10/11/11 20:14:40
これって変数名とかに全角文字がつかえるのだな。
int 数値 = 0;
みたいに。
うっかり全角アルファベット混ぜたりしたら大変だな。
107:デフォルトの名無しさん
10/11/11 20:26:13
それCLIでない方のC++でもできるよ
コンパイラが共通なんだから
108:デフォルトの名無しさん
10/11/11 22:11:50
>>106
今のパソコンて、ゼロに斜線が入らないから、うっかり
int 数値 = O;
とかしてしまうとやばいぜw
109:デフォルトの名無しさん
10/11/12 04:36:06
どっかでOが定義済みでないと通らないだろ
110:デフォルトの名無しさん
10/11/12 13:04:12
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:デフォルトの名無しさん
10/11/13 12:22:30
queue<array<String^>^ > queue_dwnload;
こう宣言すると
System.ArgumentException' の初回例外が発生しました。
とイミディエイトウィンドウにメッセージが出るんだけど
宣言の仕方どこが間違ってますか?
112:デフォルトの名無しさん
10/11/13 17:42:15
つ STL/CLI
#include <cliext/queue>
using namespace System;
cliext::queue<array<String^>^ > queue_dwnload;
113:デフォルトの名無しさん
10/11/13 18:21:47
すまん書き足りなかった、インクルードはちゃんとしてて
プログラムも正常に動作してます
それでもう少しシンプルなコードで試してみたんだけど
VS2008で新規作成、プロジェクト、CLRのwindowsフォームアプリケーション
のテンプレートでプロジェクトを作成して
#include <cliext/queue>を追加
~Form1(){}の下あたりに
cliext::queue<array<String^>^ > queue_dwnload;を追加
デバッグ実行する
これだけでメッセージが出ます、キューの宣言は間違ってないみたいだけど
何が原因なんだろう?
114:デフォルトの名無しさん
10/11/13 19:06:11
VS2010にしてしまっているので再現できないが、
~Form1()と同じprotectedには出来ないのかコンパイル時に警告がでる。
privateにしたらどう?
private: cliext::queue<array<String^>^ > queue_dwnload;
115:デフォルトの名無しさん
10/11/13 22:52:09
private:付けてもだめでした
116:デフォルトの名無しさん
10/11/14 14:34:28
とりあえず問題の切り分けだな。
まずコンパイルが警告なしで通るかどうか。
通るならデバッグ実行とデバッグなし実行で差があるかどうか。
別のPCでも再現するかどうか。
117:デフォルトの名無しさん
10/12/02 11:27:46
使用環境: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:デフォルトの名無しさん
10/12/02 18:43:31
そもそもref classは定義しない限りコピーとか無理じゃなかったか
119:デフォルトの名無しさん
10/12/02 19:44:11
C#などから使わせるつもりなら演算子のオーバーロードは全部staticにしないといけないし
代入演算子やコピーコンストラクタはそもそもオーバーロードできないし
constも使えないし参照渡しや参照返しもダメ(そもそもref classだから無意味)
つかまずC#やるべき。.NETの常識が無さすぎ。
120:117
10/12/02 22:33:30
>>118
そうなんですか、回答ありがとうござます。
>>119
回答ありがとうございます。
URLリンク(msdn.microsoft.com)(VS.80).aspx
このサンプルコードのコンパイルが通らなかったのですが、そもそもサンプルが間違ってるという事なのでしょうか?
あと、.NETの常識を学ぶのにオススメの書籍などあれば教えていただけると幸いです。
121:デフォルトの名無しさん
10/12/03 11:24:33
Lock に関係ない実装は省略して書いてるだけでしょ
間違ってると言うより、そこは問題とは関係ない部分なだけ
122:117
10/12/03 12:41:30
>>121
回答ありがとうございます。
別途実装をするしか無いという事ですね。分かりました。
そうすると >>119 の回答から考えて、C#などから使わせるつもりが無いなら、
・演算子のオーバーロードはstaticにする必要はない
・代入演算子やコピーコンストラクタはオーバーロードできる
・constも使えて参照渡しや参照返しもOK
ということでしょうか?
123:デフォルトの名無しさん
10/12/03 15:36:41
C++/CLIではref classのメソッドにconstを付けられないから
C#やVBと相互運用しないとしてもconstパラメータは事実上役に立たない。
124:デフォルトの名無しさん
10/12/04 13:39:31
趣旨がわからないね。
C++スタイルでやりたいだけなら、そもそもC++/CLI 使う必要性がないんでない?
125:117
10/12/04 14:33:18
>>123
回答ありがとうございます。
Hoge % operator=( Hoge % arg ) { 代入処理の実装 } ;
これだと代入元が書き換えられそうで気持ち悪いですけど、そういう流儀なのですね。分かりました。
>>124
>>122 の質問に関しては元々あった疑問ではありません。
>>119 の解答に書かれている内容に関しての事実確認です。
趣旨に関してはスレ違いだと思いますので書きません。
126:デフォルトの名無しさん
10/12/04 14:48:36
%もいらん
ref classだから常にポインタ渡し
127:デフォルトの名無しさん
10/12/05 13:03:24
>>124
MSのサンプルだか自動生成されるコードだかで、
あんな風にrefクラス上でC++っぽいことをやっているものを見た覚えがある。
元の質問者のコードもそういうのに影響されたのではないかと思う。
128:デフォルトの名無しさん
10/12/05 14:36:18
private ref struct A{
UInt32 data[5];
};
これがコンパイル通らないんだけど、
array<UInt32>^ data;とかにしていちいちgcnewするしかないんですか?
データ宣言するだけのためにコードなんて書きたくないので、うまい解決法お願いします。
129:デフォルトの名無しさん
10/12/05 15:20:34
うん、array<UInt32>^にしてコンストラクタ書くしかないんではないかなあ。
130:デフォルトの名無しさん
10/12/05 21:27:52
C#では構造体でstackallocが使えるからvalue classならいけるだろうと思ったけど無理なのね
この手の機能でC#に負けてどうする
131:デフォルトの名無しさん
10/12/05 21:36:00
CStringを使うには何をインクルードすればよいの?
atlstr.h、atlbase.h、atlapp.hは入れてるけどコンパイルとまる
132:デフォルトの名無しさん
10/12/06 21:09:33
VC++2010 ExpressEditionです。
System::windows::form::timer で一秒ごとにlabel->textを更新していますが(要は時計です)
最小化から復帰するとlabel->textが更新されなくなります、何故でしょう。
133:デフォルトの名無しさん
10/12/07 22:12:40
最小化したときにとめたタイマーを元に戻すんだキバヤシ
134:デフォルトの名無しさん
10/12/08 00:35:19
そもそもUI用のタイマで時計を作るな
MSDNにもはっきりそう書いてあるだろ
135:デフォルトの名無しさん
10/12/08 00:44:46
>>133
故意に止めるようなことはしていないんですが、そういう仕様なんでしょうか?
136:デフォルトの名無しさん
10/12/08 00:46:00
>>134
えぇぇぇぇぇ。時間分解能が悪いとかあの辺ですか!ヽ(´Д`;)ノアゥ...
スレッドタイマークラスとかに変えます。ご教授ありがとうございます。
137:デフォルトの名無しさん
10/12/08 00:57:53
MS公式のガイドラインかなんかで「System.Windows.Forms.Timerで時計を作らないでください」って無かったっけ?
どこだったか忘れたけど
138:デフォルトの名無しさん
10/12/08 11:59:01
一番使い易いところにあるのに、一番性能悪いとかひでー話だよな
俺も最初使ってみて混乱した
139:デフォルトの名無しさん
10/12/08 14:19:36
使い方も知らずに使うとか・・・
140:デフォルトの名無しさん
10/12/09 00:12:13
VS2005です。
C++/CLIでラップしたネイティブのライブラリから例外が発生して、
C++/CLI側でcatchした時に、
ネイティブ側のインスタンスのデストラクタが呼ばれません。
これはバグと考えて良いのでしょうか?
VC++2010 expressでは普通に呼ばれたので・・
141:デフォルトの名無しさん
10/12/09 03:14:40
>>132です。
あれからいろいろいじりまくっていたんだけど、どうもフォームの透過色(TransparencyKey)が特定の色の場合
この問題が発生しているようです。引き続き調べてみます。
142:140
10/12/10 18:48:44
全く相手にされてないようですが、
解決したので適当に報告しときます。
とりあえず、ネイティブのライブラリオプションを
/EHscから/EHaに変更することで、デストラクタが呼ばれるようになりました。
どうやらオプションの違いでABIに互換性が無くなり、
例外をハンドルできても、その後のアンワインディングを正常に実行できていなかったようです。
デフォルトのオプション設定だと上記のような状態になるので、
自分みたいに知らずに組んでる人はメモリリークし放題ですね。
143:デフォルトの名無しさん
11/01/11 22:48:33
C++/CLIでSystem::Actionって使えないの?
event Action^ Foo;
とやると
エラー1error C2955: 'System::Action' : クラス ジェネリック を使用するには ジェネリック 引数リストが必要です
って出てくる…
144:デフォルトの名無しさん
11/01/11 22:54:33
Action<T>はmscorlib.dllだがそれ以外はSystem.Core.dllだ
145:デフォルトの名無しさん
11/01/11 22:57:47
>>144
ありがとう…
おまえそんなところにいたのか…
146:デフォルトの名無しさん
11/02/05 21:22:18
聞きたいんだけどスレ住人はVC2010でC++/CLI書いてる?
それともインテリセンス使うために2008書いてる?
それともC++/CLI書かない?
147:デフォルトの名無しさん
11/02/05 21:30:17
C++/CLI書かない…けど次の案件がVS2010指定でネイティブDLL呼び出す必要があるから
書かざるを得なくなるかもしれなくてちょっと憂鬱
148:デフォルトの名無しさん
11/02/05 22:28:46
.NET用言語で一番の糞言語だからね>C++/CLI
149:デフォルトの名無しさん
11/02/05 22:49:37
>>148
C++自体が言語として糞だから仕方がない。
それと互換性保ちながらここまで実現したということを考えると、かなりすごいと思う。
150:デフォルトの名無しさん
11/02/05 22:50:52
互換性?ねーよ。
151:デフォルトの名無しさん
11/02/05 22:54:50
>>150
え。それは、今では使うのは好ましくないとされているレガシー関数群をいまだにお使いになられているからではないですか?
152:デフォルトの名無しさん
11/02/06 11:47:30
CとC++に互換性があるとは言わないだろ
CLIの部分については互換性ゼロなんだから
153:デフォルトの名無しさん
11/02/06 11:51:41
>>152
> CとC++に互換性があるとは言わないだろ
それは上位互換ありでしょ。完全ではないけれども。
154:デフォルトの名無しさん
11/02/06 12:50:45
boostを完璧にコンパイルできないだろとか言い始めるのかと思ったら
斜め上をいく馬鹿だったか
155:デフォルトの名無しさん
11/02/08 22:27:38
初心者です。
ストリップメニューを開くと5個ぐらい項があって
3つチェックされているとして、その3という数字を取りたいのですが
どうすれば良いでしょうか?
開く部分の変数はStripMenuItem1です。
for(int = 0;i<StripMenuItem1->項目数;i++){if(StripMenuItem1->子項目->checked == true){temp++;}}
みたいなのはありますでしょうか?どうすれば良いでしょうか?よろしくおねがいします
156:デフォルトの名無しさん
11/02/08 22:55:33
自前で数えろよ、毎回書くのがいやなら関数にしとけ。
157:デフォルトの名無しさん
11/02/08 23:02:04
>>155
StripMenuItem1.Itemsプロパティで子が全て取得できる
言っちゃ悪いけどそういう意味での初心者がC++/CLIなんか使うもんじゃない
先にC#覚えて
158:デフォルトの名無しさん
11/02/08 23:03:11
>>156
レスありがとうございます
申し訳ありません。理解できません
何か関数があるのでしょうか?
自前で数えるといっても、2個チェックのときは2と自動で取ってこれるようにしたいのです。
そういえば
if(項の変数->checked == true){temp++;}
を何行も書けばいいだけですね。ありがとうございました!
159:デフォルトの名無しさん
11/02/08 23:03:52
>>157
ありがとうございました!
160:デフォルトの名無しさん
11/02/08 23:11:25
ときどき勘違いした可哀想な子が紛れ込んでくるな
>>21や>>42はまだC++/CLI使ってるんだろうか
161:デフォルトの名無しさん
11/02/09 00:53:00
次スレでは「初心者用」を消して、
> - C++プログラミング
> - .NETプログラミング (C#, VB.NET, etc.)
>
> に不自由する方はお引き取りください
とか若干きつめに書いておけばいいじゃね?
何年先になるかは分からんけどw
4,5年ぐらい?ww
162:デフォルトの名無しさん
11/02/09 06:13:09
WCHAR f[] = aToolStripMenuItem->Text->ToCharArray();
cli::array<Type,dimension> ^' から 'WCHAR []' に変換できません。
->ToCharArray();でWCHARが帰ると思っていたのですがなぜでしょうか?どうすれば良いですか?
163:デフォルトの名無しさん
11/02/09 06:31:17
そのWCHAR[]をどうしたいかによる
164:デフォルトの名無しさん
11/02/09 06:33:29
>>163
wcscpyしたいです。
というか元々wcscpyの引数に入れるつもりでしたができませんでした。
165:デフォルトの名無しさん
11/02/09 07:06:40
>>163
ちなみに、第二引数にその->TEXTの文を入れて
別に用意した第一引数のWCHAR[3][]とかに入れたいのです
166:デフォルトの名無しさん
11/02/09 07:48:58
>>161
もともとは初心者お断りスレもあったが、話題があまりなくて落ちた
>dat落ち姉妹スレ
>C++/CLI part3
167:デフォルトの名無しさん
11/02/09 09:38:59
このスレでもC++、.NETの初心者は対象外だけどな
168:デフォルトの名無しさん
11/02/09 11:16:29
>162
文字列操作はこれがひっかかったぞ
URLリンク(vene.wankuma.com)
169:デフォルトの名無しさん
11/02/09 11:18:17
>>168
サンクス
おせーよ
170:デフォルトの名無しさん
11/02/09 15:36:36
C++と.NETの両方を極めないとCLIは使いこなせないからな
171:デフォルトの名無しさん
11/02/12 16:44:50
Express EditionでもC#プロジェクトと同じソリューションに入れられればいいのになあ
VCのExpress Editionが入門者向けというより達人の縛りプレイ用になってるじゃないか
172:デフォルトの名無しさん
11/02/12 17:53:40
CLI使わないという選択肢はないのかw
173:デフォルトの名無しさん
11/02/12 18:35:17
そんな選択肢があったらこのスレにいない
174:デフォルトの名無しさん
11/02/13 04:23:39
>>171
金払え
175:デフォルトの名無しさん
11/02/18 09:47:29
ダイアログで値を入力させて、その値を親ウィンドウで処理したい場合に
どうやって値の受け渡しをすればいいの?
親にpublic関数を用意して呼び出すのが簡単なわけだけど
この.hファイルに親の.hファイルをインクルードすると子のデザイナが壊れる
子ダイアログで親の形を認識させる手段がない
176:デフォルトの名無しさん
11/02/18 10:00:22
子のプロパティを公開して親からアクセスすればいいんじゃねえの?
177:デフォルトの名無しさん
11/02/18 16:30:00
比較関数を書く形式で、リスト(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:デフォルトの名無しさん
11/02/18 17:09:32
試してないけど、static にして Test::less じゃね?
179:デフォルトの名無しさん
11/02/18 17:41:53
レスありがとうございます
Form1クラスの上で定義したらできました
いまいちよくわからないですが
これからじっくり理由を考えて見たいと思います、感謝
180:デフォルトの名無しさん
11/02/20 21:49:54.49
VC++のスレでこちらの方がふさわしいのではないかと言うことで移ってきました。
VC++2010 Expressでフォームからマウスが外れているときはフォームの透明度を
あげる(薄くする)と言うプログラムを組んでいます。フォームのMouseLeaveイベントと、
MouseEnterイベント発生時にOpacityプロパティを変えることで実現を目論んだのです
が、ウインドウの外枠(サイズを変えるときにドラッグする部分や、上部のウインドウ名
が書かれている部分)にマウスがあると、MouseLeaveイベントが発生して、薄くなって
しまいます。もちろん、ここではたとえ、フォーム外側から移動してきてもMouseEnter
イベントは起きません。
フォームから完全にマウスカーソルがそれた時のみ透明度を高めたいのですが、
どういうイベントを用いればよいんでしょうか?
181:デフォルトの名無しさん
11/02/21 01:14:11.85
で、その質問内容のどこがC++/CLIに関係しているんだ?
182:180
11/02/21 07:06:34.79
ってことは、.Net Frameworkのスレ探します。
183:180
11/02/21 07:08:31.22
.net Framework関連のスレって見つからないんですが、どこが適切でしょう。
すみません。
184:デフォルトの名無しさん
11/02/21 07:51:25.56
ふらっとあたりで聞けばいい
185:デフォルトの名無しさん
11/02/26 23:54:49.36
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:デフォルトの名無しさん
11/02/27 02:13:39.66
あるプロセスをオープンしようとしてます
読み取り専用で試したが結果は同じ
CLIとしてコンパイルしたWindowsアプリからOpenProcessを呼び出すとフル権限で開ける
C++としてコンパイルしたコンソールアプリからはOpenProcess読み取り専用でもアクセス拒否される
OSはWindows7 64bit
内部のことは分からないですが、OpenProcessは同じ標準process.h内のものを使ってると思う
少なくともソース上ではそういう記述をしてますがコンパイラが何をしてるかまでは定かじゃないです
大きな違いはコンソールアプリであることですが、それが拒否の原因になるんでしょうか?
187:デフォルトの名無しさん
11/02/27 18:39:56.37
VC2010を使用しています。
テキストボックスに文字が入力され、エンターを押されたら動作する処理を行いたいのですが、
TextChangedイベントに
if(TextBox1->Text->EndsWith("\r\n"))
では、認識出来ないのですが、どのようにすればよろしいのでしょうか?
よろしくお願いします。
188:デフォルトの名無しさん
11/02/27 19:14:15.81
フレームワークの話しはスレ違い
189:デフォルトの名無しさん
11/02/27 19:44:49.91
フレームワークの話はどこですれば良いのでしょうか?
190:デフォルトの名無しさん
11/02/27 19:48:31.21
C#の質問にして、ふらっとC#で聞くといい
191:デフォルトの名無しさん
11/02/28 15:45:27.41
>185
com::ptr で保持して、リリース処理はそっちで対応しちゃあかんの?
192:185
11/02/28 18:59:52.28
>>191
ref classにはcom::ptrはおけない思う
193:デフォルトの名無しさん
11/02/28 19:01:42.54
>>192
すまん。
CComPtrと勘違いしてた
com:ptrはCLRでも使えるのか
194:デフォルトの名無しさん
11/02/28 19:28:37.85
>193
それ用のクラスだぜ
あとは .net Framework の System::Runtime::InteropServices::SafeHandle を実装したら?
195:デフォルトの名無しさん
11/02/28 20:58:29.72
DirectXのリソースの解放にSafeHandleは使えないんじゃなかったっけ
最近のは知らんけど
196:デフォルトの名無しさん
11/02/28 23:42:18.77
>187
KeyPress
197:デフォルトの名無しさん
11/03/01 00:17:52.54
>195
詳しく
198:デフォルトの名無しさん
11/03/01 01:40:02.26
Direct3D自体の作成/解放が1スレッドに限定されるのに対し
ファイナライザスレッドでどーのこーのみたいな話だったか
使えないというか使う意味がない、みたいな
199:デフォルトの名無しさん
11/03/10 18:48:24.24
printfとか普通に書いたとき、
なんでprintfがアンマネージのコードって
コンパイラは理解できるの?
それらしい印になるようなキーワードを
特に書いてないような気がするのだが?
200:デフォルトの名無しさん
11/03/10 18:56:54.84
内部的には #pragma managed や unmanaged 指定がされてんじゃね?
#include か #using かで切り分けてるんだと思うけど
201:デフォルトの名無しさん
11/03/15 00:19:49.85
失礼します。
Form1からForm2を開き、Form2を表示した状態でForm1のテキストボックスにフォーカスを合わせたいのですが、何か良い方法はありますでしょうか?
Form2のShownイベントで、Form1->TextBox1->Forcus();を実行してみましたが、Form1が見つかりませんでした。
よろしくお願いします。
202:デフォルトの名無しさん
11/03/15 14:20:33.94
見つかりませんでしたじゃなくて
見つかる様にするんだよ。
作成時にインスタンス渡すとか、間を取り持つ作るとか
203:201
11/03/23 22:44:49.12
URLリンク(imagingsolution.blog107.fc2.com)
ここを参考に、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:デフォルトの名無しさん
11/03/24 02:14:35.75
本当にForm2はグローバル名前空間なのか?
とりあえずヒントだけ出したけど、C++、.NET、プログラミングの基礎にあたる内容はスレチだから返答は不要
というか、C++/CLIはコンパイル可能なコードすら書けないようなプログラミング初心者が使うものじゃない
205:デフォルトの名無しさん
11/03/24 04:38:21.64
VC++2010&CLIで4.0以前(4.0は含まない)のNETを使う方法はありますか?
MSDNには3.5を利用するには2008SP1を入れろとかありましたが
NETのバージョンごとに入れるのはさすがに無駄すぎるので。
206:デフォルトの名無しさん
11/03/24 11:57:27.41
URLリンク(msdn.microsoft.com)
プロジェクトファイルをテキストエディタで編集しろということらしい
C++/CLIで作った混合アセンブリはCLR2(.NET2.0-3.5)向けにコンパイルすると
CLR4では動作しなくなるので注意
インテリセンスも削られてるのでC++/CLIなら2008で作業するほうがいいよ
207:デフォルトの名無しさん
11/03/24 20:41:15.80
>>206
URLリンク(msdn.microsoft.com)
こちらのページを読んだところ
2010は4.0だけ、2008SP1なら3.5だけなのかと思ってしまったのですが
2008SP1は2.0~3.5まで扱えるんですね
2008を入れることにします
ありがとうございました
208:デフォルトの名無しさん
11/04/01 22:50:53.88
質問です
画面を表示させ、ボタンを押したら表示されている画面をbitmapイメージとして保存(出来れば印刷も)したいのですが、
そういう事は可能なのでしょうか?
サンプルソース等探してみたのですが見つからなくて行き詰ってしまいました。
209:デフォルトの名無しさん
11/04/01 22:54:32.68
C# スクリーンショット でググれ
C#だぞ。C++/CLIじゃないぞ。
210:デフォルトの名無しさん
11/04/01 22:57:17.22
>>209
なるほど、C#で調べれば良かったんですね。。
自身に[Alt]+[Print Screen]を送れば良かったんですね
ありがとうございます
211:デフォルトの名無しさん
11/04/02 12:02:12.18
フォーム上にメニューバーを追加したいんですが
どういうソース書けばいいんでしょうか?
212:デフォルトの名無しさん
11/04/02 12:06:00.79
C# MenuStrip でググれ
C#だぞ。C++/CLIじゃないぞ。
213:デフォルトの名無しさん
11/04/02 12:31:38.06
サンクス
214:デフォルトの名無しさん
11/04/02 17:27:27.97
質問です。
テキストファイルから設定を読み取り、動的にリンクを生成し、別プログラムを起動するランチャーを作っています。
動的にリンクは生成できますが、イベントハンドラに仕込むコールバック関数を動的には生成できないため、
1つのコールバック関数を呼び出しそのなかで起動するプログラムを判断せざるを得ないと考えました。
gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandlerで登録される関数には、
呼び出し元のリンクが引数に渡されるので、cliext::mapで事前に、リンクとコマンドラインの組を格納して判断に用いよう
と考えました。が、リンクのハンドラ( System::Windows::Forms::Label^ )はoperator <が定義されておらず
ソートできないため使用できませんでした。
それではcliext::vectorに、リンクとコマンドラインのcliext::pairを格納しようと思いましたが、どうやらムリみたいです。
実際コンパイルエラーになりました。参考ウェブサイト:
URLリンク(blogs.wankuma.com)
URLリンク(d.hatena.ne.jp)
どうすれば、リンクとコマンドラインの型を管理できるでしょうか。
リンクの型(System::Windows::Forms::LinkLabel)を継承したクラスを定義し、
コマンドラインをメンバ変数として持たせるというのも考えましたがどうも無理やり過ぎる気がします。
何かよい方法はないでしょうか。
215:デフォルトの名無しさん
11/04/02 17:39:23.59
.NETでSTLは使うな
System.Collections.GenericのDictionary<,>使え
というか>>208以降の人はC++/CLIやる前にまずC#やったほうがいい
216:デフォルトの名無しさん
11/04/02 17:45:48.60
>>215
お早い回答ありがとうございます。
> System.Collections.GenericのDictionary<,>使え
どのようなものか、調べてみます。
> というか>>208以降の人はC++/CLIやる前にまずC#やったほうがいい
C++を既に学習しており、基本C++の文法でいける(と私が思う)C++/CLIのほうが新たにC#を学ぶより
よさそうだと考えておりましたが、
今後考えてC#を学ぶことも考えたいと思います。ありがとうございました。
217:デフォルトの名無しさん
11/04/02 17:58:52.75
やったらもう戻ってこないだろう
218:デフォルトの名無しさん
11/04/02 18:01:20.52
コントロールのTagプロパティを使う手もあるけどね
C++/CLIはC++とC#を理解して
その上でもしも両方同時に必要になったときに橋渡しするために嫌々ちょっとだけ使う言語です
219:デフォルトの名無しさん
11/04/02 18:38:49.60
>>218
そんな手もあるのですね。
結局>>214で述べた
> リンクの型(System::Windows::Forms::LinkLabel)を継承したクラスを定義し、
> コマンドラインをメンバ変数として持たせると(略
これで作ってしまいました。今回はこれでいいとして、今後はC#を学んでみたいと思います。
ありがとうございました。
220:デフォルトの名無しさん
11/04/03 17:02:31.86
>>214
手元にあるvs2010では問題なく動いた
221:デフォルトの名無しさん
11/04/03 18:14:41.51
CLIはすぐデザイナが壊れるし
IDEが自動でインデントをぐちゃぐちゃに破壊してくれるので
C++をラップするくらいにしか使わない
222:デフォルトの名無しさん
11/04/03 19:08:09.39
VSの次のバージョンではC++/CLIのWinFormsデザイナは削除したほうがいいと思う
>>219のようなかわいそうな人を生むだけで害悪しかない
223:デフォルトの名無しさん
11/04/03 21:53:39.15
C++もかわいそう
別に「統合」してくれと頼んだわけでもないのに
へんな統合開発環境の下で働かされてる
224:デフォルトの名無しさん
11/04/10 21:32:31.72
繰り返しの多い処理をするとメモリオーバーになってしまいます
どのようにメモリを解放するのですか?
225:デフォルトの名無しさん
11/04/10 21:42:17.88
再現するソース出して
226:デフォルトの名無しさん
11/04/10 21:49:49.30
こういうこと?
URLリンク(www.atmarkit.co.jp)
227:デフォルトの名無しさん
11/04/22 05:33:09.44
C++/CLIのコードをビルドしたアセンブリにアンマネージコードが
含まれてないかチェックする方法って知ってますか?
なぜこういうことを聞くかというとこのクラスライブラリをマネージコードから
使う必要が出てきたためです。
228:デフォルトの名無しさん
11/04/22 10:25:23.73
/clr:pure
229:デフォルトの名無しさん
11/04/22 11:04:57.59
それで分かればいいよねぇ
230:デフォルトの名無しさん
11/04/22 11:11:26.93
意味がわからん
混在アセンブリはマネージコードから使えるけど
セキュリティとか移植性とかでマネージコードしか使えないケースなんだとしたら
まず間違いなく/clr:pureではダメで/clr:safeでないといけない
でも/clr:safeなんて世の中にあるC++/CLIのコードのほとんどがコンパイルできないよw
231:227
11/04/23 09:53:36.44
>>228-230
レスありがとう
> 混在アセンブリはマネージコードから使えるけど
> セキュリティとか移植性とかでマネージコードしか使えないケースなんだとしたら
> まず間違いなく/clr:pureではダメで/clr:safeでないといけない
説明不足でした
とにかくC++/CLIのコードのすべてのパブリックなクラスとメンバに
マネージコードからアクセスできるようにしたいんです
アンマネージコードが含まれてるとそれができないんじゃないかと思って質問しました
232:デフォルトの名無しさん
11/04/23 11:45:11.72
アンマネージコードは含まれててもいい
というかそのためのC++/CLI
233:デフォルトの名無しさん
11/04/23 12:23:54.63
何を持って出来ないと思ったかがポイントかな。
とりあえず動くコードを張っとこう。
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:デフォルトの名無しさん
11/04/23 12:31:41.38
clrをマネージだけで使うとかかなりマゾい人だな
235:デフォルトの名無しさん
11/04/23 14:15:04.04
そんな有り得ないというか無意味な使い方を想定するのは不毛だし
C++/CLIみたら混在しているものと見なせばいいよ
236:227
11/04/23 18:24:35.15
>>232-235
レスありがとう
アンマネージが含まれてもマネージから呼び出せるということだけど
C++/CLIのソースコードで画像処理とかやってて、
例えばビットマップの構造体をnewして先頭からのバイト数でアクセスするとか、
その情報を渡してWin32APIを呼ぶとかしまくってるんだけど、
これってアンマネージにコンパイルされるよね。
こんなメソッドをC#から呼んでまともに動作するんだろうかって心配なんです。
237:デフォルトの名無しさん
11/04/23 19:13:47.90
やっぱり、Managed Unmanagedの意味を取り違えてたか。
その程度ならManagedでコンパイルされてるよ。ただしunsafeだけどね。
238:227
11/04/24 11:33:12.50
>>237
マネージだけど暗黙的にunsafeとしてコンパイルされるから
アンマネージのように構造体やポインタが使えるってことか。
納得した。ありがとう。
239:デフォルトの名無しさん
11/04/24 19:03:40.58
文字列を逆順にするプログラムを書こうとした場合、自分で考えると以下のようになりました。
---------------------------
#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:デフォルトの名無しさん
11/04/24 19:23:40.94
スレ違い
241:239
11/04/24 19:27:37.31
すみません
242:デフォルトの名無しさん
11/04/24 19:43:51.75
このスレ的にはこういう回答になる(笑
// 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:デフォルトの名無しさん
11/04/24 20:55:50.28
WCHAR [32]' から 'System::Object ^' に変換できません
というエラーがでた場合、どういう変換処理をかいたらいいんでしょうか??
244:デフォルトの名無しさん
11/04/24 21:08:28.84
System::Object^ v_obj = gcnew System::String(v_wchar);
245:デフォルトの名無しさん
11/04/24 22:09:06.50
たぶんこれかな
msclr::interop::marshal_as
246:デフォルトの名無しさん
11/04/24 22:36:22.37
>244
ありがとうございました。その逆の変換はどうするんでしょうか?
247:デフォルトの名無しさん
11/04/24 23:47:43.19
>>242
今時サロゲートペアすら考えないコーディングは絶滅すべき
248:デフォルトの名無しさん
11/04/25 04:59:47.67
>>246
URLリンク(msdn.microsoft.com)
249:デフォルトの名無しさん
11/04/27 16:00:21.03
>>247
サロゲートペア対応に挑戦しようと思うのだが、VS2010expressのコンパイラでエラーになる。
なんかスマートな対応方法ないすか?
literal String^ str = L"「叱る」と「\uD842\uDF9Fる」";
error C3850: '\uD842': ユニバーサル文字名が無効な文字を指定しています。
error C3850: '\uDF9F': ユニバーサル文字名が無効な文字を指定しています。
250:デフォルトの名無しさん
11/04/27 21:36:58.89
>>249
ググると𠮟るのユニコードは「20B9F」となってるけど。
251:デフォルトの名無しさん
11/04/27 21:40:24.11
textBoxに入力した文字を分割して配列に割り当てる方法がわかりません
252:デフォルトの名無しさん
11/04/27 22:11:33.08
C# 文字列 分割 でググれ
C#だぞ。C++/CLIじゃないぞ。
253:デフォルトの名無しさん
11/04/27 23:46:28.19
>>249
\uxxxxじゃなくて\UxxxxxxxxでUTF-32使って指定するとか?
254:249
11/04/29 10:49:09.60
>>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);
サロゲート対応のコードを書いてみました。
URLリンク(ideone.com)
255:デフォルトの名無しさん
11/04/29 11:04:15.35
string.Concat(
StringInfo.GetTextElementEnumerator(s)
.Cast<string>()
.Reverse()
.ToArray()
)
でええやん(めんどくさいからC#)
256:デフォルトの名無しさん
11/04/29 12:57:21.31
サロゲートと聞くと松田聖子を思い出す
257:デフォルトの名無しさん
11/04/29 13:17:08.71
.GetTextElementEnumeratorの戻値はIEnumerableじゃくて
IEnumertorだから直接Linqにつなげない。
258:デフォルトの名無しさん
11/04/30 13:14:38.20
文字をシフトJISに変換する方法
259:デフォルトの名無しさん
11/04/30 13:32:03.61
一行で様々な疑問を出させる才能
260:デフォルトの名無しさん
11/05/14 13:44:13.14
C++/CLIの具体的な難点ってなんでしょうか?
少し触ってみたところ、GUIも作り易い感じがするしCライブラリも簡単に使えそうだし、
いったいどういう問題があるのかなと気になりました
(VC++2008EEなのでintellisenseもとりあえず大丈夫です)
261:デフォルトの名無しさん
11/05/14 21:00:19.76
C#やVBと比較して生産性が遥かに劣る
それだけ
262:デフォルトの名無しさん
11/05/14 21:23:06.33
>>261
できればもうちょっと具体的にお願いします
263:デフォルトの名無しさん
11/05/14 21:55:07.50
・C++言語ではなくではなくてC++/CLI言語であること、
C++/CLI独特の文法を覚える必要がある。C#との互換性もない。
・使う人が少ないので情報が少ない
・Intelisenceの不具合が多い(例え2010でも逃れられない)
・中途半端にネイティブなのでCLRとしての最適化も中途半端。
264:デフォルトの名無しさん
11/05/14 22:05:31.03
Cのライブラリ使うにしても、DllImportの手間を差し引いてもよっぽどでなきゃC#の方が楽なんだよね
265:260
11/05/15 19:08:05.61
どうもありがとうございます
Visual C#を試しに入れてみたところ、
何だこれは…ひょっとしてC++/CLIだけでなくVisual C++自体が手抜き…?と思ってしまいました
これだとたしかに生産性に差が出るかもと思うと同時にMSの露骨な贔屓に少し閉口してしまいました
まだほんの入口ですしCライブラリについて不安はありますが、とりあえず使ってみようと思います
266:デフォルトの名無しさん
11/05/15 23:25:23.90
VC++はネイティブC++の開発環境としては現在最高だろ
言語そのものがインテリセンスやRADに向いてない
C++にはC++にしかできないことをやらせるとMSは言ってるので
フォームデザイナを使うような用途へのサポートが強化されるようなことは今後も期待できない
C++はネイティブ特化、C++/CLIは橋渡し専用
267:デフォルトの名無しさん
11/05/16 00:10:28.27
まだVS2010のC++/CLIのインテリセンスないのか
この分だともうずっと出ないだろうな
268:デフォルトの名無しさん
11/05/16 09:33:24.32
2010で外されたってことは、MSは諦めたってことなじゃないの?
269:デフォルトの名無しさん
11/05/16 10:32:51.80
いや、次のバージョンでは復活させるって言ってる。
問題は「次」というのがSP2なのかVS2014とかになるのかが分からないこと。
270:デフォルトの名無しさん
11/05/16 10:37:08.05
その前にC++/CLI自体が…
今やMSにとってはATLでCOM触るラッパーを書くためだけの言語だからなあ
271:デフォルトの名無しさん
11/05/24 01:29:53.63
/*********************************/
/* __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:デフォルトの名無しさん
11/05/24 21:38:05.21
だがその処理の呼び出し元でcatchしたかった時はどうする?
C++なら自分で再throwする必要があるが、
finallyを使えばそういうことを考える必要がない。
ついでに言うと、finallyブロックは
例外が起きようとも起きなかろうとも、
breakやreturnで抜けても必ず実行されるので
ファイルの閉じ忘れなどを回避する実に有効な手段である。
273:デフォルトの名無しさん
11/05/24 23:17:43.72
スタック割当構文じゃだめなの。
274:デフォルトの名無しさん
11/05/25 23:31:46.12
>>273
だいたいそれで間に合うとは思う。
auto_handleやauto_gcrootの助けもあるしな。
まあ、今までのVisual C++にも__finallyあるし、C#にもfinallyあるし、
あえてC++/CLIに__finallyを搭載しない理由もないと言ったところでは?
275:デフォルトの名無しさん
11/05/26 01:03:44.37
使ったオブジェクトのデストラクタ呼ぶだけでいいケースは確かに多いけどそうじゃないときもあるだろ
その場限りのちょっとした後処理のためにもいちいちクラス作るの?
276:デフォルトの名無しさん
11/05/26 05:07:03.51
超初心者です。
教えてほしいのですが、
hoge(int *piyo)は
hoge(int^ piyo)と
してるのですが
hoge(int **piyo)は
どのように書き換えれば良いのでしょうか
すいませんが教えてください
277:デフォルトの名無しさん
11/05/26 12:12:03.85
array<int^>^ piyo とか?
278:デフォルトの名無しさん
11/05/26 20:22:59.15
/* 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:デフォルトの名無しさん
11/05/26 20:26:26.71
このコンパイルエラーになる
System::Collections::Hashtable ^^ppHashtable1;
って何とかならんかいな。多重ループで毎回dynamic_cast演算子使ってる
と効率悪いだろうし。
280:デフォルトの名無しさん
11/05/26 20:45:23.45
delete [] ppc1; を忘れとった。
それと、ppHashtable1 = gcnew Hashtable ^[nmax];
の行も 「// コンパイルエラー」を忘れ取った。
281:デフォルトの名無しさん
11/05/27 01:02:41.42
なんていうか、C++ のことは忘れた方が良いよ
282:デフォルトの名無しさん
11/05/27 03:30:26.71
/* 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:デフォルトの名無しさん
11/05/27 03:33:53.23
間違えた
pHashtable1 = dynamic_cast<Hashtable ^>(pArrayList1[n1]);
の行は間違いで正しくは
pHashtable1 = dynamic_cast<Hashtable ^>(pIEnumerator1->Current);
だった。
284:デフォルトの名無しさん
11/05/27 04:48:38.33
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:276
11/05/27 05:15:05.02
中途半端な質問をしてすいませんでした。
>>277さんレスありがとうございました。
実はDirectXのBaseClassesをCLIで書いてるのですが
GetSyncSource( [Out]IReferenceClock** pClock) ;
(IReferenceClockはmanagedインターフェイスです)
の部分をどう書けば良いかわからないです。
interior_ptrというのを使えと出てきますが、使い方がよくわかりません。
どう書けば良いか、どなたかご教示ください。
286:デフォルトの名無しさん
11/05/27 05:52:09.46
静的配列も作成できないのか。これもエラーになるのか。
typedef System::Collections::Hashtable ^pHashtable;
pHashtable pHashtable_hairetu[8];
マネージなクラスというのはどうしようもないな、困ったもんだ。
287:デフォルトの名無しさん
11/05/27 06:13:49.43
これもエラーになるのか。
やっぱり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:デフォルトの名無しさん
11/05/27 23:37:00.98
マネージドクラスをネイティブクラスでラップしてから配列に入れるとか・・
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:デフォルトの名無しさん
11/05/28 06:57:48.67
もうちょっと改良
#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:276
11/05/28 08:14:55.34
すいませんが再度質問さしていただきます
C++で
class Foo{
--色々なメソッドやメンバ--
}
である別のクラスのメソッドで
void Piyo(Foo **hoge);というのがあり
渡す値がFoo* fooとして
Piyo(&foo);とするとします。
これをCLIで実現するにはどのようにすればよいでしょうか
どなたかご教示ください。
291:デフォルトの名無しさん
11/05/29 00:06:15.74
質問の意図が良く分からないけど、こんな感じの回答でいい?
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:デフォルトの名無しさん
11/05/30 12:26:48.80
.NET的には単にreturnで返すのが普通
どうしても参照渡しでやりたいなら
void Piyo([System::Runtime::InteropServices::OutAttribute]Foo^ %hoge)
こう書くのが.NET的には正解
クラスライブラリ作ってるんでなければ好きにすればいいけど
293:276
11/06/01 06:53:05.38
ありがとうございました。
たいへん参考になりました。
294:デフォルトの名無しさん
11/06/01 07:08:44.99
教えてほしいんですが。
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:デフォルトの名無しさん
11/06/01 21:57:49.20
C++/CLIにおけるジェネリックメソッドとテンプレート関数の違いを説明してくださいお願いします
296:デフォルトの名無しさん
11/06/03 21:20:40.48
>>294
全部0
>>>295
テンプレートはただの言葉遊び
ジェネリックは実行時に展開される
DLLを作る場合、アセンブリのパブリックメンバにテンプレートを使ってはいけない
297:デフォルトの名無しさん
11/06/04 14:38:11.46
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:デフォルトの名無しさん
11/06/04 15:04:33.10
本二冊読んでvalue classが出てこないってありえるのか…?
299:デフォルトの名無しさん
11/06/04 15:58:05.32
どういうことですか?structの前にvalueをつけたら混合型はサポートされていませんというエラーがでます
300:デフォルトの名無しさん
11/06/04 17:21:15.05
そりゃ、ref や value をつけたら C++/CLI の管理だからな
通常の C++ のポインタとか持ってちゃ、混合型になるだろ
301:デフォルトの名無しさん
11/06/04 17:47:19.16
>>297
> structから一つ一つ値を完全にC++/CLIで作った構造体に抜き出し、その構造体をC#から読み込む
もちろんこれ
単純に書くだけなら直接C#でも大して手間の差はない
302:デフォルトの名無しさん
11/06/04 18:50:06.15
まじですか・・・
何かものすごい事を期待していました・・・
303:デフォルトの名無しさん
11/06/04 19:05:39.17
ってC++CLI使わなくても直接C#からXinput呼べるんですか?
どうやるんですか?
304:デフォルトの名無しさん
11/06/04 19:19:52.39
PInvoke で渡す構造体はC#側で用意してあげればいい
305:デフォルトの名無しさん
11/06/04 20:30:56.92
ありがとうございます
意味が全く分かりませんがPInvokeを調べてみます
306:デフォルトの名無しさん
11/06/04 20:31:25.24
XInputだったらXNA使えよ
307:294
11/06/05 04:08:13.35
>>296さん
ありがとうございました。
308:294
11/06/07 07:00:08.28
再度質問さしていただきます
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:デフォルトの名無しさん
11/06/07 13:08:48.20
C++/CLIでわざわざマネージ型をP/Invokeに使う意味がわからん。
しかもよりによってなぜ今時DirectDrawなのか。
[StructLayout(LayoutKind::Sequential)]struct MultiSampleCaps { ここは同じでオフセットも不要 }
/*Hogeの中*/[FieldOffset(4)]MultiSampleCaps MultiSampleCaps;
.NET関連で調べ物するときのキーワードはC++/CLIじゃなくてC#ね。
情報量1000倍だから。アホらしいと思ったらC#へどうぞ。
310:デフォルトの名無しさん
11/06/08 20:55:56.86
VC++6.0のMFCなプログラムとVC++2008 Express Edition の.NETなプログラムで
プロセス間通信したいのですがどうすればいいですか。
311:デフォルトの名無しさん
11/06/08 22:03:55.29
WM_COPYDATAとか手軽でいいんじゃないか
312:デフォルトの名無しさん
11/06/08 22:35:11.37
もしくは共有メモリ。DDEでも動くぜ。
313:デフォルトの名無しさん
11/06/22 01:29:30.29
Graphicsをつかって1ドット書きたいのですが方法在りますか?
g->DarwLineだと2ドット最小?
314:デフォルトの名無しさん
11/06/22 06:08:56.94
FillRectangle
315:デフォルトの名無しさん
11/06/22 11:33:33.87
g->FillRectangle(Brushes::White, 0, 0, 1, 1);
できた!
これからc++/cliするのとc#するのどっちがいいですか?
GPGPU & direct Xやるとしたらc++の方向のほうがいい?
316:デフォルトの名無しさん
11/06/22 11:48:19.12
C++かC#の2択、C++/CLIは無い
317:デフォルトの名無しさん
11/06/22 12:42:08.36
ありがと、c++でいく
318:デフォルトの名無しさん
11/06/22 13:44:22.22
GPGPUやDirectXならC++のみじゃね?
C#だとラッパー使うことになるし
まぁ、C++/CLIだけは無いけど
319:デフォルトの名無しさん
11/06/23 10:09:33.25
C++/CLIを使おうとした初心者を思いとどまらせるスレになってるな
320:デフォルトの名無しさん
11/06/23 10:20:17.40
進む先が地獄であることを知らない奴を追い返してやるのは当然だろう
321:デフォルトの名無しさん
11/06/23 10:50:11.25
何も知らないでVisualC++使ってWindowsアプリを作ろうと思うと、
自動的にC++/CLIになるからなー
MSは鬼や
322:デフォルトの名無しさん
11/06/24 00:13:45.93
.NET FrameworkとC++を知ってればどうって事無い
323:デフォルトの名無しさん
11/06/24 00:20:14.62
333
324:デフォルトの名無しさん
11/06/24 06:58:51.76
C++だけよりは、UI作るのは楽。
325:デフォルトの名無しさん
11/06/24 14:45:59.69
C++だとUI作り辛いし、C#だとネイティブじゃないから、
C++/CLIを使えば良いんじゃね?
326:デフォルトの名無しさん
11/06/24 14:52:10.85
こうしてC++/CLIを勘違いした犠牲がまたひとり・・・
327:325
11/06/24 15:04:02.96
と、思っていた時期が俺にもありましたってだけ
MSは頑張って理想通り完成させてくれよう
むしろ諦めたっぽいがw
328:デフォルトの名無しさん
11/06/24 23:04:13.78
正直、むしろ起動速度や処理の即応性とかの GUI こそ C++ でやって、ロジックとかに
.net fw を使うための言語だと思うんだが
329:デフォルトの名無しさん
11/06/26 11:43:42.77
C++とC#を使いこなしたうえで両方を使うために
C++/CLIというならいいけど、両者の利点を
生かすためにいきなりこれ、というのは無理w
330:デフォルトの名無しさん
11/06/27 09:26:00.43
>>328
起動速度や応答性を気にしないなら、C#で十分ってことだな
331:デフォルトの名無しさん
11/06/27 10:22:03.55
いや起動速度はC#と変わらないよ
ネイティブのDLLを読み込む分遅くなることはあっても速くなることはない
それからアンマネージコードとマネージコードの境界を越えるオーバーヘッドは馬鹿にならないので
下手するとマネージコードだけの方が速い
332:デフォルトの名無しさん
11/06/27 10:36:48.76
さらにC++/CLIの存在価値が下がったw
本当にラッパー専用言語だな
333:デフォルトの名無しさん
11/06/27 12:13:07.27
C++にGCを入れろと言う要望への、一つの回答。
D言語も悪いところも見えてくる。
334:デフォルトの名無しさん
11/06/27 15:06:24.73
ラッパーなら別にネイティブでいいんだよなぁ
335:デフォルトの名無しさん
11/06/27 17:47:56.62
C++/CLIがなかったら
どうやってラップするの?
336:デフォルトの名無しさん
11/06/27 18:01:37.46
C#-->C++は簡単だけど、逆は面倒。
337:デフォルトの名無しさん
11/06/27 18:03:44.31
別にスタティックライブラリだろうがC++ライブラリだろうが
なんでもかんでもDLLに包んでP/Invokeでおk
ObjCコンパイラ以上の荒業でラッパーコードが書けるのがC++/CLIの醍醐味だけど
なんか、こう、便利とは違うんだよなあ…
338:デフォルトの名無しさん
11/06/27 18:05:53.91
マネージドで、ポインタを使いまくれる。
339:デフォルトの名無しさん
11/06/27 19:58:57.49
C#でできなくてC++/CLIでなら可能なポインタ関係の操作ってあったっけ?
C#のunsafeの方が簡潔にCっぽく書けて扱いやすい気がするんだが
340:デフォルトの名無しさん
11/06/28 09:14:21.36
C#はMarshal派
C++のUIだけC++/CLIやC#みたいに自動で作ってくれるC++は無い物か
BCBなら出来るけどさ
341:デフォルトの名無しさん
11/06/28 21:35:58.12
BCBでやれば万事解決
342:デフォルトの名無しさん
11/06/29 14:14:27.30
MSからBCB出してくんねーかな
C++/CLIは無かったことにして、買収しちゃえばそれで済むのに
343:デフォルトの名無しさん
11/06/29 23:59:08.75
だからC++/CLIは「WinFormsが使えるC++」なんて生易しいものじゃないと何度言えば
344:デフォルトの名無しさん
11/06/30 07:08:43.64
Windowsは、C++でプログラミングが基本。
345:デフォルトの名無しさん
11/06/30 08:58:03.95
なぜC++は易しいのにC++/CLIは易しくないのか?
みたいな無神経な言い回しが何度も言われていた時期があった。
聞くほうも同じくらい無神経だから何度言っても通じないことは容易に想像できる。
346:デフォルトの名無しさん
11/06/30 09:30:47.84
まあネイティブのC++でGUI作るよりはずっと簡単だけど
C++/CLIでWinForms使うなっていうのは
どうせC#わからないと使えないしC++の経験があってもC#覚えたほうが早いからC#やれってこと
C++の経験があるからC++/CLIがいいだろうと思って始めた初心者が
C#のTIPSサイトですぐ出てくるようなコントロールの使い方を質問してくるとそりゃC#やれと言いたくなる
347:デフォルトの名無しさん
11/06/30 09:58:07.10
>>344
Windowsでの基本はC++だが、
WinFormでの基本はC++じゃない件
348:デフォルトの名無しさん
11/06/30 16:10:30.57
せめてVB並みのインテリセンスを実装してくれ
349:デフォルトの名無しさん
11/06/30 16:29:27.88
2010にインテリセンスのらないの確定か
vNextも最初のバージョンは載らないらしいし
350:デフォルトの名無しさん
11/06/30 23:34:53.54
GUIでUI設計ができてネイティブコードその上爆速コンパイル
Borland時代のDelphiはまさに神言語だったんだなぁと思う
351:デフォルトの名無しさん
11/07/01 00:31:39.48
C#がネイティブコード吐く言語だったとしてもコンパイルは爆速のはずだよ
C++の言語仕様が糞なだけ
352:デフォルトの名無しさん
11/07/01 00:57:16.04
Scalaはコンパイル遅いけど糞なのか?
353:デフォルトの名無しさん
11/07/01 09:30:18.33
C#も多次元配列とか使わなければ速いよ
354:デフォルトの名無しさん
11/07/01 09:37:09.00
Cが速いのは、安全性と裏腹。
355:デフォルトの名無しさん
11/07/01 09:53:59.45
Cでも安全性は確保可能
356:デフォルトの名無しさん
11/07/01 17:08:23.75
理屈では可能でも
現実の大部分のプログラムはそうなってないんだけど
357:デフォルトの名無しさん
11/07/01 20:01:09.19
そうか?
それだと原発事故と飛行機事故と自動車事故と比べて騒いでる連中と同じだぞ
358:デフォルトの名無しさん
11/07/01 21:01:16.07
Cは標準ライブラリが安全性を確保するのが難しい作りになってるだけで、
使うライブラリによっては安全に書ける、気がする
359:デフォルトの名無しさん
11/07/01 21:35:52.26
セキュリティは別にして、.NETはメモリ破壊が起きないのがいい
お前はもう死んでいる的なバグがずっと少ない
360:デフォルトの名無しさん
11/07/01 22:42:12.30
ガベコレは、理論武装とかしなくても安全性が明らかだから好感を持てるんだが、
逆に言うとガベコレ使わなくても明らかに安全な部分はCで書いていい
361:デフォルトの名無しさん
11/07/05 10:04:29.39
C++/CLIはやれば出来る子
計算部分はネイティブで書いて、GUIや描画部分は.NETにやらせることで
高速かつ生産性の高いプログラミングが出来る
・・・と、言う夢だったのさ
362:大天使 ◆uL5esZLBSE
11/07/05 13:17:03.75
>>357
Cは安全性を捨てて速度得てんだよ バカか?
Cに安全性を追加したら
それは劣化C#になるから、下手に自分でかいた甘いコードで安全性をはかるよりも
C#でやるべき
お前はなんか、C++上で劣化C#作って喜んでそうなバカだな
363:デフォルトの名無しさん
11/07/05 15:20:27.62
自演乙
364:デフォルトの名無しさん
11/08/17 15:46:40.55
VS2010で作っちゃったんだけど、VS2008に変換することって出来ます?
インテリセンス無いから入力がめんどくさい・・・
365:デフォルトの名無しさん
11/08/17 21:56:13.11
無理
一応注意しとくと2008でコンパイルした混在アセンブリは.NET4でロードできなくなるよ?
366:デフォルトの名無しさん
11/08/17 22:07:00.37
あとはアドイン購入か。
URLリンク(www.wholetomato.com)
367:デフォルトの名無しさん
11/08/17 23:11:17.61
新規プロジェクトにコードだけ引っ越した方が簡単な気がするけど
368:デフォルトの名無しさん
11/08/18 15:44:09.37
俺もそう思う
projファイル書き替えでなんとかなるけどね
混在はapp.config無理やりつけてやるとか
369:デフォルトの名無しさん
11/08/31 22:00:08.56
プロジェクトをいちいち作るのがめんどくさい…
370:デフォルトの名無しさん
11/09/02 22:58:08.40
MSBuild 用のXMLなんだから、直接修正しろよ
371:デフォルトの名無しさん
11/09/13 13:37:36.74
どうでもいい事だよ C++/CLI で better C なんて
372:デフォルトの名無しさん
11/09/16 11:52:55.12
URLリンク(msdn.microsoft.com)
なんかわけのわからないことになってるぞ
C++/CLI切ってネイティブのC++にC++/CLI風のCOM拡張を入れるらしい
373:デフォルトの名無しさん
11/09/16 13:18:45.29
切るんじゃなくてWinRT API用の拡張。
.net framework用には今まで通りC++/CLIを使う。
374:デフォルトの名無しさん
11/09/16 14:44:53.44
.NETとCOMで共通のAPIを用意して、C++は完全ネイティブでCOM使うっていうのは
C++/CLIに比べれば至極真っ当なやり方だと思う
最初からそうしてくれてれば良かったのに
375:デフォルトの名無しさん
11/09/16 21:24:20.48
>>374
それではプラットホームに依存してしまう。
376:デフォルトの名無しさん
11/09/16 21:42:24.87
C++/CLIってCLI拡張の部分は標準化されてるけど
ネイティブコードとどう結びつけるかは実装依存でしょ
CLIに依存する記述だけ言語仕様から削ればCOMとのバインディングは実装次第ってことで問題ない
377:デフォルトの名無しさん
11/09/19 03:32:40.73
Win32アプリケーションとして作成したプロジェクトで、
作成されたウィンドウに.net framework用のコントロールを
貼ることは可能でしようか?
378:デフォルトの名無しさん
11/09/19 06:50:32.14
つ CWinForm...
URLリンク(msdn.microsoft.com)(v=VS.80).aspx
379:デフォルトの名無しさん
11/09/19 15:35:43.23
>>378
ありがとうございます。
MFCのCViewの派生なんですね。
CView系は使いたくないのでちょっとソースを読んでみます。
380:デフォルトの名無しさん
11/09/19 20:45:06.45
別にソース読まなくても、CWinFormsControl じゃ駄目なの?
381:デフォルトの名無しさん
11/09/20 22:52:53.28
>>380
CWinFormsControl で大丈夫そうですね。
ご指摘ありがとうございます。
382:デフォルトの名無しさん
11/09/26 15:27:11.67
>>362
多分わかってるだろうけど、おかしいよ。
Cは安全性を捨ててなんていない。安全性なんて無かった。
383:デフォルトの名無しさん
11/10/12 15:19:32.05
もともと持ってないものは捨てられないわな
384:デフォルトの名無しさん
11/10/16 23:44:09.15
WebBrowserコントロールにNewWindow2イベントを実装する
URLリンク(main.tinyjoker.net)
これをVC2008でやりたいんですけどどう書けばいいか分かる人いますか・・・
385:デフォルトの名無しさん
11/10/16 23:51:00.77
C++/CLIならほとんど何も違わないが
C++/CLIはC++じゃないけどそれはわかってる?
そんな質問するような人がなんでC++/CLIなんか使うのか正直意味がわからない
素直にC#使うか、C++やりたいんだったらネイティブでATLやMFC使ったほうが
386:デフォルトの名無しさん
11/10/17 13:53:12.58
初心者用といっても、.NETとC++はマスターしてないと。
387:デフォルトの名無しさん
11/10/17 14:51:10.32
>>384は>>385の意味がわかるまで精進しましょう
388:デフォルトの名無しさん
11/10/17 15:51:31.18
むしろ初心者はC++/CLI使うな
389:デフォルトの名無しさん
11/10/29 09:05:13.17
今まで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:デフォルトの名無しさん
11/10/29 09:24:47.38
その前にusing namespace System::Windows::Forms;を入れることを激しくおすすめするw
391:デフォルトの名無しさん
11/10/29 09:30:46.12
どういうことですか?わかりやすく説明してください
392:デフォルトの名無しさん
11/10/29 09:50:02.99
array<System::Windows::Forms::ToolStripMenuItem^>^ じゃないの
っていうかC++/CLIなんかやめてC#やれ
393:デフォルトの名無しさん
11/10/29 09:53:37.07
>>392
ありがとうございます
そこは直しました
this->StripMenuItem1->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(5) {this->AToolStripMenuItem,this->BToolStripMenuItem,this->CToolStripMenuItem・・・}
ここに何を入れていいのかわかりません
C#もやってますがどちらにしろ初心者でわかりませんし・・・
394:デフォルトの名無しさん
11/10/29 10:15:21.39
配列を作ったら次は各要素にToolStripItemのインスタンスを代入する
C#の入門書買って出直してきたら