おつ
3 :
デフォルトの名無しさん:2008/03/26(水) 00:54:20
いらんたせろ
dataGridView等で、選択されてる行を消すって処理を
エレガントに描くにはどうすればいいですか?
今のところ
for( int i = 0 ; i < this->dataGridView->Rows->Count ; ++i )
{
System::Windows::Forms::DataGridViewRow^ row = this->dataGridView->Rows[i];
if( row->Selected )
{
dataGridView->Rows->Remove( row );
i=0;
}
}
です
それって最終的に全部消さないか?
>>5 selectedの時しか消さない(i=0)から問題なし
selectedしてない場合、ループの最後まで行くお
自動選択は?
自動選択って何?
上のコードでとりあえず動いてるから問題ないというか
質問を質問で返さないで
あああ、デフォルトでそんな機能あるやんね
List<Scene^> scenes;
// いろいろ
for each(Scene s in scenes)
{
delete s;
}
何か問題はありますか?
いろいろの最中に例外が投げられたらオワタ\(^o^)/になる。
といってもGCとファイナライザで救済されるから
ネイティブC++のときほど気にかける必要はないかもしれない。
System::Collections::Generics〜のコンテナ郡に
auto_handleは入れられますか?
はい
入れたところで、自分でauto_handleのデストラクタを呼ばない限り、
auto_handleの中身のインスタンスのデストラクタは呼ばれないぞ。
中身のデストラクタはauto_handleのデストラクタ (Dispose)から呼ばれるのだが、
BCLのコレクションは要素のDispose(デストラクタ)を呼ばないため。
意味ね〜
おとなしくGCに従うのだ ははは
STL/CLRのコンテナでも無理なの?
無理。
無理ですかorz
ref class Banana;
List<Banana^> bananas;
for each (Banana^ b in bananas)
{
delete b;
}
Disposableなコンテナつくればいいじゃない
value型でauto_handleみたいの作ろうとしたらデストラクタが定義できなかった。
STLのコンテナだってstd::auto_ptr入れられないしね。
でもさーGCはモノが使われなくなったら消えるんだから。
Vector<boost::shared_ptr<Hoge>>
と一緒じゃね?
25はわかるけど、それと23とのつながりがわからない。
COMにすればよくね?
COMにもリリースのタイミングがあってだな
30 :
デフォルトの名無しさん:2008/04/01(火) 21:59:31
過疎
31 :
デフォルトの名無しさん:2008/04/02(水) 21:46:36
踏んだら孕んだ!
孕んだ振る降る般若だ!
童貞擦る無駄、フン出る春巻きはむ無理!
チン毛ちぎり、看板塗る飛騨!
安眠煮る焼酎!
安打!?半田ゴテ適時打!!
原チャリ盗んだ!
よくちょん切れるハサミだ!
∧__∧ ________
<丶`Д´>/ ̄/ ̄/
( 二二二つ / と)
const参照で受け取ったref classのプロパティって触れないの?
ref struct Foo
{
property int Bar;
static void Hoge(const Foo% foo)
{
foo.Bar;
}
}
error C2662: 'Foo::Bar::get' : 'const Foo' から 'Foo %' へ 'this' ポインタを変換できません。
const外すとコンパイル通ります。
getterちゃんと書いて、 int get() const とかやろうとすると
const 付けんなって怒られるし…
追跡参照の中身が固定されたらGCが起きたとき、追跡できないだろ
単にCLIにconstの概念がないから、
マネージ型にconst使おうと考えるなということ。
35 :
32:2008/04/08(火) 18:12:22
>>33 え?それは Foo * const foo とした場合の話じゃないの?
「中身」っていう言葉が何を指してるのかよくわからないけど…。
C++だったら、そもそも参照自体がポイント先の変更を許さない概念なわけだけど、
CLIで%なんてもの導入したからには、そのへんは宜しくやってるんじゃないの?
const参照はあくまでポイント先のメンバの不変性を宣言するものだと思うんだけど
>>34 CLIでは「このメソッドは引数のメンバフィールドを変更しません」って
明言する事はできないの?
C++常習者としては、それってすげー不安なんですけど…
36 :
デフォルトの名無しさん:2008/04/08(火) 22:10:35
VC++2008のexpressでmsclr/marshal.h が見あたらないんですが、
もしかしてこれStandard以上にしか付いてないんですか?
error C4959: アンマネージ struct 'Microsoft::DirectX::PrivateImplementationDetails::_D3DPRESENT_PARAMETERS_' は、そのメンバへのアクセスによって検証不可能なコードを生成するため、/clr:safe で定義できません
とエラーが出ます。
>>35 というか.NETの参照渡しは呼び出し側に変更してほしい時にしか使わないお約束
^だけだと nullptr渡されない?
そうだよ。それで困るメソッドはArgumentNullExceptionを投げてくる。
モノ渡したら4バイト超えてたら遅くなるんじゃないの?
いや、^のハンドル型の実態はGC追跡付ポインタ。
引数や戻り値でも4/8バイトのアドレス値が受け渡されるだけ(少なくともCLRでは)。
.NET Frameworkのライブラリのクラスに、
コピーコンストラクタや代入演算子が定義されていないのは、
そういうわけで不要だから。
実際、XNAの算術ライブラリなんてガイドラインと逆走してるよ。
45 :
デフォルトの名無しさん:2008/04/14(月) 22:39:17
(一般ゲーム) [050325] [工画堂スタジオ] 蒼い空のネオスフィア -Neosphere of The Deep-blue Sky- (bin+cue).rar
このスレの住人なら知っていますね、あの糞開発ツールのことを
・自分のプログラムのバグなのかコンパイラのバグなのかわからない
・他の仕事に応用できない糞開発ツールの独自世界を必死に学習している
・テキストエディタで書いたほうが効率的なのに糞UIツールを懸命に使っている
・糞開発ツールを批判すると「性格が悪いから糞ツールを批判するんだ」と言われる
糞だけど、政治的な理由で無理やり使わされているんですよね。
もう、あんな厨の作った糞ツールを我慢して使うのはやめましょう。
・糞開発ツールを部下に押し付ける上司の命令は無視しましょう。
上司は糞開発ツールが使われる実績を作ることであの会社のごきげんをとっているのです。
・糞開発ツールを使わせる上司の下では働けません、と上司の上司に直訴しましょう。
・あの糞開発ツール提供会社には「おたくの糞開発ツールは話にならない」と突き放しましょう。
バグレポートなどしてはいけません。改善要求などもってのほかです。
あの会社はあなたたちのことをテスター/モルモットとしか思っていません。
・あの会議で「糞開発ツールを使ったら生産性がxx%アップしました」
なんて話が出たら力強く机を叩き、会議室を出ましょう。
あの人たちは糞開発ツールをマンセーすることで立場を確保しているのです。
糞な開発ツールを糞だと言える、そんな当たり前の環境をみんなの力で取り戻しましょう。
VisualAge のことですね。わかります
48 :
デフォルトの名無しさん:2008/04/20(日) 15:16:43
VisualAge
49 :
デフォルトの名無しさん:2008/05/15(木) 12:45:00
過疎るな
50 :
デフォルトの名無しさん:2008/05/15(木) 15:20:37
C++/CLIの達人になる意味って、ある?
「C++/CLIの達人」⊂「C++の達人」
だから考えるまでもなく意味はあるだろ
C++の達人とはまたベクトルが違うような
53 :
デフォルトの名無しさん:2008/05/15(木) 17:39:28
/ってorの意味じゃないの?
包含関係逆だろ!?
withの意味だよ。
「C++/CLIの達人」=「C++の達人」 ∩「CLIの達人」
「C++/CLIの達人」⊂「C++の達人」
「C++/CLIの達人」⊂「CLIの達人」
下二つ反対だろ(w
57 :
デフォルトの名無しさん:2008/05/17(土) 03:43:38
上も反対
おっぱい!
おっぱい! おっぱい!
おっぱい おっぱい! おっぱい!
おっぱい! ∩ ∩ ノ) おっぱい!
おっぱい! 川 ∩ 川彡'三つ おっぱい!
おっぱい! ⊂ミ∩、⊂ミ∩彡⊃ おっぱい!
おっぱい!⊂三ミ( ゚∀゚)彡三彡三⊃ おっぱい!
おっぱい! ⊂彡川⊂彡川ミ⊃ おっぱい!
おっぱい!⊂彡川∪⊃ U川彡⊃ おっぱい!
おっぱい! (ノ ∪ 川 ∪ミ) おっぱい!
おっぱい! ∪ おっぱい!
おっぱい! おっぱい! おっぱい!
おっぱい! おっぱい!
おっぱい!
C++/CLIの達人ってのが
C++ or CLIの達人だったら、
標準C++だけ知ってる達人とか、CLIのことだけ知ってる達人も
C++/CLIの達人になるけどいいの?
/clr:safe の達人というのがいるとすれば、C++が使えるかどうか怪しいよな。
それじゃ、C#使え、だよな
C++/CLIのメリットってなんだろな。
safeで使いたいならC#だし、でなければC++でいいだろうし。
C++とmanagedのオブジェクトを両方使うのもあまり使い勝手が良くないし。
C++でしか使えない(使いにくい)ライブラリをラップするぐらいしか
C#でusingの嵐に嫌気がさした人にはC++/CLIは悪くない。
だらだらと長い名前空間を書かされるとしてもか?
using namespace書いとけばってのはC#だって一緒だが…。
ひょっとして、名前空間のインポートするときのusingディレクティブの話と、オブジェクトーのスコープを
定義する場合のusingステートメントの話をごっちゃにしてないか?
C++で作ったやつが
簡単?に.Netな画面のアプリで動かせるんだよ
69 :
デフォルトの名無しさん:2008/05/20(火) 16:30:17
printf()とか関数の呼び出しを書いたとき、
それがネイティブなのか違うのか、
コンパイラは、どうやって判断してコードを吐いてるのだ?
C++ではプロトタイプのない関数は呼べない。
>>69 リンク時に解決する。
実際にILからネイティブの呼び出す部分はJITで生成される。
この言語最高!
普通のクラスや関数とrefクラスが混ざったDLLを作るとわけわかめ全開になるよね。
確かに冗談みたいな汚さw
簡単じゃないの?
^
Sizeをいちいち、System::Drawing::Sizeって書くのがめんどくさいんだけど、
どうにかならんの?
なんで型名なのに、メンバのSizeが優先されちゃうの?
namespace dr = System::Drawing;
これでdr::Sizeってできる。
<windows.h>をインクルードして、Windows APIの名前と
.NETクラスライブラリの名前が被るときにも使える。
C# と比較して C++/CLI ってやってる人少いの?
C#とC++の橋渡し以外使う価値無いから、少ないだろ
C#かVBと組み合わせて初めて価値が出る言語だし
俺はCLIがメインw
すいません、WebBrowserで選択中のテキストを取得する方法はありますでしょうか?
WebBrowserやDocumentクラスにないですし、ExecCommandにも該当する方法はないみたいです。
クリップボードにコピーして取得する方法もないではないですが、クリップボードの内容を壊したくないので・・・
selection
createRange
text
>> 83
おれは、全部、C++ or C++/CLI でいいのにって思ってしまう
^
C#のP/Invokeめんどくせ。
この言語って、windows.hインクルードすれば、APIそのまま呼べるようになる?
呼べる
MFC で UI 周り作って、/clr オプションつけて内部で .net fx 使ってるけど、かなり楽
C++0x もいいけど、便利なライブラリフレームワークも重要だと思うんだ
MFCランタイムと.NETランタイムを両方使ってると思うだけで萎えるわ。
使い方が逆だろう
まあCWinFormsControlとかあるくらいだし、
そういう使い方も想定されてはいると思う。
主目的は移行用だろうけど。
CLIでDirectXとか使えんの?
XNA FrameworkはC++/CLIで書かれている
Managed Direct Xはどこにいったよ?
>>89 thanks
本格的に移行しようかな。
罠とかある?
.NET Frameworkがないと動かない。
あと罠ではないが、ハンドルの扱いは
SafeHandle が使いやすいぶんC#のほうが楽だと思う。
C++/CLIで確実にハンドルが解放されるようにするのは
ちょっと面倒なんだよね。
どっかで SafeHandle 使うようにした Win32API の DllImport集
公開されてないかなあ。
>97
ヘッダで定義されたdefineの衝突に注意。後、enum を混在させない
リソースの管理は、マネージドはマネージド、ネイティブはネイティブで管理する
.net fx をライブラリとして使える C++ と言う位置付けを忘れない
こんなところかな
COM の扱いが、com::ptr で済むのが楽だね
100 :
98:2008/05/28(水) 10:16:11
ごめん。やってみたら C++/CLI でも
C# と同じやり方で SafeHandle 使えたわ。
検索してもC#とVBの資料しか出てこないからできないもんだと思ってた。
コールバック関数要求するアンマネージド関数に
delegate 渡すこともできるな。
なんでこういうの紹介してるページがないんだ。
C#のコードばっか載せやがって。
ただし、こういう小技を使おうとすると結局自分で
DllImport書かなきゃいけないので windows.h との親和性は低いけど。
こういうの全部取り込んだ windows.h があればいいのに。
>>98−100
ありがとうございます。
API?STL?NET?
なんでもドンと来い。サクッと受け止めてやる!
って感じの言語みたいだね。
なんでもこいは諸刃の剣なので気をつけないと・・・
>>95 全部C++/CLIじゃなくて,C#を併用してるっぽい
>>100 Marshal.GetFuctionPointerForDelegate使えば、<windows.h>を活かせる。
ただreinterpret_castをしないといけないから、結局ラップしたくなる罠。
C# でできて C++/CLI でできないことは、あんまりない
WPF使えないしたぶんSilverlightも同じだろうね
WPF は普通に使えるだろ
XamlReader 使ってもよし、普通にコードで GUI 使ってもよし
Silverlight だって、アセンブリは C++/CLI の Safe コードで書けるんじゃないかな
試してみるか
あげるならXNAか
>>106 それで使おうと思う?
WPF自体が糞とかいうのは置いといて
WTL を使うのに比べれば、インテリセンスが標準で効くだけまし
マニアックな人しか使わんのかこれは
必要になったら使う、って感じじゃないか?
マネージ埋め込みリソースの参照がかなり面倒なんだけど、
なんでC#みたいに、Properties.Resources.リソース名で
一発アクセス出来ないの?
113 :
84:2008/05/31(土) 22:12:20
>>85 遅レスですが、
Document->DomDocumentを取得後に
その手順でできました。
ありがとうございます。
仕事で他の人間に頼まれて、何日かCLIでバリバリ書いた後、
C++に戻ると、ついつい"gcnew"を連発してしまう
C#のあとの配列newみたいなもんですね
わかります
C#のあとのfor eachみたいなもんですね
わかります
それは無い
あるあry
119 :
デフォルトの名無しさん:2008/06/04(水) 00:21:57
^←これなに?
ポインタモドキ?
それはハット
マネージドアプリを C++/CLI で作るのは邪道ですか?
122 :
98:2008/06/04(水) 08:46:51
あんまりメリットはないと思う。
MS的には事実上非推奨
C++/CLIのメリットって何?
C++でしか使えないライブラリを.NET用にラップするのが簡単になることじゃないか?
あとはCOMのインターフェースを扱うときとかな
OSが実装しているCOMのインターフェースをC#やVB.NETで書き直すのは馬鹿らしい
逆にC#のメリットって何?
書きやすい
情報(サンプルソースなど)が豊富。
ヘジたんが好きです
なんか、この手の質問ループしてないか?
過疎るな
それ以外の話題がないのかwwwwwwww
.NET各言語のまとめ
C++/CLI 闇ナベ言語
C# ヘルスバーグ萌え言語
VB 建て増しを繰り返した温泉旅館言語
J# J++手切れ金言語
JScript.NET (´・∀・`)ゲンゴ
F# 趣味言語
Spec#とSing#……勝手に☆拡張!
>>133 F#ってFortran#かForth#のどっち?
見に行ってみたけどあれは伸びてるって言っていいのか?w
139 :
デフォルトの名無しさん:2008/06/09(月) 10:26:58
で、どうしろと?
Thread^ jisure = gcnew Thread("C++/CLI part4");
jisure->build("プログラム板");
for(int i=0; i<1000; i++) {
// TO DO
}
jisure->Close();
ヘッダーのみで書いてるけど
生のC++と比べて
C++/CLIだとコンパイルが数倍速い気がする。
>>141 ほとんどref classだけで書くとコンパイル速度は速くなる。
C#のコンパイルが早いのと同じ理由。
生のC++で書いてただそれを/clr でコンパイルしただけの場合はかわらない。
c++/cliでxnaって使えるんですか?
ウィンドウを出すまでは出来たって人がいるみたいですけど
少なくとも/clr:safeは必須だろうな。
>>143 Xbox 360で動かすなら/d1clr:nostdlibも必要になるかも。
Windowsなら普通に使えるけど意味ないわな
147 :
デフォルトの名無しさん:2008/06/28(土) 13:39:34
STL/CLIでIntellisenseの効きが悪すぎる
メインのフォームに
別のフォームを
・タスクバーのアイコン無し
・閉じるボタンをなくす、もしくはCloseじゃなくSW_HIDEみたいにしたい
んですが
どうすればいいのでしょうか?
149 :
148:2008/07/01(火) 20:17:29
事故しました
メインフォームのLoad〜
で
サブフォームを作成(gcnew してShow)
サブフォームを閉じてしまった場合、
再度表示するには、どうすればいいでしょうか?
もしくは、そのオブジェクトが閉じられてるかどうかを確認するには何をチェックすればいいのでしょうか?
CloseしないでHideすればいいんじゃね
MSDN で、Visible プロパティとShowメソッドを10遍読んでこい
hideの身長は何センチですか?
hydeだろ
155 :
デフォルトの名無しさん:2008/07/09(水) 16:15:57
ネイティブのDirectX使いたいんですけど、
初期化時に必要なフォームのウィンドウハンドルはどうやって取得すればいいのでしょうか?
(HWND)this->Handle.ToInt32();
どっちでもいけたお
64bit
160 :
デフォルトの名無しさん:2008/07/14(月) 17:45:14
FormやPictureBoxのイベントハンドラを見ても出てないのですが、.
net 2003ではMouseWheelイベントは定義されていないのでしょうか?
隠されてんじゃね
基底であるControlで定義されてるから存在しないわけじゃない
162 :
160:2008/07/15(火) 16:47:11
>>161 ありました。VB以外だと自分で定義してやらないといけないのですね。
163 :
デフォルトの名無しさん:2008/07/16(水) 07:28:12
別のイベントが連鎖的におきてそちらのイベントを使うことが多いから
[Browsable(false)] にしてあるのだろう。
164 :
デフォルトの名無しさん:2008/07/16(水) 21:47:24
関数ポインタ配列の宣言がどうしてもコンパイル通らないんです。
よかったら何がだめなのか教えてください。
public ref class Form1 : public System::Windows::Forms::Form
{
public:
...
int fn1(int,int);
int fn2(int,int);
int fn3(int,int);
int (*fp[])(int,int){
fn1,
fn2,
fn3
};
...
ちなみにerror C4368です。
関数ポインタはアンマネージ
デリゲート使いな
166 :
デフォルトの名無しさん:2008/07/16(水) 22:08:11
>>165 アンマネージだったんですか。ポインタはだめとかそんなことを聞いたきがします。
ありがとうございます。
>>164 普通の関数とメンバ関数は、ポインタ型にすると別物だけど、
わかってるのかな?
C#でやるより少々手間がかかりますな。
delegate int fd(int x, int y);
array<fd^>^ fp;
fp = gcnew array<fd^> { gcnew fd(this, fn1), gcnew fd(this, fn2), gcnew fd(this, fn3) }
ネイティブクラスの関数ポインタは ->* が出てきて泥沼に陥るからやめたほうがいい。
169 :
デフォルトの名無しさん:2008/07/17(木) 21:20:42
>>167 わかっていないですorz調べてみます。ありがとうございます。
>>168 デリケートを使うことでコンパイルも通り,プログラムも完全はしましたが,
>>168が何をいっているのかわかりませんorz
まだまだです…
本当にありがとうございました。
>168
イベント使ったら?
うん普通はイベント使うよね
>>164 >関数ポインタ配列の宣言がどうしてもコンパイル通らないんです。
という問いだからあえてデリゲートの配列にしたまでで、
そりゃ普通マルチキャストデリゲートとかイベント使うよ。
イベントでadd/remove/raiseを明示的に実装する場合は・・・まあ普通はコレクションだな。
言いたかったのはネイティブクラスもrefクラスの関数ポインタはthisを内包していないことと、
関数ポインタを使う場合やデリゲートにする場合はthisを明示的に指定する必要があること。
C#と比べてうんぬんというのはC#でデリゲートを作るときはthisを暗黙に補ってくれるので
気にしなくて良いということ。
A classのメンバにB classの配列を加えるということはできないのでしょうか
array<T^>^なら入れられるよ
ref class A{
public:
static array<L_SAMPLINGDATA^>^ hoge;
};
ref class B{
public:
static int piyo;
};
---------------------------------
レスありがとうございます。
こんなかんじでしょうか。
ref class A{
public:
static array<B^>^ hoge;
};
ref class B{
public:
static int piyo;
};
---------------------------------
まちがえました
どういう意図があるのかわからんが static でいいのか?
178 :
デフォルトの名無しさん:2008/08/20(水) 02:17:19
自分からテスト専門です、って宣言してる派遣テスターって何なの?
将来プログラマとかSEになりたい、とかならわかるけど。
向上心ないよね、頑固だし。
そういう派遣テスターって、仕様書は読めない、
テスト仕様書も作れない、テストプログラムも作れない
やれることは「テキトーにプログラムを触る」ことだけ。
俺は派遣プだけどさ、こういう派遣テスターがいると
派遣全体がバカにされるんだよ。
テスト専門派遣なんて氏んで欲しいよ、まったく。
今日も正社員の人が派遣テスターに仕様書を読んで
テスト仕様書を作ってください、って説教してたよ。
その派遣は頑固に「何故、仕様書が必要なんですか?」って
反論してたから、きっとテスト専門派遣テスターだな。
仕様書も読まず、テスト仕様書も作らず、ただテキトーに
プログラム触るだけで給料もらおうなんて頭おかしいんじゃねーの?
あ〜あ、あの派遣テスターが3ヵ月後に切られるまで、
仕様書も読まねーでテキトーにテストしたバグ票がまわってくんのかよ。
そんな糞なもん、読んで処理する派遣プの身にもなってくれよ。
うわ〜、しかもそいつが切られる3ヵ月以内に中間納品あるじゃねーか!
テスト仕様書もなしにテキトーにテストして納品か。
中間納品後にソッコウクレームでデスマ必至だな。俺の休みも返上かよ。
派遣専門テスターさんよ、少しは向上心持てよ!
頑固な性格直して仕様書読めよ!テスト仕様書作れよ!
179 :
デフォルトの名無しさん:2008/08/28(木) 14:39:28
誘導されました
マネージコードでdllを作成することってできる?
dllのソース内でSytem::Stringを使おうとしたらC4747エラーがでちゃった
ソースの方に「#pragma unmanaged」宣言してるから仕方ないんだけどさ
なんかやり方あるんでしょうか?
環境はvc++2005でc++/cliでやってます
どんなDLLが作りたいの?
#pragma managedができない差し迫った理由でもあんのけ?
ちゅーかCLRでプロジェクト作ればまんまマネージアセンブリができるはずだが。
>>179 #pragma unmanagedなしでも__declspec(dllexport)な関数は作れるぞ。
関係ないけど、C++/CLIでSusieプラグインのコールバック書いたらすごく遅くてビビった。
何回も呼ばれるとアンマネージ-マネージ間のオーバーヘッドも馬鹿にならんな。
184 :
デフォルトの名無しさん:2008/09/07(日) 23:04:10
既存のNativeのC++コードをC++/CLI
でくるんでC#から呼び出す方法がいくつか検索できるけど
(MicrosoftのC++開発チームもそれを奨励しているみたい)、
これって実際に余程、腕が習熟してないとトラブルに見舞
われそうだと思うけどどうですか?
もう、MFCなんか使ってnativeのC++で押し通した方が
良いように思うけど。とくに、カーネルの数値計算部
がNativeコードでできている場合
それでいいんじゃない?
その時、/clr 付けておけば、.net framework も使えるし
C# のライブラリも使える
は? GUI は MFC か WTL だろ
>184 もそう言ってるじゃないか
>>184 別にネイティブコード呼び出すだけならC#からP/Invokeでも良いじゃん。
一度C#+WinForms+ビジュアルデザイナの開発に浸っちまうとMFCとか戻りたくない。
というかC++/CLIは使うかどうか迷うようなもんではないだろ。
C++/CLIのプロジェクト自体ほとんど見たことないが、
例えばアンタがXNAやSlimDX(DirectXのマネージラッパー)
みたいなアセンブリを作ろう思った時に、欲しい言語はどんな感じになると思う?
dllimport並べたC#
>>189 DirectXインターフェイスみたいなクラスのメンバ関数はどうするの?
FBX SDKみたいなバイナリ提供しかされていないライブラリが沢山ある場合は?
C#+DllImportにこだわって関数テーブルからのオフセット調べたり
API変換のみのネイティブDLLをライブラリ毎に作るくらいなら
C++/CLIでマネージクラス書いた方が多少はマシだぞ思うぞ。
すでにC++のコードがある場合、それをC#から使うのにいいな。
FBX SDKってもしかして*.libのみ提供?
>>192 >DirectXインターフェイスならCOM準拠なんだから
DirectShow以外は準拠しとらんよ。tlbもidlもない状態からinteropできたっけ?
まぁDirectXに限らずCOM以外のC++クラスライブラリは無理だわな。
>Interop Assistantでヘッダファイルを構文解析して、P/Invoke定義をコード生成する
言葉足らずで悪かったが、スタティックライブラリのみの提供の場合ね。
>>194 >DirectShow以外は準拠しとらんよ。tlbもidlもない状態からinteropできたっけ?
できるよ。tlbやidlはコードジェネレータの種に使っているだけで、
実行時にはMSILのメタデータしか使ってないから。
同じものをC#で書ける。
そもそもAPIからIUnknown弄ればどうとでもなる
C++もC#も理解していて、さらにC++/CLIをやってやろうという意気込みがあれば、
DllImport並べたりCOMInteropでどうにかするより楽に感じると思う。
つまりそれくらいの意気込みがないとつらいかなとも思う。
198 :
デフォルトの名無しさん:2008/09/09(火) 23:04:31
実現したい機能がリフレクションを使わないと書けないかめんどくさい
・Type.getType()相当のプリミティブ
・Invoke()相当のプリミティブ
があれば文字列をえっちらおっちらこさえれば.NET Frameworkのコードが呼べるはず。
これならスタック二段増えるだけなので手間じゃないはず。(文字列こさえるのはともかくとしてね……)
大本のプリミティブの下に積んでやれば下位互換性も保たれる。
199 :
デフォルトの名無しさん:2008/09/14(日) 07:17:54
447 名前:デフォルトの名無しさん[] 投稿日:2008/09/14(日) 01:09:45
Express 2005で3連休プログラマーなんだけど、
String^ folderName;
の ^ ってなに?
マネージドオブジェクトの参照。それ基本だから入門サイトで勉強しなおせ。
201 :
デフォルトの名無しさん:2008/09/14(日) 14:24:38
.NETでiniファイルの読み書き詳しく
C++/CLIならAPIをじかに呼べる。/clr:safeやC#などからならP/Invokeを使う。
その前にini使うようなデザインはもうするな。
203 :
デフォルトの名無しさん:2008/09/14(日) 17:31:54
仕様に書いてあるから訊いているのであって
お前ごときが意見するのはおこがましいちは思わんかね?
クスクス クスクス
このレベルのことはプログラマの権限の範疇だろ。
そうじゃなかったらプログラマでなくお前はコーダーだ。
あげてるし釣りだろ
そろそろ後釣り宣言が来るかもね
207 :
デフォルトの名無しさん:2008/09/14(日) 20:48:40
iniファイルは釣りでした。
起動してるプロセス(リスト)の取得教えて
起動時にPIDをファイルに書いとけ
そもそもC++/CLI関係なくね
くだすれ.NET逝け
>>197 しかし DllImport, COMInterop にも利点があってアセンブリが
AnyCPU に出来るという一部受けする魅力が
パワーがあるんならだからそっちのほうがと思うとやっぱり
C++/CLI って移行移行言っているのはそういう話なのではと。
言語的な話もあれども。
日本語ぎりぎりだな
もうやだこの世界
C++/CLIこそ.NET
215 :
デフォルトの名無しさん:2008/09/19(金) 15:24:08
自分以外のユーザのマイドキュメントのパスを取るAPIってない?
216 :
98:2008/09/19(金) 15:38:38
なぜここで訊く
217 :
デフォルトの名無しさん:2008/09/19(金) 15:46:18
c++/cliでやってるもんで・・・
フレームワークにうまいのがないかなと
>>215 基本的にアクセスできない & プロファイルのロードは重いのでないん
じゃない。
というか偽装してプロファイルロードしてとりゃいいんじゃないかなぁ。
219 :
デフォルトの名無しさん:2008/09/22(月) 14:31:38
>>218 返信遅くなったんだが教えてくれ
ユーザプロファイルを読み込んで後はどうやってマイドキュメント取ればいいの?
後、ユーザプロファイル取れてるかも自信ないんだが、下で合ってる?
IntPtr lt = IntPtr::Zero;
PROFILEINFO pfi;
LogonUser(L"test", L"", L"test",
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
(PHANDLE)<)
::ZeroMemory(&pfi, sizeof( PROFILEINFO ));
pfi.dwSize = sizeof( PROFILEINFO );
pfi.lpUserName = L"test";
LoadUserProfile((HANDLE)lt, &pfi);
>>219 C++なんだから、IntPtrよりHANDLEとか適切な型を使おうぜ。
それはともかく、SHGetFolderPathがトークンハンドルを引数を取る。
もしかしたら、ユーザプロファイルを読み込まなくても使えるかもしれない。
>>221 レスあり
ユーザプロファイルのロードはしなくても取れました
というかそのコードだと LogonUser で自動的にロードしてるな>プロファイル
C++/CLIでprintDialogが開くのが遅くて、
printDocument->Print()してからプリントアウトが始まるのも遅いんですが早くする方法ってありますか?
C#の
if(hoge is Nazo)
{
// hogeはNazo型
}
みたいのはどうやって書くの?
if (dynamic_cast<Naze^>(hoge))
{
}
dynamic_castはC#のas相当で、C#のisとasは同じILにコンパイルされるということから。
できました
as は safe_cast 相当じゃないの?
safe_castはキャスト失敗した時例外投げる
List<T>::Find(System::Predicate<T>(T))
あたりのやつってC++/CLIだと使えないの?
別に使えないってこたーない
匿名メソッドやラムダ式が無いから使いづらいけどな
匿名メソッドないから、
条件の数だけデリゲートの関数が要る。
そこでBoost.Lambdaが……、使えない。
比較対象を変数に仕込んだり…
collection_adapterにぶち込んで、cliext::find_ifを使うんだ。
bind1stとか使えるぞ。
文字列スイッチはできないの?
そこはC++ですから。
ひんと はっしゅ
C++/CLIのフォームデザイナのコード、あれなんとかならない…?
まあそもそもフォームデザイナ使うようなところに使う言語じゃないしね
おまけと割り切るべき
C#はISO,JIS承認されたけど、
C++/CLIはISOに蹴られてその後どーなったの?
C++0x 待ちじゃね?
Bette Cを標榜するならC99のコードは動作してもらいたい。
C++/CLIIはNGになってよかったけど、これに変わるとなると、もう素直にC++0x→D言語でいいんじゃないの?
244 :
デフォルトの名無しさん:2008/11/11(火) 23:17:15
VSで開発してC++用のライブラリ使ってて、
内部で標準C++ライブラリが使われてmsvcr80.dllとかが要求されるんだが、
完成間近にいざ別の環境に持っていくと動かなかった。
.net入れてたら動くかと思ったんだが・・・
CRTオプションが/clrだから/MT(without DLL)が併用できないと怒られたし。
どうしよう(・ω・`)
正味CLRの実装レベルの話分かってない俺を誰か助けてくれ。
>>244 それはランタイムが足りないから。
Visual C++ 再頒布可能パッケージってのをインストールするんだ。
バージョン(SPの有無も)、x86/x64/IA64で別々だからそこんとこ間違えないように。
xp以降はおなじmsvcr80.dllでもビルドやリビジョンが下位の場合は読み込まない。
.NET2.0を導入すると.NET2.0が使ってる8.0.50727.42(or163?)が、
.NET3.0を導入すると.NET3.0が使ってる8.0.50727.1833がインストールされるが、
VS2005の最新パッチ状態でコンパイルしたものは8.0.50727.3053を必要とする。
このために.NET2.0が入っていてもmsvcr80.dllがあっても見つからないというエラーが発生する。
別に .net 関係ない話だし
CRTを使ってるからたまたま一緒にインストールされるという話だね。
インストーラーやClickOnce、または再配布モジュールで導入するのが筋だろう。
.NETでCRTを使ってるのはCSC.EXEとかMSCORWKS.DLLあたりだね。
C++/CLIでCRTを使いたくないなら、/clr:safeにする必要がある
ねーよ
CLIの機能(プロパティやGC)は使用したいけれど.net frameworkは使用しない場合で、
.net frameworkのランタイムが入っていない環境で動作する様にできるんですか?
Monoでも入れてみるかね
CLIって.NET Frameworkの仕様のことなんだが
>>253 おそらくC++/CLIのつもりなんだろ
CLIの機能を使いたいが、.NETは嫌だというなら、
>>252しかないな。
そういえばなんでSTL/CLRはCLIじゃなくてCLRなんだろう
仕様を定めてるんじゃなくて、あくまでCLR用のライブラリそのものを指すから?
Mono調べてみました
・・・素直に. netを使おうかと思います^^;
C++/CLIは独自仕様で直接.net frameworkとは関係ない所なので
C++/CLIだけ利用できないかな?と思ったので質問しました。
C++/CLIっていうのは文字通りCLI(.NET Frameworkのコア仕様を定めるもの)
をサポートしたC++なんだよ?
その点C#は言語仕様が直接CLIに依存してないから
C++/CLIに比べて.NETとの繋がりがむしろ弱いともいえる
まあ現実にはCLIなしのC#なんて考えられないけどな。
コンパイラとGCとBCL一通りさえ実装すればC#と名乗れるんでしょ?
誰かやりそうだけど誰もやらないね
そうなんですか、それでもやっぱりC++/CLIだけ使用して
.net frameworkを使用しないっていうことはできないんですよね。残念です
プロパティに夢見てCLIにソースコピペ
↓
プロパティ追加したらアンマネージにマネージは作れないと怒られる
↓
クラスをマネージにしてみる
↓
処理速度激減。なぜかインライン展開できてないorz
アンマネージクラスにプロパティとか新しい列挙とか作る方法ってないの?
マネージ系はインラインできないの?
遅くなってるのは、インライン展開やマネージコードになったことよりも、
アンマネージコードとマネージコードの境界を意識してなくて行き来が多発しているのが原因だと思う
まぁ、素人はネイティブをメインに gcroot でも使ってろってこった
monoでのC++/CLIの対応状況。
コンパイラのサポートはなし。
Microsoft.VisualC.Dllは存在していてsafeモードでコンパイルされたものは動く。
その内訳。
mono2.0.1現在ではVS2005でコンパイルしたものは動く。
vs2008でコンパイルしたものは動かない。STL/CLRも未サポート。
mix, pureモードでコンパイルされたものは動かない。
VC2008EEで勉強してます。
アップウィザードの自動生成が嫌なので、
空のCLRプロジェクトを選択して
int main()
{
Application::Run(gcnew Form());
return 0;
}
という最小限のプログラムを作ってみました。
プロンプトを表示させないようにするには
どうすれば良いのか教えて下さい。
まず普通のWinFormプロジェクトを作ってみてそれを参考にすれば良いよ
270 :
268:2008/11/15(土) 21:04:17
プロジェクト->プロパティ->リンカ->システム
で Windows(/SUBSYSTEM:WINDOWS)
を設定。
int main()を
int __stdcall WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdLine, int cmdShow)
に置き変えて,
#include <windows.h>
を書いたらできました。
でも、なんか違う気も。。
CLR用のやり方があるんだろうか?
271 :
268:2008/11/15(土) 21:10:32
>>268 やってみてます。
Form1クラスの
System::ComponentModel::Container ^components;
メンバって使われてます?
272 :
268:2008/11/15(土) 21:11:51
>>270 それでいいと思う。
どうしても気になるなら、リンカ→詳細のエントリポイントを書き換えろ。
サブシステムが/SUBSYSTEM:WINDOWSにさえなっていれば大丈夫。
例えば、mainCRTStartupにすればint main(int argc, char **argv)で始められる。
?mainCRTStartupStrArray@@$$FYMHP$01AP$AAVString@System@@@Zだと
int main(array<System::String^>^ args)になる。
CRTの初期化が要らなければ、自分の関数を直接指定する。
274 :
268:2008/11/16(日) 10:17:18
>>273 ありがとうございます。
教えて頂いたところを試してみて、以下がわかりました。
・int __stdcall WinMain(HINSTANCE hInst ... )
を使った場合には、サブシステム:設定なし で動くようです。
・int main(array<System::String ^> ^args)
を使いたい場合には、サブシステム:/SUBSYSTEM:WINDOWS
エントリポイントmainで動くようです。
アップウィザードはの設定は後者ですが、
メイン関数からの引数が不要なら前者の方が楽ですね。
275 :
268:2008/11/16(日) 10:58:51
自分で作成したフォームクラス(MyForm.h, MyForm.cpp)
に対して,デザイナを使えるようにしようとしています.
とりあえず新しい項目の追加でWindowsフォームを選び,
作成されたFoo.hとFoo.cppの内容をMyForm.hとMyForm.cpp
に全て変更したら動きました.
デザイナで編集して,MyFormのコンストラクタから
InitializeComponent();を呼んでいます.
でもこれもやり方が違う気が..
何がいいたいの?
277 :
268:2008/11/16(日) 18:57:42
MyForm.resx というXMLファイルを追加し,
ProjectName.vcproj というXMLファイルに変更を加えたら
MyForm.hがデザイナから認識され,編集できました.
既存のMyFormクラスに対して上記のXMLファイルの
設定を自動で行ってくれる方法は無いみたいです.
日記は自分の blog にでも書いたらいいんじゃないか
何の情報も提供せずに教えてくれってのよりは良いんじゃない?
この人、自分がやってることをぼそぼそ呟いて、自己満足してるだけだろ
ウィザードがやってることを見もせずに、ウィザードと同じことやってりゃ世話無い罠
自動的に作成されるメソッドに日本語が入らないようにするにはどうすればおk
過去の資源を再利用できること以外にC++/CLIがC#より優れてる点はどこですか?
Disposeパターンが言語に組み込まれてる
テンプレートが使える
マクロが使える
一番目は相互運用絡みだから除外するべきかも
__fastcallが使えないのが痛い
#pragma unmanaged
C#(検証可能アセンブリ?)はリバースエンジニアリングが簡単という話を聞いたんですが
C++/CLIの混在アセンブリ、純粋アセンブリや検証可能アセンブリも同じなんですか?
マネージコードで書かれた部分は読み放題
Reflectorでほぼ完璧に逆コンパイル可能
C#ほどILが綺麗じゃないから若干読みづらいかも
>>285 #pragma unmanaged
int __fastcall func( int a, int b)
{
return a + b;
}
#pragma managed
これじゃ駄目なようですが
MSの常
・勝手に仕様拡張する
・なかなか、正規仕様に準拠しない
どやしつけられたのがJ++
総スカン食らったC++/CLI
J#でどやしつけられ、性根入れ替えてC#はよかったのに
またC++/CLIで汚点。
J#はみあたらんぞ
忘れてた
・勝手にサポートを打ち切る
今どうしても必要なときに必要なところだけ使う言語だもん
中途半端なフォームデザイナなんか付けたりするから勘違いする奴がいる
292 :
デフォルトの名無しさん:2008/11/30(日) 11:55:31
property TKey First;
のような省略記法って、何の意味がありますか?
アクセサを使わない場合と比べて、何か利点はあります?
記述を省略できる
294 :
デフォルトの名無しさん:2008/11/30(日) 12:15:20
generic< typename TKey, typename TValue >
public ref class Pair
{
public:
property TKey First;
property TValue Second;
//TKey First;
//TValue Second;
Pair(){}
};
stl::pairのようなクラスを作ったのですが、propertyを使うと、
テンプレートの型によって、代入出来たり出来なかったりするようです。
propertyを削除すると、代入出来るようになります。
何か理由わかりますか?
(続く)
295 :
デフォルトの名無しさん:2008/11/30(日) 12:19:11
(続き)
public value struct ValueTypeStruct
{
unsigned int A;
unsigned int B;
};
array< Pair< unsigned int, ValueTypeStruct >^ >^ arry;
arry = gcnew array< Pair< unsigned int, ValueTypeStruct >^ >(10);
for each( Pair< unsigned int, ValueTypeStruct >^% inv in arry)
{
inv = gcnew Pair< unsigned int, ValueTypeStruct >();
inv->First = ...; // <- OK
inv->Second.A = ...; // <- NG
inv->Second.B = ...; // <- NG
}
>>293 記述を省略して、デフォルトのアクセサを作ったとして
それのメリットは何ですか?
別にget、setに別にアクセサビリティを設定出来る訳ではないし、、
メンバ変数のアドレスを取れなくさせるとかですか?
>>290 いやいや、RedHatにはかなわんよ。
新版のLinuxパッケージをリリースしたら、旧版は即日サポート終了だからな。
あれには驚いた。
> inv->Second.A = ...; // <- NG
> inv->Second.B = ...; // <- NG
プロパティは実質的にメソッドなので値型だとコピーが作られる
> 記述を省略して、デフォルトのアクセサを作ったとして
> それのメリットは何ですか?
ILレベルじゃまったく別物
途中で検証が必要だからフィールドからプロパティに変えるか、ってほど気楽な変更ではない
そもそもインスタンスフィールドを公開するのはガイドラインに逆らってるしな
> 別にget、setに別にアクセサビリティを設定出来る訳ではないし、、
これは単にコンパイラの実装の手抜きだろ
C#じゃ設定できるし
298 :
294:2008/11/30(日) 13:08:31
自己解決しました。
inv->Second.Aとした場合、Secondはメンバではなく
get()の戻り値である一時変数であった為でした。
>>297 理解しました、ありがとうございました。
valuetypeは変更不可で設計したほうがこの手の間違いが少なくてすむよね。
>>300 値型と参照型の違いもそうなのですが、
プロパティの
inv->First = ...; // <- OK
と
inv->Second.A = ...; // <- NG
が、表面上は同じ代入なのに
内部的には、
inv->set_First( ...);
と
inv->get_Second().A = ...;
と、正反対の関数に分かれるってのは
デンジャラスだなーと思いました。
propertyのgetには、何か足りてないものがあるような感じです。
値型とプロパティは相性が悪いのよ。参照型のクラスだと問題ないでしょう。
だからP/Invokeのような特殊な用途を除いてイミュータブルにするルールになってる。
・・・のだけど、WindowsFormのPointやSizeはしっかり変更可能になってる(笑
ヘジたんの目が届かなかったのだろう。
>>302 ここで言う値型はプリミティブ型を除いたユーザー定義型の構造体のことです。念のために。
WinFormじゃなくてGDI+だな
その辺はむしろラップしてるアンマネージドとの兼ね合いじゃないか
WPFの構造体だってたいがい変更可能だよ
そのへんは割り切り設計
ちゃんとわかってたら問題ない
C++/CLIっていうか、.NETって
typedefのようなエイリアスって無いんですかね?
これじゃ何も作れないような、、皆さんはどうしてるんですか?
何を作りたいんだ?
マクロでも書けば委員者ね?
トリビアル・プロパティとトリビアル・イベントの存在意義はロック処理を自動でしてくれること
だった気がする
>>307 何か特定のソフトウェアに依存する話ではなく
一般的なものだと思います。
typedef classA< classB< classC > > > arg_type;
void func( arg_type a );
C++ではこう出来ていたものが、
void func( classA< classB< classC > > > a );
.NETではこれしか出来ないというのは
利用者側は、いちいちclassA< classB< classC > > >型のオブジェクトを宣言しろってことですか?
で、それだけで何も作れなくなるの?
>>310 アセンブリ横断ではその機能はないが、C++/CLIつまり同じソースか
includeするHeaderファイルの範囲なら使えると思うけど。
C#の場合は using xxx = System.YYY.ZZZ; 同じソースないなら出来る。
今のC#とVB.NETにはローカル変数の型推論もあるし、
常にclassA<classB<classC>>>と書かねばならないわけでもなかろう。
(もちろんクラスメンバや戻り値など、その必要性がある場面も依然として存在するが)
C++/CLIはtypedef使えるぞ。
>>310 むしろ出来ないってデマをどこで教わったんだ?
2,3行書けば検証できる話だぞ?
その例から「でもBoostのようなメタプログラミングが〜」とか飛躍しないでくれよ。
>>311 激しく意欲を削がれます。
他にも、const参照が出来ないとか、
ちょこちょこ退化してる?みたいな部分が見え隠れするんで。
いろんなサイトの紹介文ではマンセー意見しか書いてなかったんで
余計にです。
>>312 CLRで使えないと、C++/CLI使う意味ないです。
>>314,
>>315 >>312のいうアセンブリ横断のことです。
もちろん書いて試したし、検索もしました。
>>313 型推論について調べてみます。
アドバイスありがとうございます。
C++のconst参照みたいなコンパイラを騙くらかすだけのまがい物ではなく
実際に参照されているオブジェクトを変更不可として扱うconst参照を導入しようとすると
オブジェクトの検証にパフォーマンス上の問題が発生するのであえて採用してないそうだ。
オブジェクト指向では、内部の実装を隠蔽するわけだが、
それによって、一見読み取りだけのメソッドでも内部では何か状態を
更新してるかもわからないし。
const参照は、なんちゃってオブジェクト指向のC++と違って現代的な
オブジェクト指向とは相性悪いってことだな。
基のC++でもmutableとかあるしね。
逆に、.NETで表現するとしたら、IReadOnlyHogeとIHogeって2本立てにするのが落としどころだと思う。
複雑なジェネリック型を晒すなと.NETのガイドラインに書いてあるんだよね
Native C++の2次元配列から、C++/CLIの2次元配列に値をコピーしたいのですが、1つ1つの要素を代入する以外の、
一発でコピーできる方法が分からなくて困っています。
1次元配列の場合は、
double nativeVec[3] = {1, 2, 3};
array<double> ^cliVec = gcnew array<double>(3);
System::Runtime::InteropServices::Marshal::Copy(IntPtr(nativeVec), cliVec, 0, cliVec->Length);
でコピーできますが、
2次元配列の場合はどうすればいいのでしょうか?
以下のコードでは動きませんでした。
double native2DVec[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
array<double> ^cli2DVec = gcnew array<double, 2>(3, 3);
System::Runtime::InteropServices::Marshal::Copy(IntPtr(native2DVec), cli2DVec, 0, cli2DVec->Length); // ここでエラー
エラーは、
error C2665: 'System::Runtime::InteropServices::Marshal::Copy' : 16 オーバーロードのどれも、すべての引数の型を変換できませんでした
です。
ピンしてmemcpyでどうだ。
#include <cstring>
double native2DVec[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
array<double, 2> ^cli2DVec = gcnew array<double, 2>(3, 3);
pin_ptr<double> p = &cli2DVec[0, 0];
std::memcpy(p, native2DVec, sizeof native2DVec);
std::copyでもできたけど、書くのが面倒だった。
ところで多次元配列の要素の連続性の保証ってあるよね?
>>323 できました!
連続性の保障は怪しい気もしますが、とりあえずは手元で動くのでokということにしておきたいと思います…
マネージ多次元配列はメモリレイアウトに関してなんら保障してなかったような・・・
ジャグ配列にして一行ずつコピーした方がいいんでね?
マーシャリングはともかくアクセスはジャグの方が速いし。
>>325 3x3行列なので、ジャグ配列にするのもなんかなあ、という気分なのです。
最悪2重forでコピーかなあ。
小さい行列を大量に扱うんだったら
>>322-323みたいなのはかなり非効率だと思うよ
3×3と決まってるなら手打ちでいいじゃん
328 :
デフォルトの名無しさん:2008/12/12(金) 00:25:00
MFCのダイアログアプリで質問です。
画面上のボタンを押すとWindowsForm画面を開いています。
こんな感じです
ボタンの処理
Form1 ^ fm = gcnew Form1;
fm->Show();
画面は普通に開きますが
別プロセスみたいにメイン画面の下に隠れます
親ハンドルを指定すればいいのかな?と思い
下のようにしても裏に隠れます
Form1 ^ fm = gcnew Form1;
fm->Show(fm->FromHandle(GetSafeHwnd()));
親子関係にするにはどうやればいいのかわからないです。
fm->Parentやfm->Ownerを設定してもダメでした
MFCダイアログとWindowsForm画面の親子関係は無理なんでしょうか?
やりたいことはMFC画面上に.NETコンポーネントである
グラフコントロールを表示したいだけです。
素ではダイアログに組み込めないのでWindowsForm画面に組み込み
子画面として特定の位置に固定させようとしています。
画面は表示できたのに位置合わせだけがダメです。
MFC 側で Window Activate 時に Form を前にしてやればいいんじゃね?
331 :
328:2008/12/12(金) 08:28:12
レスありがとうございます。
少し進展がありました。
ラッパーというのを作って
public ref class HwndWrapper : public IWin32Window
{
public:
HwndWrapper(HWND handle)
{
this->handle = static_cast<System::IntPtr>(handle);
}
virtual property System::IntPtr Handle
{
System::IntPtr get()
{
return handle;
}
}
private:
System::IntPtr handle;
};
332 :
328:2008/12/12(金) 08:29:03
Showのところでこうやると親子関係できました。
HwndWrapper ^ww = gcnew HwndWrapper(GetSafeHwnd());
fm->Show(ww);
ただ、親が動いても子は元の位置のままなのでちょっと不便です
ウインドウ上にボタンが乗ってるように一緒に移動してくれません。
MFC側でコントロールするとどうしても遅れが生じるので不自然っぽいです。
どうもうまくいかないので教えていただいた
「MFC ダイアログ ボックスとしての Windows フォーム ユーザー コントロールのホス」
の方をやってみます。
子ウィンドウとownedウィンドウの区別も付いてないのか
334 :
328:2008/12/12(金) 10:52:09
ホストの方法でいけました
ありがとうございました
335 :
デフォルトの名無しさん:2008/12/13(土) 18:30:25
スレチ、winAPIスレへ行け
char使ってるからunicodeがらみだろうが
すれ違いの上エラーの内容も書かない阿呆か。
VS2005の環境でプログラム書いていたのですが、
テキスト形式のデータを読みだそうとすると以下のエラーが出てきてしまいました。
System.ObjectDisposedException' のハンドルされていない例外が mscorlib.dll で発生しました。
追加情報: 閉じている TextReader から読み取ることはできません。
System.ObjectDisposedExceptionのことを調べてもいま一つどういうことなのかがわからなかったので、
何がダメだと言われているのか教えていただけないでしょうか?
初心者なので意味不明な質問になってしまっているかもしれませんが、よろしくお願いします。
端的に言えば、Close/Disposeを読んだ後に、まだ何かやろうとしてるということ。
自分でそれらを呼んでいるか、自動変数のスコープを抜けるときに自動的に呼ばれたか。
元のコードに原因がある。
342 :
デフォルトの名無しさん:2009/01/04(日) 04:35:53
参照クラスって、使用しなくなったインスタンスを自動開放してくれるって
ことでいいんだよね?
そんな単純なものじゃない
住む世界が違う
344 :
デフォルトの名無しさん:2009/01/11(日) 01:45:20
この言語でMFCは使えるんですか?
使える
346 :
デフォルトの名無しさん:2009/01/11(日) 02:07:07
フォームアプリからMFCサポートに変更
MFCアプリから.NET使用&フォームアプリダイアログ作成
できるんですか?
できる。聞くばかりじゃなくて、やってみればいいだろ
単純な MFC アプリケーション作って、そこで CLR サポート有りにすればいい
MFCウィンドウ内に.NETコントロールを置くほうはCWinFormsControl/View/Dialgのクラスもある。
349 :
デフォルトの名無しさん:2009/01/11(日) 16:10:30
全然わかりません、MFCで共通言語ランタイムサポートを選ぶと/MTと一緒はダメと言われます。どの項目を選んでもダメです。
これはどうすればいいんですか?
MFC の共有DLLを使えよ。どの項目を選んでも駄目ですって条件反射で書いてるんじゃねぇ
VS2008を再インストールしたら治る可能性があります。とかいうからやったらほんとに治った
共通言語ランタイムサポートにできました!
352 :
デフォルトの名無しさん:2009/01/18(日) 05:10:12
アンマネージからrefクラスの関数を呼び出すにはどうすればいいんですか?
managed -> managed で呼び出すのと同じ
>>352 静的メンバなら
>>353の言うとおり。
非静的メンバの場合、#pragma unmanagedや/clrなしの領域から直接呼ぶことは不可能。
#pragma managedな領域にそれを呼び出すだけのラッパー関数を置くしかない。
インスタンスの保持だけは、<msclr/gcroot.h>してmsclr::gcroot<>で可能。
例えばこんな感じ。
#include <msclr/gcroot.h>
msclr::gcroot<System::Object^> CreateObject()
{
return gcnew System::Object;
}
int GetHashCode(msclr::gcroot<System::Object^> const& h)
{
return h->GetHashCode();
}
#pragma unmanaged
#include <iostream>
int main()
{
msclr::gcroot<System::Object^> h = CreateObject();
std::cout << GetHashCode(h) << std::endl;
}
ラッパーはmanaged領域でのネイティブクラスでも可能。ただし、依然としてmsclr::gcrootは必要。
#include <msclr/gcroot.h>
class XObject {
public:
XObject() : o(gcnew System::Object) {}
int GetHashCode() {return o->GetHashCode();}
private:
msclr::gcroot<System::Object^> o;
};
#pragma unmanaged
#include <iostream>
int main()
{
XObject o;
std::cout << o.GetHashCode() << std::endl;
}
はっきり言って全然わかりません。同時に使うのは厳しすぎますね
じっくり解読しますありがとうございます。
354と355のコードでは、refクラス = System::Object、関数 = GetHashCodeとして書いてある、一応。
358 :
デフォルトの名無しさん:2009/01/30(金) 01:24:35
なぜに、MFC+.NETなんて使う必要があるんだ?
.NETが許される案件なら.NETで押し通せばいいじゃん
大抵の案件は、.NETは拒否られる
自分の狭い世界で語られてもな
360 :
デフォルトの名無しさん:2009/01/30(金) 02:06:05
.NETは遅い
そーだね
でもrubyよりは速いよ
起動以外は
362 :
デフォルトの名無しさん:2009/01/30(金) 21:08:41
Visual Studio 2008がやたら、重いんで
ちょっとしたテストプログラムはテキストエディタで作成して
コマンドラインからビルドしたいんですけど、どうすればいいのかしらん?
nmake か VCBuild を使う
C++/CLIのString型とC言語のchar文字列は、
どのようにデータをやり取りさせればいいのでしょう?
char c_str[]="1234";
String ^cli_str;
cli_str = c_str; // cli_strに"1234"をコピー
と言った事をやりたいのですが。
cli_str = gcnew String(c_str);
2008以降ならmarshal_asおよびそのソースコード
バカ正直にやるならASCIIEncoding
その実体はMultiByteToWideChar
ありがとうございます。
コンパイルやってみて上手く動きました。
String型文字列をchar型にコピーするのについても質問したいのですが、
c_str[0]=cli_str[0];
というのを繰り返す事でコピーできる事まで調べました。
これを行う為の関数のようなものはあるのでしょうか?
・・・みんないっぱい検索キーワード出してるじゃん
まじめに探したの?
marshal_contextを使うか、CString/CStringA/CStringWを使うか。
どっちもexpress edtionだと使えなかったと思う。
裏技的にはsprintfを使う方法がある。
だから、WideCharToMultiByte があるじゃないか
>>372 それは単なるUNICODE-ANSI変換でない?
残りの方法はこんなとこ、使い方はぐぐってね。
Marshal::StringToHGlobalAnsi
Marshal::StringToHGlobalUni
PtrToStringChars
Encodingが一番確実か
>>373 Unicode -> MBCS変換だろうけど
WideCharToMultiByteは変換に使えないの?
>376
そのまえにToArrayしてpin_ptrして、サイズ計算して、領域確保して変換だから
ほかの方法のほうが断然楽
>>377 ToArrayよりPtrToStringCharsだろ。
いずれにせよ、pin_ptr<const wchar_t>化してしまえば、
既存のライブラリが使えるので、持ち合わせがあればそんなに悪くない選択肢だと思う。
C++/CLIで書いたプログラムって
Monoで動く?
動くのもあるし、動かないのもある
/clr:safeのものは動く。
ただしSTL/CLIのサポートはまだのようだった。
382 :
デフォルトの名無しさん:2009/02/01(日) 01:06:00
cl.exe でコマンドラインからコンパイルすると
〜.exe.manifest
なるものも生成され、削除すると〜.exeが起動しなくなります。
exe単体で起動できるようにするにはどうしたらいいのですか?
>>382 mt -manifest HOGE.exe.manifest -outputresource:HOGE.exe;#1
これやると、manifestがexe内に埋め込まれるので、manifest無しで動く。
384 :
デフォルトの名無しさん:2009/02/01(日) 01:29:08
385 :
デフォルトの名無しさん:2009/02/01(日) 23:49:39
CLIスレ伸びませんねw
実際に使ってるところある?
仕事で事前調査用に使ったが、周りに理解されず、本番はVC++6.0でMFC4.2ときたもんだwww
なんか、布教にいい道具があればいいのだけど…。
WPFとかに対応しない限りまず消滅すると思った方がいいだろうね。
WPFが俺の思ってる物と同じなら、対応するとかナニ言ってるんだって感じ。
まあ、Cのポインタ全部絶滅させられるならどっちでもいいがw
>>388 絶滅させられないからこそのC++/CLIじゃないの?w
今のところMFCのCArchive使ってファイル保存していた古いデータを
.NET側から簡単に読み込むためのモジュールを作るのに重宝してるってぐらいだなぁ。
WPFみたいなほとんどマネージコードによるマネージコードのための超高レベルフレームワークを
わざわざC++で使う意味がわからない
まぁP/InvokeやCOWだけじゃ困る場面もたまにはあるわけだし。
やってることは凄いんだが評価されないC++/CLI。
とりあえず「C++屋のための.NET言語」という勘違いをされ気味なのはなんとかすれ。
進化したMS版C++Builderくらいにしか思ってませんでしたw
使いやすいGUIライブラリ付きのC++という捉え方は誤解の元だね
どうして誤解なのか解説しちくりくり
使いやすくないからな。
GUI部分はC#でいいべ。
C#の「#」は、++++ で C++++の略でしたっけ?
>>396 まあそうなんだが、GUIだけ分けるのもかえって面倒だったりするしな。
401 :
デフォルトの名無しさん:2009/02/04(水) 15:17:24
で、どうしろと?
とりあえずチンコでも揉んでみたら
チンコとかの話しかしない人に必要な言語は
C++/クリ(ry
C++/CLIは地味だけど、商用デスクトップアプリで
.NET使う場合はよけて通れない言語じゃないかなぁ。
.NETなアプリはまだ本家MS様も出してないよね?
Expression もハイブリッドだし。
ネイティブとマネージドのミックスタイプのアプリはMSのプロダクトに増えたけど、
基本的にホスティングがおおいな。
C++/CLIはあまり見かけない。
>>404 あ〜。ホスティングだったのか。
勘違いを正してくれてありがトン
XNAのWindows向けアセンブリくらいだろうなぁ。
俺の言ったカンファレンスじゃ、ベンダーがC++/CLI がベストと言って楽しそうだった
WPFも一部C++/CLIだな
XNAのフレームワーク部分はC#だよ
>>408 んー? Reflectorで眺めた結果で予想してるだけだが、
Microsoft.Xna.Framework.Game.dll以外はほぼC++/CLIのアセンブリでしょ。
FBXインポータが3MB超なのも、もろにfbxsdkのバイナリとマージしてるからかと。
410 :
デフォルトの名無しさん:2009/02/05(木) 01:17:05
ネイティブとマネージドのミックスタイプのアプリは現在、どの程度可能
なのか?
C++Builderでは、確かDelphi(Object Pascal)のコードがコンパイルできたと思う
が、こういうことがネイティブとマネージドの間で透過的にできるのか?
もちろん、マネージドコードとネイティブコードの混在ははるかに難しいと
思うが、これを簡単に実現できる方法を提示してもらわないとマネージドは
使う気になれない。
大体、トラブルがリンカエラーで出てくるというのは、エラー箇所の特定が
非常に難しく、最悪の状態ではないか?
まぁ、C#が良いみたいだけど、結局、VBだろが、VC++だろが、C#だろが
Windowsプログラミングになるとどの言語だろが関係ない。
結局、MIcrosofが決めた訳の分からん取り決めに振り回されることになる
から。
日記もつけたし今日は寝る。お休み。
>>410 その混在を実現しているのが今のところC++/CLIだけ。
#pragmaでネイティブとマネージドどっちのコードを吐くか切り替えられる。
ネイティブクラスとマネージクラスの混在(has Aでの包含)は
透過的ではないものの、手段は用意されている。
とりあえずガンガン使っていくので今後ともよろしく>C++/CLI
使って情報を出さないとね。ググった結果に引っかかるサンプル増やせば
ちったあ底辺広がるだろうし。
415 :
デフォルトの名無しさん:2009/02/10(火) 09:57:12
バイナリフォーマットで100MBほどのデータを
シリアライズしようとしているのですが、
デシリアライズするときにメモリを数倍も消費して
ロードできないのですが、
デシリアライズをカスタマイズしないとできないのでしょうか?
GC::Collectするとメモリがいっぱい回収できます。
諦めてXmlReaderかストリーミングでLINQ to XML使った方がいい
417 :
415:2009/02/10(火) 23:00:48
結局、自前で読み書きするようにしました。
>>392 > やってることは凄いんだが評価されないC++/CLI。
MSがC#を前面に押し出したから見向きされなくなったよね。
それにC++はもともと敷居が高い言語だけど、
マネージドが入るとさらに敷居が高くなるからね。
員数仕事じゃ使うの無理じゃない?
>>418 >MSがC#を前面に押し出したから見向きされなくなったよね。
その頃はまだmanaged C++といってほとんど試作品」だったよ
C++/CLIのコンパイラのソース出してくれないかなあ。
CLIじゃなくて、JVMのバインディング、面白そう。
422 :
デフォルトの名無しさん:2009/02/11(水) 17:01:01
そもそも、.NETはお金を頂くソフトウェア作るには不向き
・遅い
・ソース丸見え
・フレームワークインストール必須
・FAでは絶対に無理
枚挙に暇がない
今時そんなのが問題になるのか?
>・ソース丸見え
あっちこちでネガネガしてる奴のようだ。ほっとくに限る。
組込みでC言語、VB6を少々
しかやった事無いけど、CLRでデータロガ作ってみた。
Windowsの知識はほとんど無いけど、すごく簡単ね
Win32Apiでやろうと思ってたけど、自分のツール程度ならCLRでいいかな。
とりあえず田舎で本が手に入らないからゴリ押し(ほぼC言語w)で作成中、
勉強すればもっと便利に使えると思うんだけど・・・。
皆さんはどうやってC++/CLRを勉強したの?
勉強?
どこをどう勉強する必要があるんだ??
>>425 C++の経験者が使う言語だと思ったほうがいい。
Win32APIやCのライブラリを使わないならVB.netやC#やったほうがいい。
デフォルトでスマートポインタなCOMの一種と考えるとそれほどでもない
C++とC#の経験があればそのまま使える
というか,そういう人にしか旨味のない言語
簡単だと思うのはC#やVB.NETを触ったことがないから
430 :
425:2009/02/12(木) 03:33:22
>>426-429 ありがとう、意見を参考に、ずっとC#のサンプルコードいじってた。
とりあえず腹減ったので寝ようかな。
>>427 当初Win32APIをやろうと思ったけど、開発効率重視で諦めました。
*組込み屋なんで速度と柔軟な処理が可能かが気になりましたが、
そんな難しいもの作るわけじゃ無いので。
431 :
デフォルトの名無しさん:2009/02/14(土) 19:15:48
E-mail欄ってほとんどE-mail欄の役割は果たしてないよね。
果たしてるスレもあるよ、カードゲームのトレードスレとか
433 :
デフォルトの名無しさん:2009/02/21(土) 13:57:06
良い時は悪い時。
悪い時は良い時。
C++/CLI なんですが、教えてください。
(スレ立てるまでもないスレで誘導されてきました)
<NewDataSet>
<OYA>
<DATA1/>
<KODOMO>
<DATA2/>
</KODOMO>
</OYA>
</NewDataSet>
こんな感じの xml データを操作したいと思います。
DATA1 なら、 DataSet.Tables[ "OYA" ]->Rows[ 0 ][ "DATA1" ] で参照できるのですが、
DATA2 にはどのようにしたら参照できるのでしょうか。
>>430 デスクトップでプログラム書く時は、組み込み脳は捨てろ。
>434
それ C++/CLI と関係ないし
Schema はどう定義されているの? XML読み込んだDataSetからSchemaを見てみたら?
そういう質問は軽くC#の書き方覚えてC#スレで聞いたほうが早いよ
438 :
434:2009/02/22(日) 14:27:57
別の方法で解決できました。ありがとうございました。
>>436 こんな感じです。
(xs:schema とか xs:complexType など、なくてもわかりそうなところは消しています)
<xs:element name="OYA">
<xs:element name="DATA1" type="xs:string" minOccurs="0" />
<xs:element name="KODOMO">
<xs:element name="DATA2" type="xs:string" minOccurs="0" />
</xs:element>
</xs:element>
このスキーマ自体も DataTable.Add や DataColumn.Add などでプログラムで作成したモノを
ファイルに落としていました。
>>437 その言葉がヒントになり、System::Xml::XmlElement などを使って解決することを思いつきました。
意外なほど簡単でびっくりです。
C#で試したらLINQに行っちゃう気が
LINQ楽なんだよな〜
3.5に移行する気ないからテストプログラムでの使用オンリーだけど
System.Xml.Linqの使いやすさは異常
言語としてのLINQサポートがなくても十分使いやすいと思う
442 :
434:2009/02/22(日) 18:19:33
確認したらウチの 2008 standard にも C# 入ってたし、覚えようかな。。。
443 :
デフォルトの名無しさん:2009/02/24(火) 23:47:48
覚えても使う機会が(ry
おれ、がめついからVS2008EEを全部インストールしたけど
一番使わないと思ったVC++を今一番使ってる
cl vjc fsi jsc ... やっぱり一番使うのはmlでっしょ
いちばん使わんのはVBだな
ILASM最高
newとgcnewって
マルチスレッドでコンパイルすれば、
スレッドセーフですか?
当然だ。でなきゃ使い物にならないだろ。
450 :
デフォルトの名無しさん:2009/03/03(火) 23:00:37
早急に回答を頂きたいのですが、
テキスト(アスキー)をバイナリに変換する方法を教えてください。
本当に急いでいます。よろしくお願い致します。
悩んでいます。本当に。
テキストもバイナリの一種ではあるのだが。とか言ってみる。w
なにをしたいの?
エスパーさん
出番ですよー
453 :
450:2009/03/03(火) 23:11:59
>>451 >なにをしたいの?
出世です。
bitconverterあたりを調べても何も出てきませんよ。ため息以外は。
本当に急いでいます。今日は寝ません。本当に。
>>453 >
>>451 >
> >なにをしたいの?
> 出世です。
>
> bitconverterあたりを調べても何も出てきませんよ。ため息以外は。
> 本当に急いでいます。今日は寝ません。本当に。
printfでいいじゃない。ヘキサダンプもバイト出力も自由自在。
456 :
450:2009/03/04(水) 00:29:54
出力させても意味はないのです。
バイナリデータにしないといけないのですよ。
回答まだですかね? 眠くなってきましたわ。
本当に。
だから冗談抜きでテキストはバイナリなんだけど
じゃあfprintf
適当に圧縮して保存すればおk
charまたはstringをintにキャストしたいという意味だろうか
ならばsprintfで
C++/CLIではC#のようなAnyCPUのEXEやDLLは作れないんですか?
>462
/clr:safe にすれば?
あーそんなオプションがあったんですね
ありがとうございます
C++/CLIを使う価値99.9%減だけどな
/clr:safeだとコンパイル通りませんでした;;
/clr:safeの場合はネイティブコードを混ぜられないからな
単なる劣化C#になっちゃうからC#使った方がいいよ
468 :
デフォルトの名無しさん:2009/03/04(水) 10:42:40
0x1234 みたいなテキストをバイナリの2byteとかにしたかったのかな...
そんな事で出世できる会社がうらやましいわw
何がしたかったんだろうな
エスパーじゃないからさっぱりわからん
GZipStream でも使えばよかったのにな
C++/CLIのコードで「reinterpret_cast」の部分を選択してコピー ( Ctrl + C ) したらVSが固まるのって俺だけ?
472 :
450:2009/03/04(水) 23:48:34
>>468 まさに、それがしたかったのですよ。
やっと理解者が現れたか。
>>468 の才能に嫉妬。w
sscanf とかでもいいんじゃないの。もっといいのあったと思うけど。
Converter でいいんじゃね?
今度はエンディアンの違いとかで騒ぎそうだけどさwww
C 互換の数値リテラルなら strtol() かな。
書き下ろしても大したこと無いように思うけど。
>>472 そうかわかったぞ
GoogleのTwitterをいち早く読んで
出世にいかそうとしてるんだ・・・・なんてなw
こんなこと言うのはなんだけど、そんなのC++/CLIでやる
ことじゃないよな・・・
しかも、C#とかJavaとかCとかならまだしも、なぜC++/CLI ・・・
いままで MFC を主に使ってた人間が C++/CLI を使い始めようというときに、
よい参考書ってないかな? ネットで調べつつ、特に問題なく書くことは出来るんだけど、
なにか見落としてそうで怖い。
他のところでも聞いてみたんだけど。。。
C++は初心者では無いけど、.NETは全くの初心者というのなら多分無い
既に知っているかもしれないが、C++も.NETも使いこなせるような人がその両方を活かすために選択するのがC++/CLI
C++を勉強するために選択するべきものではないし、.NETを勉強するために選択するべきものでもない
>478
現状で特に問題がないなら、むしろ .net framework の癖というか、ライブラリの作り方が
載っている C# の本を買ったほうがいいお
そこらに載っていることをC++/CLIで表現できれば十分じゃない?
C++/CLIで書かれてる情報だけを調べて特に問題なく書けてきたなら尊敬に値する
それアンマネージC++→C++/CLIじゃなくてManaged C++→C++/CLIだよ
ひたすら表記の違いだけが書いてあるだけ
.NET初めてなら実行時型情報なんてそもそも何のことかわからんでしょ
あのぅ、RTTIは…
>>483 そうだけど、ManagedとCLIでほとんど全部変わってるので、
結果的にC++/CLI構文の端的な解説みたいになってる。
まあマネージドの概念とかeventみたいな特殊なのは
他のところで頑張って覚えてもらうしかないが、
その場合もここで出てきたキーワードでMSDNライブラリ引けば
だいたい解説があるし。
あと実行時型情報なんて必須知識ではないし、
他のも必要なものだけ覚えりゃいいと思うよ。
人によっては value class や enum class も必要なかろう。
486 :
478:2009/03/06(金) 23:02:03
たくさん、ありがとう。
とりあえず
>>482 さんの教えてくれたサイトを読んでみます。
自分でも調べているところですが、
>>479 さんも仰られているように .NET を
まず覚えないといけなさそうですね。いただいたレスの中にさえ見覚えのない
単語がある状況からしてなんとかしないと。
>>481 意外となんとかなるモノですよ。
まあ、C++/CLI そのものではないけど、ちょっとずついろいろと触ってきてるし。
最低限C#は読めないと話にならないよ
ネット上のサンプルコードの量はVBが一番多い気がする
でもVBのよさが分からない。
489 :
478:2009/03/07(土) 19:08:36
調べていての感想は
「‥‥なんか VB みたい」
でした。w
C# は読むだけなら別に問題なくできたりします。
(ネットで拾った C# のコードを C++/CLI に置き換えたりしてお勉強してます)
一番戸惑うのは、自分が欲しい機能を持った関数がどこにあるのか見当が付けづらいことですね。
基本的な手順などは Windows の API や MFC を使う場合と大差ないような気がするので、
既存のコードを読む場合には VB でも C++/CLI でも C# でもわかるのですが、自分で書く場合に
どこにその関数があるのかわからず途方に暮れるというか。w
昨日も、マネージ拡張でちょっとしたツールを書いてたのですが、書いてる時間よりも
必要な関数の情報を集める方に圧倒的に時間を要してました。むー。
C++/CLIは異なるアーキテクチャを混ぜただけだからややこしくなる。
APIやMFCを使いたいならC++の方が制約なしに使えるし。
.NETフレームワークを使いたいならC#だろうし。
初めのうちはどちらかを選んで情報を収集したほうがいいよ。
C#やVBなら慣れてくるとインテリセンスでテキトーにメンバ探せる
だまされたと思ってちょっとVC#触ってみたら?
異次元の使いやすさでアホらしくなるからw
492 :
デフォルトの名無しさん:2009/03/17(火) 17:03:00
畑を荒らしてるのはモグラじゃないよ。
モグラの穴を利用しているネズミだよ。
モグラは肉食だから野菜は食べないよ。
穴掘る時点で荒らしてます。
アンマネージのコードで作成されたウィンドウにマネージコードのコントロールを乗せる方法ってないですか?
あります。
>>495 出来ればヒントだけでもお願いします。
あるソフトのプラグインで複雑なGUIを組みたいのですがC++ CLIの情報自体が少ない上に
こんなニッチなことをしている人はいないみたいなので。
>496
上の方のスレ読んだ?
>>497 ありました。
MFCですか。使ってないけどなんとかやってみます。
いま、C++/CLI の勉強中なんですが、C# との連携をやってみたくなりました。
C# で画面系を作って、それ以外を C++/CLI でやってみるとか考えているのですが、参考になりそうな HP とかないですかね。
自分でも調べ始めたところなんだけど、間違った方向に行かないようにするためにも最初だけは他力に縋ってみたくて。
春休みかあ
>499
C++/CLI は普通にアセンブリを作れるから、C++さえわかっていればC#からそれほど
離れている訳じゃなく、構文上の癖だけ理解すればいいんだけど、C++はできるんだよね?
>>501 C++ は特に問題ないす。
C# とかもたぶん問題ないです。書かれているのを読むだけなら普通に出来ます。
C++/CLI を調べるときに MSDN を読むとほとんど常に C# とか VB とかの関数も併記されているので
一緒に使えるんだろうな、とか思ったのが連携させたいと思ったきっかけでした。
「アセンブリ」、調べてみます。
>>500 まあ、あの質問の仕方ではそう思われるすね。たしかに。
まあ参照設定すれば見える。
それも同じソリューションなら適宜やってくれるはずだし。
従来のC関数もEXEからエクスポートできたりするわけだが。
506 :
499:2009/04/03(金) 22:25:42
返信をくれた方、ありがとうございます。
アク禁を食らってました。(某報道機関所属じゃないですw)
いただいたアドバイスを元に試験用プロジェクトをいじり倒した結果(そこまではしてないけど)、
普通に C# と C++/CLI でプログラムを組めるところまで来ることが出来ました。
‥‥ほんっとに便利な世の中になったモノです。
文字コードの変換も数行で終わっちゃうんだもの。(´・ω・`)
507 :
デフォルトの名無しさん:2009/04/17(金) 09:39:44
ageさせてもらいます。
C#の方からC++/CLIを経由(ラッパ)してアンマネージのMFCクラスを使う方法で困っています。
C#→C++/CLI→CWndのCreate()を呼ぶと、内部のAfxGetInstanceHandle()でassertが出ちゃうんです。
どうもMFCの初期化をしてやらなくちゃならない様なのですが、さっぱり情報がありません。
解決しました。
MFC拡張DLLをひっつけるのではなく、単なるクラスライブラリにしたら
うまく行きました。
お騒がせしました。
CLIはヘッダーに実行コード書くのに違和感が...
それは、単にVC++の新規プロジェクトで作成されるコードがそうであるというだけのことだろ。
そうだけど、いちいち書き直すのめんどくさいんだよな。
普通に宣言と実装に分けてくれればいいのに、
なんでこんなことになってんだろう。
C# とか他の .net 開発言語?でそうだからなんじゃない。
ヘッダとコードが別々な C/C++ の方が珍しいってどこかで聞いた。
そんな分離の話よりも、ひとつのフォームとかのコードをすべて同じファイルに記述する
人が多いことの方が気になる。ちょっと規模が大きくなるとごちゃごちゃして分かりづらいことこの上ない。
そのほかにも VB6 の頃に不満に感じてたことを、いまここでまた目にするとは。。。
VBは知らんが、今のC#はデザイナで作ったコードと
ユーザーが実装したコードは別になってる。
あれと同じようにしてくれればそれでいいんだが。
VS2010でC++に大きく手が入るってことになってるが、
ぜひ変更して欲しいところだ。
むしろヘッダに実装全部書いても問題のない言語デザインに変更してほしい
プロパティなんていちいち分離して書いてられないもんな
ただでさえ面倒な文法なのに
>>515 むしろ、ヘッダを書く必要のない言語にだろう。
D言語ではコンパイラがコンパイルするときにヘッダファイルを自動生成してくれるらしい。
テンプレートとかどうなってるのかは知らんけど。
よく知らないけど n1778 とか
まあC++はC++の文法であることが存在意義だからな。
嫌ならおとなしく最近の言語を使うしかあるまい。
そうかなあ
C++/CLIは進化したC++として使うための言語じゃないでしょ
逆に「C#アンマネージ拡張」でよかったのに
ヘッダとソース分けると
using namespaceがうざいことになる。
まーヘッダだけフルパスで書けばすむんだが。
523 :
デフォルトの名無しさん:2009/05/11(月) 10:57:13
過疎スレに質問。
C#やVB.NETってdecompiler使うと生ソース丸出しになっちゃうけど、
C++/CLI で clrsafeでないソース書いてもやっぱ丸出しになっちゃう?
マネージド部分は当然
しかし何で、見えるのを気にする奴がいるんだ。
はっきり言ってどうでもいい。どうせ見てもわかる奴は見ないし。
見たい奴はわからないだろうから。
.NETの場合はメタ情報がしっかり残ってるというのがポイントだな。
それと逆コンパイルのツールが手軽に手に入るといったところか。
ソースが逆生成できるというならそれなりのツールを使えばCからでも
相当の精度で可能なのだが、マクロやテンプレートの展開でソースが
スパゲッティになったり関数やクラス名など型情報が抜け落ちるので
その分解析しづらい。
.NETでもクラス名や関数名のメタ情報を書き換える程度の
難読化ツールを使えば解析しづらくなるから使ったらいい。
実際ある程度の規模のソースになると、仕様書もコメントもないソースを提示されても
見る気も起きないのが普通。
見られて困るといってるのはパスワードを入れるとエロ画像が拝める系のしょうもない
シェアウエアの作者と相場は決まっている。
表記法がまるで入れ替わっていて美しくないと思うけど、
仕様でミスった方はC#でいいよね。
C#
ファイナライズ ~MyClass()
ディスポーズ IDisposable.Dispose()
C++/CLI
ファイナライズ !MyClass()
ディスポーズ ~MyClass()
あったらこんなこと書かないでしょw
C#でもディスポーズを~MyClass()と定義するべきだったと思う。
533 :
デフォルトの名無しさん:2009/05/19(火) 23:57:42
C#のディスポーズは歴史的な失敗作
って、いうかGCに対応する為に
覚えなきゃならない概念が増えるのがイヤだ。
弱い参照だのトラッキング参照だのファイナライズだの
VS2010ベータが出たので入れてみたがC++/CLIでIntelliSenseが使えなかった。
>535
C++って0x対応とIntelliSense強化がメインじゃなかったっけ?
CLIじゃないC++ではIntelliSense使えるし、
C#にあったコンパイル前にエディタ上でエラー表示する機能も追加されてる。
なのになぜかC++/CLIでは
IntelliSense: 'Unavailable for C++/CLI'
と表示されてしまう。
助けてくだちい
C#からC++のクラスライブラリを使いたいので、
C++/CLIでラップするクラスライブラリを作っていたら、
何かC++のクラスのインスタンスをC++/CLIでnewすると、
例外が出てしまいますーorz
アンマネージコードのデバッグを有効にするとセーフ
回避する方法ありますか?
別のDLLのクラスをnewしようとしてるんじゃねぇ?
>538
人にものを聞くときは例外ぐらいコピペしろよ、このデコ助野郎
>> 541
すみません。
例外は以下の通り。
System.Runtime.InteropServices.SEHException はハンドルされませんでした。
Message="外部コンポーネントが例外をスローしました。"
ErrorCode=-2147467259(0x80004005)
>> 540
アンマネージの実体は、newで作るんですよね?
>> 539
C++のクラスライブラリは、static libです。
dllにしても変化なし。
C++のクラスに、virtualの関数が無ければOKです。
何故??
InteropServices の例外?
COMオブジェクトでもコンストラクタで生成してるの?
ライブラリの実績はあるんだよね
>> 543
C++の方は、DirectShow(COM)を使いに行きます。
ライブラリの方は、C++ではちゃんと動いてます。
自分も、COM辺りが怪しいのかなと思って、COMを一切アクセスしない
空のクラスをテストで作ってみたのですが、それでもダメでした。
上で書いたvirtualというのは間違いで、今色々試したところ、
クラスにメンバ変数があるとダメの様です。意味不明。
ただ、DirectShowのサンプルにあるBaseClassesというlibを流用しています。
それが引っ付いてるのですが、グローバルでstaticな変数定義とかがあるので、
その辺りで何か問題があるのかもしれないですね。
> 外部コンポーネントが例外をスローしました。
と書いてあるとおり、COM内部で例外を投げている。
原因はいろいろあるが、何れにしてもCOM内部での話なのでCLRには関係ない。
>>545 わかりました。
COMが例外出しているのですね。
有難うございましたm(__)m
547 :
デフォルトの名無しさん:2009/05/25(月) 20:02:57
DataGridViewで、下のコードで、コンボボックスをセルの中に入れたいんだが、
デフォルトが必ずブランクになる。
アンマネージの時みたいに、デフォルトのIndexって、設定できないの?
//---create a new bindingsource control---
BindingSource^ bindingsource = gcnew BindingSource;
//---add the items into the control---
bindingsource->Add("Type A");
bindingsource->Add("Type B");
bindingsource->Add("Type C");
//---create a combobox column---
DataGridViewComboBoxColumn^ comboBoxCol = gcnew DataGridViewComboBoxColumn;
//---set the header---
comboBoxCol->HeaderText = "Types";
//---data bind it---
comboBoxCol->DataSource = bindingsource;
//---add a combobox column to the DataGridView control---
dataGridView1->Columns->Add(comboBoxCol);
アンマネージの時みたいってのがさっぱりわからないが
DataGridView::RowAddedイベントかBindingSource::ListChangedイベントで
俺はVisual Stidio 2003なので、CLIは使えん。
マネージ拡張C++だけになるが、そのタイトルのスレは無いので、ここに書いても
かまわないか、それともだめか。
ここは今無き ManagedC++ スレの直系だからおけー
/clr:oldSyntax で今でも一応使えるが、もうすっかり忘れてしもーた。
愚痴。
VC6ソースなアンマネージDLL内の関数が、FLIE*な引数を要求してくるんだ。
で、C++/CLI内でラッパークラスを作ってそこでfopenした結果を渡してやると
書き込み時に例外 System.AccessViolationException が出て使えない。
この手のストリームをアンマネージな相手に渡すときに注意することは
なにかあったかなぁ...。
そのDLLはVC6でビルド済みなの?
だったらCRTのバージョン非互換の可能性もあるけど。
愚痴とか言わずに、素直に 「誰か知ってたら教えて!!」 って言えばいいのに
そしてお前が次に言う台詞は
ググレカス
くり
>>556 いやまあしかし、逆方向には渡せるし使えるからなぁ。
この辺のやっていい事か否かの判断は難しいね。
俺もね、CRTで悩んでるのよね。
DLLの中にグローバル変数置いてるんだけどさ、
CRTのデバッグ系DLLをリンクすると問題ないのに
リリース系DLLをリンクすると、アプリケーションの
初期化に失敗しましたってなっちゃうんだよね。
何なんだろうねコレCRTかんけーねーじゃん。
つーかC++/CLIにも関係ないか。
560 :
デフォルトの名無しさん:2009/06/07(日) 13:21:48
これからC++/CLIを学ぼうとおもっているのですが、
なにが良いサイトを紹介していただけますでしょうか・・・。
いまのスペックは?
500000です
私なんて52万ですよ。ホホホ
VBの関数を使えると聞いたのですがどうやって使うのでしょうか?
若しくは解説しているページはありますか?
くだスレというスレで聞きたかったのですが、dat落ちしてしまったようです
VBがVB.NETであることと、C++/CLIが何か分かっていての質問?
プロジェクトの右クリックで参照...の「新しい参照の追加」でMicrosoft.VisualBasic追加すればいい。
using namespace Microsoft::VisualBasic;
で探すといくつかサンプルあるかもよ。
>>558 出来るとやっていいは違うべ
DllMainでMessageBox呼ぶのだって同じだろ
品薄みたいなのでボランティア出品しました。必要な方どうぞ
業者さんには悪いですが、1万ほど値を下げさせてもらいました
すごく安いと思います。
amazonです
int send_data_[64];
char buf[128];
memset(buf, 0, sizeof(buf));
memcpy(buf, reinterpret_cast<char*>(send_data_), sizeof(send_data_));
これがやりたいんですが
array<int>^ send_data_;
send_data_ = gcnew array<int>( 64 );
array<Byte>^ sendBytes;
sendBytes = gcnew array<Byte>( 128 );
sendBytes->Clear( sendByte, 0, sendByte->Length );
このあとどうすればいいんでしょうか?
>>568 コピー元と先のサイズが一致してないぞ
System::Buffer::BlockCopy
あとarray<T>^は初期化されるのが保証されてるからClearはいらない
あとは、pin_ptr 刺して memcpy でいいんじゃないか?
テンプレート使ったときのメモリー処理を超低レベル関数と組み合わせるのって心情的に怖いなぁ
テン・・・プレート・・・だと?
array は int[] と書く代わりに array<int> と書いているだけで、メモリの直列性は保証されて
いるから問題ない
573 :
568:2009/06/19(金) 23:02:54
System::Buffer::BlockCopy( send_data_, 0, sendBytes, 0, send_data_->Length * sizeof(int) );
解決しました。レスありがとうございました。
574 :
デフォルトの名無しさん:2009/06/21(日) 22:03:43
checkedListBoxでフォーカスされたアイテムのテキストをTextboxに設定したいのですが
GotFocusで飛んできたときにSystem::Object^ sender, System::EventArgs^ eからどうやって
検索なり変換なりをして扱うのかわかりません、どなたかわかれば教えてください。
そもそもGotFocusはコントロール自身がフォーカスを得るときに発生するんであって
現在のアイテムが変更されたときには発生しないんだが?
576 :
デフォルトの名無しさん:2009/06/22(月) 04:27:56
いや現在のアイテムが変更されたときではなく複数のアイテムがあって
そのアイテムの選択が変わったときにTextboxの内容を変えたいだけ。
まず用語を明確に定義して
アイテムって何
現在のアイテムの変更って何
複数のアイテムって何
アイテムの選択って何
フォーカスはどこ消えた
578 :
デフォルトの名無しさん:2009/06/22(月) 08:03:07
アイテムは
int sCount = 0;
checkedListBox_A->Items->AddRange(gcnew cli::array< System::Object^ >(1) {L"A" + sCount});
で増やした項目のことをさしてます。そのアイテム(A,B)が複数あった場合にBからAに選択された時に
Aが選択されたときにAが選択されてることを知りたいです。
GotFocus 事態は発生してるんだろ?
sender のオブジェクトは何が入っているのか、中身を確認すればいいだけじゃね
>>579 GotFocusは他のコントロールから移ってきたときに発生するイベントだって
CheckedListBox::SelectedIndexChangedイベント
CheckedListBox::Itemsプロパティ
CheckedListBox::SelectedIndexプロパティ
この辺
SelectedItemを直接変更はNG
神の焦点?
>580
なるほど。WPFとかだとItemsにLabelを入れてLabelのGotFocusにdelegate食わせれば
いけるんじゃね。WinForm の場合も、Object にLabelを放り込んでできないか?
>>580 のイベントを拾うのが一番普通な気がする
584 :
デフォルトの名無しさん:2009/06/23(火) 06:13:33
なんだかこないだから、これの宣伝でもしてるのか?
C++/CLIのスレで聞くってことはフォームの範囲で聞いてるのかな。
WinFormの質問なら.NET汎用かVB,C#すれで聞いたほうが早い。
おそらく宣伝だろうね。
VC2008 C++/CLI
UDPClient マルチキャスト通信です、MSNのサンプルのままですがReceiveからかえってきません。
UdpClient^ rClient = gcnew UdpClient( RemoteIpEndPoint );
try
{
data = rClient->Receive( RemoteIpEndPoint );
}
catch( Exception^ e )
{
Console::WriteLine( e->ToString() );
}
Sendは問題なくできています。何か他に設定が必要なのでしょうか?
リモートホストが何も送ってこないだけじゃね?
589 :
587:2009/06/23(火) 23:57:49
>>588 1台のPCで複数アプリ間での通信なんです。
Socketを使って確かめたけど、送られてはいるんですよ。
JoinMulticastGroup
591 :
デフォルトの名無しさん:2009/06/25(木) 22:11:11
Form1とForm2のように複数のフォームがある場合での質問です。
Form2で定義したテキストボックスのテキストをForm1でボタンを押したときに変更したいんですが
どういう風にすれば違うフォームのオブジェクトを操作できますか?
593 :
デフォルトの名無しさん:2009/06/25(木) 22:17:02
winforms以前の問題だ
悪いことは言わん
C#からやりなさい
>>591 やり方は幾つか(てか、いくらでも)ある。質問の仕方が悪すぎる。
C++/CLIってやっぱ素のC++は使えない?
例えばポインタとか。
使えるよ。何でそう思ったの?
597 :
595:2009/06/26(金) 11:09:24
managed C++だと、素では使えなくて、
unsafeだとか要ったキガス
unsafeってそれC#
/clr:safe としない限りは使える。
ただしマネージドオブジェクトに対しては参照を使用する必要がある。
599 :
595:2009/06/26(金) 11:25:56
つまり、マネージドオブジェクトを参照しない限り、通常のC++プログラムと実行ファイルになるんだ。
>>599 C++/CLIを選択した時点でそうはならんよ。あくまでマネージコード上で実行されるネイティブコードだ。
実行時の構造はObjective-Cあたりとは逆のイメージだな。
てゆーか質問してんのか自分の思い込みに賛同してほしいのかどっちなんだよ。
601 :
600:2009/06/26(金) 11:45:43
>マネージコード上で実行されるネイティブコード
あ、間違えた。C++だけで書いても#pragma unmanaged指定しない限り基本的にマネージコードだった。
602 :
595:2009/06/26(金) 11:46:35
.NET調査です。
解析系ライブラリはC++なのでC#やVB.NETは_。
今までのC++アプリに.NET混ぜれば良いのかなと思うのですが、
どの部分に.NETを使えば良いのか調査。
603 :
595:2009/06/26(金) 11:50:44
>C++だけで書いても#pragma unmanaged指定しない限り基本的にマネージコード
C++で開発しておいて、.NETバイナリが欲しくなったら、ドットネットコンパイルすればおk?
DLL か COM のラッパー作った方がいいんじゃねぇの?
その用途ならCLRのホスティングだな。ネイティブアプリからCOMで.NETの呼び出し。
CorBindToRuntimeExあたりでググれ。
もうひとつのパターンはネイティブアプリのルーチンをライブラリ化して.NETアプリから呼び出す。
C++/CLIはこれの橋渡しみたいなもんだ。C#+P/Invokeなどでも可能。
606 :
595:2009/06/26(金) 13:11:14
>ネイティブアプリからCOMで.NETの呼び出し。
解析処理はC++で書かれてるので呼び出す.NETって何だろう?
>.NETアプリから呼び出す。
.NETアプリは現状無い。。。
C++で書かれてて、それで使えていて、あえて.NETとMIXしたい理由ってナニ?
よくあるのは画面とか入出力を.NETで簡便に作りたいというのが多いけど。
>606
解析処理で使うんだから、あえて処理の実態をC++/CLIで作る必要はないだろ
解析部はDLLかCOMにしておいて、C++/CLIからそれを呼べばいい
なんか変な夢を見て、どっかんと大きく変えて失敗した責任をC++/CLIに押しつける羽目に
なりそうだな
609 :
595:2009/06/26(金) 13:55:12
最近、会社に来る人材派遣系とか中途応募してくる人的に.NET経験者が多いということから、.NETとの関わり方を調査することとなりました。
単純思考でC++&.NETと考えたのですが、”将来○○だから、.NETと折り合いが必須」みたいなビジョンを模索中。
会社的にはITRON系OSを使ってるのでソース共有の観点から、C++をC#に書き変えたくない。
>609
あのさ、正直、あんまりちゃんと領域を考えていないだろ
たとえば漏れの知っている例で言うと、解析エンジンをクラウド上に乗せて管理周りやUIを
.Net でと言う話とかも聞くよ。だがな、解析エンジンというのはある意味ノウハウの結晶さ
強制的に置き換えても、今までと結果が変わったり、初期依存周りのパラで挙動が
変わったりするさ。そういうことを考えずに、安易に両方できるから C++/CLI とか
手を出したら痛い目に遭うよ
まずやるべきことは、既存エンジンに影響が出ないよう、DLLやCOMでラッピングして
.Net からインターフェイス経由でやりとりできるよう、エンジン周辺をきれいに設計する
ことじゃね?
611 :
595:2009/06/26(金) 15:06:21
なるほど、エンジンはC++にしておいて、
実行環境が.NETが有利な環境で画面でも.NETで作れば良いですか。
Winで.NETは少し抵抗があるが、LinuxやMac、泥井戸ではありかも。
612 :
デフォルトの名無しさん:2009/06/26(金) 17:56:54
いやWinだからこそ.NET
特にC++/CLIはWinでしか使えない
613 :
595:2009/06/26(金) 18:01:04
>C++/CLIはWinでしか使えない
そうなんかorz
GUIに関しては、C++ Builderでペタペタやってるので、超快適だお
614 :
デフォルトの名無しさん:2009/06/26(金) 18:30:00
ネイティブコードさえ混ぜなければ他の環境で動かないこともないよ
ただその場合はそれこそポインタすら使えないのでC#で全部書き直した方がマシなレベル
そんなこと、このスレで言われても。。。
やる気ないのに調査しろと命令されて、仕方なく2chに丸投げした感じだな。
617 :
デフォルトの名無しさん:2009/06/26(金) 22:26:41
地味に誤爆しました
619 :
デフォルトの名無しさん:2009/07/04(土) 18:24:19
C#2008を使い始めました
CLIのenum型を一個ずつ追加していくにはどう書いたら
いいのでしょうか?
具体的にはRegexOptionsをNoneの状態から追加して
いきたいのですが・・。
質問の意図が読み切れんが、|=
むむ
RegexOptions^ Option = gcnew RegexOptions();
Option |= RegexOptions::CultureInvariant;
これでコンパイルエラーerror C2676が出てしまいました・・。
それはこれと意味的に大体同じ 見るだに意味不明だろう
int* x = new int();
x |= 3;
623 :
デフォルトの名無しさん:2009/07/04(土) 19:04:53
enumってそもそも静的に定義を列挙して使うものじゃないのかな?
リフレクション関連を駆使すればenumの内容を動的に追加とか出来るかもしれないけど・・・。
624 :
デフォルトの名無しさん:2009/07/04(土) 19:10:38
フラグを立ててるだけで別にメンバを追加してるわけじゃない
ごく普通の使い方
列挙型は値型だから^はいらない
なるほど・・。
*Option = *Option | RegexOptions::CultureInvariant;
でコンパイル通りました。
ありがとう!
斜め上だなー……
そっちの勘違いをしてたのか。
C++/CLIでは値型をgcnewするとBoxingされた状態で生成されてしまう。
RegexOptions Option = new RegexOptions(); // C#
RegexOptions^ Option = gcnew RegexOptions(); // C++/CLI
は同じ意味じゃない。
628 :
デフォルトの名無しさん:2009/07/04(土) 19:20:23
基本的に値型に^は付けない
パフォーマンスが落ちるし、C#など他のほとんどの.NET言語ではサポートされてないので良くない
2008 でコンパイルした dll とか exe を 2003 のプロジェクトで参照って出来ないよね?
両環境用に作ってやらないとダメかな。。。
630 :
デフォルトの名無しさん:2009/07/07(火) 23:42:26
できるけど必ずしも完全な互換性があるわけではないので
可能なら避けるべき
ん〜。やっぱりそう?
プロセス間 I/F のクラスを作ってそれぞれで共用しようと思ったけど、
同じ仕組みのを 2003/2008 別個に作ることにするよ。
632 :
デフォルトの名無しさん:2009/07/14(火) 04:10:47
要素の数が多そうだからコントロールを並べるより、
Graphicsで直接書いたほうがいいかも。
C++/CLIはあんまり関係ないな。VBかC#からはじめなよ。
教えて欲しい。
VS2008 の C++/CLI でメール関連のプログラムを書いているんだけど、
System::Net::Mail::Attachment を使って添付ファイルをつけると、プログラムが
終了するまで添付ファイルに使用したファイルを操作することが出来なくなる。
で、調べて、System::Net::Mail::Attachment は使い終わった後に、Dispose すると
ヘルプにもネットの記事にも書かれているようなんだが‥‥コンパイルすると C2039 エラーで
そんなメンバはないと怒られる。
エラーメッセージを読むと「代わりにデストラクタと呼べ」とあるので試しに delete してみたら
使用したファイルを普通に操作できるようになった。
マネージ環境では delete はしないモンだと思ってたんだけど、これでいいんだろうか?
期待通りに?動くからいいんだけど。。。
Destructors and Finalizers in Visual C++
に書いてる
C++/CLI では C# のDisposeパターンはデストラクタで実装されている
そんなもんC++/CLIで作るなよ
deleteを直接呼ぶのはDisposeを直接呼ぶのと同じだから避けるべき。
C#ではusingを使うのが常識だけど、C++/CLIで同じことをやるには、
自動変数の形で使うか、それが無理ならauto_handle/auto_gcrootを使う。
delete を・・・直接、呼ぶ?
ざわ・・・ざわ・・・
別におかしくない
C#でもDisposeの呼び出しを単独で書くことはしない
絶対にusingを使うかfinallyの中で呼ばないといけない
classのメンバにDispose持ちがいたら普通に単独で呼ぶが
その呼び出しの発端は単独ではないだろ
>>641 でもその場所はどうせデストラクタ・ファイナライザの内部以外に有り得ないでしょ。
それくらいだったらいいと思うけど。
でも、C++/CLIならauto_handleをクラスメンバにできなかったっけ?
でも、単独での呼び出しを書くことがあるというのは事実だよねって話
>>643 そいやC++/CLIってメンバに^付きで書かなきゃメンバのDisposeも勝手に読んでくれるんだよね
ファイナライザでDisposeは絶対ダメ
ファイナライザでメンバのマネージオブジェクトにアクセスするのは原則禁止
誤解を招くなぁそれ。C++/CLIのファイナライザ構文なんて
勝手にDispose呼び出しを生成してんぞ。
引数付きのDisposeパターンを守れってだけでしょ。
647 :
645:2009/07/18(土) 00:36:47
すまん言葉足らずだった
ファイナライザで"メンバの"Disposeはダメ
648 :
634:2009/07/18(土) 11:29:44
thx
こんなに沢山の人がいたんだ。。。
だいぶ慣れたと思ってたけど、まだわかってないことが多いみたい。
もっとお勉強するよ。
今回のは
>>638 の auto_gcroot を使ってみようと思う。
>>637 C++ が好きなんだもん。w
auto_handleはマネージクラス・マネージコード内、
auto_gcrootはネイティブクラス・ネイティブコード内で使う。
C++好きなのはいいけど.NETに慣れる意味でも一度はC#やってみたほうがいいよ
なぜ本スレでさえアンマネージコードとの相互運用という本来の目的以外での
C++/CLIの使用に否定的な人が多いのか理解できるはず
相互運用ならC++/CLIはいい。もうC#でDllImportする気が起こらない。
いや、DllImportさえ簡単に貼り付けられればC#で問題ない、という程度のことではないから。
654 :
634:2009/07/19(日) 00:54:11
>>649 thx
勘違いして入れ替わってたよ。
auto_gcroot は変数定義した後に代入できるけど、auto_handle は変数定義の時の
初期化でしか代入できないとか、多分、何かの都合があるんだろうけど、面白いね。
>>650 どっちでも一応書ける。
だいたい画面系に C# 、それから呼ぶライブラリ関連に C++/CLI を。(最初にそうお勧めされた)
いまいち「目的外での C++/CLI に否定的」ってのがよくわかってないんだけど。。。
感覚的にはわかるような気もするけど、言語として C# の方に抵抗を感じたりして。
ドトネトにブリッジする理由は???
.NET開発の補助として使うものであって、決して
「.NETが使える便利なC++」ではない
適材適所という言葉があってだな(ry
660 :
デフォルトの名無しさん:2009/07/22(水) 08:06:27
この天気、日食どころじゃねーな。
それ食えるのか?
ドトネト材の適所って何?
Java+JNIと比べるとはるかに優れているな。
だれか、javaVM用のC++/CLI?を作ってくれ。
ハンドルの指すアドレスの最初の4バイトは何のデータですか?
昔.NETを勉強したときに、
オブジェクトヘッダーは同期ブロックインデックスと
クラス定義へのポインタで構成されてると
読んだ記憶があるんですが
おしえて。
フォームアプリのテキストボックスとかにデータバインディングで、
DataTable の要素を関連づけて入力値を管理したい。
ここで、テーブル中のレコードが1つの場合はいいんだが、複数あって
かつ、バインドするレコードを動的に変更したい場合ってのはどうすれば
いいのだろうか?
よくわからなかったので、
・バインド用に同じ構造のテーブルを用意して
・そこにレコードをひとつだけ作り
・そのレコードに元テーブルの任意のレコードの値をコピーする
・フォーム終了後にもとのテーブルのレコードに値をコピーし直す
方法で使おうとも思ったのだけど、もっと直接的な方法がありそうな気がする。
いかがだろうか。教示いただけると嬉しい。
>>666 ここよりもC#、VB、ADO.NETスレあたりで聞いたほうが早いと思うよ。
そう? じゃ、C# のスレに移動するよ。
thx
669 :
デフォルトの名無しさん:2009/07/27(月) 23:44:45
質問です。
自転車って制限速度が無いと聞いたことがあります。
一方で、系車両は制限速度30km/hと聞いたことがあります。
自転車に関してはどうなのでしょうか。
自転車に速度計装着の義務付けが無い以上、
制限速度自体、無意味なことだと思うのですが。
無料で難読化できるソフトはありますか
ある
>>669 軽車両には車両種別による速度制限はありません。標示の制限に従ってください。
C++/CLI的には見られたくないところはネイティブコードで書けばいい
674 :
デフォルトの名無しさん:2009/08/04(火) 06:16:44
PictureBoxの左上を座標(0,0)としてマウスでクリックしたときの
PictureBoxの左上からのオフセット座標を取得したいのですが
いい方法ありますでしょうか。
>>674 取得したいも何も、MouseClickイベントで受ければ
MouseEventArgsに入ってるだろ。
676 :
デフォルトの名無しさん:2009/08/06(木) 06:26:04
質問です。
初期化時にPictureBoxに格子上の線を描画したあと、PictureBox内をクリックした場所に図形を描画したんですけど
再度クリックしたときにその図形を消したい場合は一度RefreshやClearなどをしたあとに格子上の線・図形は再度描画
するしか方法ないですよね。
___
←樹海|
 ̄|| ̄ ┗(^o^ )┓三
|| ┏┗ 三
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
>>676 毎回描画し直します。
C++/CLIに限らない.NET Frameworkの使い方についてはC#かVB.NETのスレで質問することをお勧めします。
(C++/CLIにしかない機能を使わないならC++/CLIを使うこと自体お勧めしません)
679 :
デフォルトの名無しさん:2009/08/12(水) 11:52:55
質問です。
プロジェクトの新規作成で自動的に作成されるFrom1.hですが、
簡単に一括で、それらしい名前(CalcMainForm.h等)に変換で
きる方法はありますか?(自動生成されるコード内のClass名称
なども追従したい)
今は、手作業でファイル名の変更後、コード内の名称を置換しています。
VSのアドインとかでリファクタリングのツール探してみては
ファイル名はファイルのプロパティの名前
クラス名はクラスのプロパティのName
簡単と感じるかは人による
俺はウィザード直後に即削除。
新しく任意のFormクラスを作成→コードゴリゴリw
683 :
デフォルトの名無しさん:2009/08/23(日) 00:11:09
クラスを参照渡しするときに、mainで渡すと問題なく実行できるのですが
クラスの中で渡すと下記のエラーが発生してしまいます。
"演算子 '%' は、値型または ref クラスのインスタンスにのみ適用できます"
このエラーを回避するためにはどのようにすればいいでしょうか?
おk:
main(){
A^ a;
B^ b;
b->(%a);
}
マズー:
ref class Z{
A^ a;
B^ b;
b->(%a);
}
クラスの中に処理は直接書けない。メソッドの中に書く。
エラーを回避とかそういう次元の問題ではないのでまずはC#かC++を一通り勉強するべき。
これからC++/CLIを勉強しようと思うんだけど
どんな本読んだらいいのかしら?^^
VisualStudio2008ExpressEditionをイジリ倒す。
C++とC# (またはVB7-)をどのくらい理解してるかでいろいろ違ってくる。
両方まだなら手を出さないほうがいい。
というかC++もC#も両方使いこなせる人にしかC++/CLIを使う意味がないし使う必要もない。
C++はGOF本を読むレベルっす。オブジェクト指向設計も任せてネ★
MFCはまぁそこそこ。ATLはさっぱり。WTLはみたこともない。
C#? なにそれ?
マイクロソフトローカルな糞言語になんてまったく興味ねぇんだよっ
C++/CLIのスレで、よくそんなことがいえるな。
C++/CLIがよりいっそうマイクロソフトローカルな糞言語なのを理解しているのか?
所詮はつぎはぎで緊急避難するときだけ使う補助言語だからな
ワロタ
>>689は自分がどこに書き込んだのかもわかってないのか
自分は C++/CLI については 実践C++/CLI 極めるための基礎と実用テクニック を読んだだけだな。
あとは C# まで含めてどうとでもなったよ。
ただ。最初のコードを見る限り、基本からわかってないと思うけど。
C++ がどうとかではなくて、プログラミングの基礎からって意味で。
ちゃんと基礎からやった方が、結局は時間の節約になると思う。
つまり、。NETについて学ぶにはまずC#を習得して来い…と。
C#…なぁ。Javaならまだ学ぶ気あるんだけど。
(J++1.0が出た当時にちょろっとかじったから、基本はあるんだよ^^
でも最近はJava5とかいうのらしいから、勉強しなおしかな^o^;)
どうせ5年もしないうちに「なかったこと」にされるような言語なんて
学ぶだけ資源の無駄だしなぁ。どうしようかなぁ。ああー。
C#が世に出て既に8年ほどたつが、まだなかったことにはなってないな
C++/CLIのほうがよほど…
これって何に使うの?
C++Builderの代わり?
てか、基礎のある人間なら、わざわざ覚えるってほどのモンでもないだろ。
MFC わかるんだよね?
J++のWFC、delegate、J/Directを理解してるならそれはそれですごいな。
delegateはC#のとも一味違うぞ。
C#やったことなくてもC++/CLIは使えるかもしれないけど
C#で.NETの流儀に慣れてないと.NET的にはとんでもないコードが確実に出来上がる
>>699 慣れてないせいか、Disposeルールが
なんか気持ち悪い。
>>700 あれはネイティブなC++でいうところの単なるデストラクタなんだが……
そう思っているなら確実に
>.NET的にはとんでもないコード
を書いてるな。
MFCのDLLがあってCLIでラップしてVB.NetとC#で利用しようとしてるんですが
unsigned char *の配列データを受け渡しするところがあって
VB.NetだとこれはByte()になるんだろうけどどういう変換すればいいのでしょう?
Byte()の引数ってCLI側での表記方法も分からないし
Byte[] に変換するなら、
cli::array< System::Byte >^ a = System::Text::Encoding::GetEncode( "エンコードの種類" )->GetByte( "String型の文字列" );
ただ、Byte[] に変換したいのではなくて、String から char* に変換したいんだろうから、だったら、
::sprintf( a, "%s", "String型の文字列" );
‥‥本当に出来る。w
正しい?方法は StringToHGlobalAnsi でぐぐれ。
いえ、画像データなんで本当にバイト列が必要なんです
バイナリデータであるByte()やbyte[]を渡したいだけかもしれないぞ。
もしそうなら、cli::array<System::Byte>^型が対応するのでこれを使えばいいだけ。
自分はcli::array<unsigned char>^と書く方が好みだがまあどっちでも同じ。
unsigned char* だから普通に byte 配列だろなんとなく。
分かりにくいので以下の説明は BYTE* で行くな。
まず、BYTE* -> byte[] はそのままでは無理。byte[] を
構築してコピーする。
BYTE source[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
array<Byte>^ arr = gcnew array<Byte>(10);
pin_ptr<Byte> p = &arr[0];
memcpy(p, source, 10);
次に、byte[] -> BYTE* は可能。上でやってるが、pin_ptr でおk。
pin_ptr<Byte> p = &arr[0];
ちなみに、VB だったら GCHandle で Pinned しなさい。IntPtr が
取れる
まとめ。なんで両方の方向の説明したかというと、コピー発生させ
たくないならマネージで byte[] なバッファ作成して(ここポイント)、
それ使うといいよみたいな。
いやcli::arrayってByte()と同じ形なの?
双方向でやりとりするんだけどコピーではなくて共有して書き出すからポインタを変換しないといけない
例えば
DLL側
array<Byte> ^GetData();
VB側
dim bytes as Byte[] = dll.GetData()
bytes[0] = 255;
みたいな使い方がしたい
逆にVB側のByte[]を渡してDLLに中身を書き込ませるような処理もある
ポインタのキャストがうまくいかないんだけどどうすればいいの?
cli::array< Byte >^ と Byte[] は同じ型だよ。
言語による表現の違いなだけ。
うまくいかないって、どんなエラーなわけ?
エラーというかキャストの仕方が分からない
711 :
707:2009/08/25(火) 22:56:55
>>708 ・・・伝わってねぇかなぁ。その例なら
void Hoge(BYTE* p) {
p[0] = 255;
}
void Piyo(array<Byte>^ arr) {
pin_ptr<Byte> p = &arr[0];
Hoge(p);
}
array<Byte>^ GetData() {
array<Byte>^ arr = gcnew array<Byte>(10);
pin_ptr<Byte> p = &arr[0];
Hoge(p);
return arr;
}
これで分かる?
>>711 GetDataは元がunsinged char *なんで
それごどうにかしてarray<Byte>^にしないといけないんですが
仮にarray<Byte>^にして渡した後ってVBのガーベージコレクタに殺されたりする?
それはまずいな
ということはVB->DLLの方向の時だけByte[]で受け取って
DLL->VBの時はラッパーDLLでアクセスを仲介するような関数を容易するべき?
例えばWriteByteみたいな関数を入れてDLLの保持してるメモリはVBでは触れないようにした方がいいの?
managed側のメモリはpinすればunmanaged側でいじれるが、
逆は出来ないんじゃないかなぁ。
基本はコピーになるはず。
unmanaged側でメモリを保持して、managedにはハンドルやクラスの形で
渡してやるのがセオリーだと思うよ。
なんかdllの仕様まで変更できるような話になってるが
メモリへのポインタを渡したいのか、ただデータを入れた配列を渡せればいいのかわかんね。
キャストの仕方っても、どんなところでなにをやろうとしてるのかわかんね。
dynamic_cast とかをキーワードにして調べてみたら? 自分で。
>>715 じゃあGetDataの部分はIntPtrを返してVB側でMarshal.ReadByteするのが適切?
>>716 CLIのラップDLLはGCの影響は受けないでしょ
>>717 ポインタを渡して中身を双方で共有して直接いじりたい
メモリは確保した方が解放するというのがルール
そう。
byte[](マネージバイト配列)ってのはマネージヒープに確保
されてそこにあるやつ。アンマネージで勝手に確保した
なぞの領域にあるところをさしたポインタってやつはそうじゃ
ないから当然変換できないしコピーするしかない。
マネージにあるやつのポインタ化(pin_ptr) は可能だが、逆は
無理。
結局シームレスにいじりたい領域はマネージ側で確保して
やるしかない。アンマネージポインタしかないんなら、コピーとか
マーシャリングとかしかない。
CLS 非準拠だと CLI は一応 T* みたいな形式も持ち運べは
するんだけどな。準拠させるためには IntPtr とかのやり取りと
なる。
…VB じゃなく C# ならそのポインタシームレスに使えるのだがな。
とりあえずラップDLLに読み書き専用の関数を持たせることで解決しました
プロパティの書き方で、ヘッダー(h)とソース(cpp)に分離する方法を教えてください
property float X
{
float get();
void set(float value);
}
ヘッダーにこのように書いたところ、
1>Vec3.obj : error LNK2020: 未解決のトークン (06000008) Fwm.Math.Vec3::get_X
1>Vec3.obj : error LNK2020: 未解決のトークン (06000009) Fwm.Math.Vec3::set_X
と言われたので、ソースに
float Vec3::get_X() { return 0; }
と定義してみたのですが書き方が間違っているようでコンパイルが通りませんでした
Vec3::X::get
そこかぁあああああああ!!!
ありがとう!!
インテリセンスに出ると思うんだがな
ところがどっこい出なかった
CLRでも<summary>指定したらインテリセンスにでまつか?
CLRが何だと思ってるのか詳しく聞かせてもらいたいな
C++/CLIとC++ネイティブのコード共存で開発してるんですが、
C++ネイティブクラスのメンバーをDataBindingするのって不可能ですか?
こんな感じでやってみたいのですが、System::Object^型にsrcを変換できずに
コンパイルエラーを吐きます。。。
class src {
public:
int m;
};
src = new csrc;
textBox1->DataBindings->Add(gcnew Binding("Text", src, "m"));
※textBoxのTextプロパティにintの値を設定しようとしているのは、例なのでスルーしてください。
中でリフレクション使ってるんだからできるわけがない
マネージクラスでプロパティとしてラップする
C++/CLIでも<summary>指定したらインテリセンスにでまつか?
出るよ
/// <summary>
/// クラス解説
/// </summary>
public ref class Test
って書いたら
<summary>
クラス解説
</summary>
って出た。<summary>消したら
クラス解説
って出た。なんか違うかな・・・
XMLドキュメントを出力するオプションは有効になってる?
ありがトン
なってませんでした
有効にしたら隣に〜.xmlってのが出来たけど
やっぱりインテリセンスには出てこねぇ
735 :
デフォルトの名無しさん:2009/08/30(日) 12:38:18
デリゲートで関数のポインタを変数に渡そうとしてるんだけど
うまくいかない。
delegate void startCallback();
startCallback^ cb_start;
cb_start = gcnew startCallback(start);
fn = &cb_start;
cb_startがデリゲートの変数なのですが。
どうしたらいいでしょう?
&はいらん
^の意味解ってる?
737 :
735:2009/08/30(日) 12:50:37
>>736 確か似そうでした。
で、&を外してみたところ
error C2440: '=' : 'startCallback ^' から 'void (__clrcall *)(void)' に変換できません。
とかいうエラーが・・・。
どういう意味なのでしょう?
デリゲートと関数ポインタは別物だから。
>>735 fnやstartがどう定義されているか見えないけど、
fn = start でいいでない?
740 :
735:2009/08/30(日) 17:37:50
fn=start だと
error C3867: 'start': 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&start' を使用してください
となって、fn=&startとすると737 のエラーとなるという。
fnもstartも同じ型でvoid (*dsfunctions::start)(void)なのだが、
c++/CLIだとだめらしい。
関数ポインタを渡したいだけなんですがどうしたもんでしょう?
もしかして、スタティックでない関数をその書式で使用しようとしてない?
ちがうなら、下みたいにすべきじゃね?
cb_start = gcnew startCallback( [startメンバを含むクラスインスタンス], start );
生のC++でもクラスのメンバ関数というか仮想関数の関数ポインタはカオスだからなぁ。
マネージドとネイティブでポインタや関数の互換はないから
関数自体をどちらかにラップするしかないだろう。
以下は関数ポインタとデリゲートの使用例
int native1(int x, int y) { return x+y; }
class Foo {
public:
static int nativeS(int x, int y) { return x+y; }
int nativeV(int x, int y) { return x+y; }
};
delegate int MyCallback(int x, int y);
ref class Hoge {
public:
static int ManagedS(int x, int y) { return x+y; }
int ManagedV(int x, int y) { return x+y; }
};
int main() {
Hoge^hoge = gcnew Hoge();
Foo foo;
int (*f1)(int, int) = &native1;
int (*f2)(int, int) = &Foo::nativeS;
int (__thiscall Foo::*f3)(int, int) = &Foo::nativeV;
//int (__clrcall *f4)(int, int) = &Hoge::ManagedS;
//int (__clrcall Hoge::*f5)(int, int) = &Hoge::ManagedV;
MyCallback^ f6 = gcnew MyCallback(Hoge::ManagedS);
MyCallback^ f7 = gcnew MyCallback(hoge, &Hoge::ManagedV);
System::Console::WriteLine(f1(100, 1));
System::Console::WriteLine(f2(100, 2));
System::Console::WriteLine((foo.*f3)(100, 3));
System::Console::WriteLine(f6(200, 6));
System::Console::WriteLine(f7(200, 7));
return 0;
}
clrcall型の関数ポインタはdelegate作成時にしか使用できない。
^は「へ」って読むんだぞ
へー
実践C++/CLI 極めるための基礎と実用テクニック
アマゾンに入荷したね
え。出品者からお求めいただけます、じゃなくて?
うん。昨日見たときアマゾン新ピンが2800円ぐらいで売ってた
今見たら終わってたw
ていうかアマの技術書は一度の入荷数が少ない
近くの書店で取り寄せすればすぐだ
自分が確認したときにはすでになかったから、釣りかと思ったわ。
情報ありがとう。普通に取り寄せてみるよ。
C++の保守チームからCLIのチームに移ってきた新参者です。
C++の頃に良くみた無名名前空間でのリテラル文字定数の宣言
namespace {
const std::string EngFileName = "XXXX"
const std::wstring JpnFileName = L"XXX"
}
と同じことがしたくて
namespace {
const String^ EngFileName = "XXXX"
const String^ JpnFileName = L"XXX"
}
にしたらコンパイラ君に怒られてしまった。
もしかして、CLIではできない?
const char* const EngFileName = "XXXX" みたいにC言語風に明記しないとだめなのでしょうか?
適切なクラス作って静的メンバにするのが.NETのやり方
そうなんですか!! ありがとう。
C++のころは、cppで使いまわすだけの定数をヘッダーに追加すると、
結構、コンパイルに時間がかかったので、無名名前空間に押さえ込んでました。
あ、そういえば自動生成されるコードもCLIは全部、ヘッダーに展開されますね。
無名空間はだめで、静的メンバであればOKってのが理解できないので、
ちょっくらテストしてきます。 注意点とかあれば教えていただけますか?
>>754 なんか分かってなさそうなので念のために言っておくけど、
適切なクラスというのはref classのことだぞ。
>754
const は String^ にはつけられないから literal 使え
initonlyも忘れないで。外へ公開するメンバなら特に。
initonly と literal はアセンブリ化したときの文字列確定のタイミングが違うから気をつけろ
やば。initonly を完璧に忘れてた。。。
ありがとうございます。
準備した参考書では、literalもinitonlyも明記がなかったので、なかなかできませんでしたが、
ようやくテストできました。(結果もOKでした。)
ただ、literal と static const の違いだけが分かりませんでした。
どちらも同じ結果になるので・・・。
CLIで追加された宣言なので、literalを使えば良いのかな?
それにしても、CLIの情報は探すのが大変ですね・・・。みなさんはどうしてますか?(どうやって覚えました?)
>760
String^ は追跡参照なのでポインタのようにアドレスが一定ではない。だから、const
指定できない。(const が有効だとGCがString^を移動できない)その代わりに literal が
あると思っていい
literalって単なるアセンブリのメタデータだし
763 :
デフォルトの名無しさん:2009/09/13(日) 01:12:57
C++/PLO
うむ、一文字しかあってない
pin_ptrのようにオブジェクトの移動を制限する方法って他にないでしょうか
スコープを抜けてもずっと固定していたいんですが
GCHandleを割り当てる
C++からの移植で下位のような変換を行ってみました。
clss NameHolder
{
NamaInfo _Name;
public:
NamaInfo getNameInfo();
}
ref clss NameHolder
{
NamaInfo^ _Name;
public:
NamaInfo^ getNameInfo();
}
C++からの移植で下位のような変換を行ってみました。
// C++の場合
clss NameHolder
{
NamaInfo _Name;
public:
NamaInfo getNameInfo();
}
// CLIの場合
ref clss NameHolder
{
NamaInfo^ _Name;
public:
NamaInfo^ getNameInfo();
}
C++の場合だと、getNameInfo()で取得したNamaInfo を呼び出し元で変更しても、
元の値(NameHolder)は値が変わりませんが、 CLIの方だと変わってしまいます。
ハンドルだからといわれそうですが、CLIで値を保持するクラスより、クラス側の値を取得するのは
一般的にどのように実装すべきでしょうか?
value class使え
ありがとうございます。
value class を使用することで、目的の動作ができました。
ただ、疑問が残りまして、該当クラスには、セッター関数もありまして
(1) void setNameInfo( NamaInfo^ Name) { _Name = *Name; }
(2) void setNameInfo( NamaInfo& Name) { _Name = Name; }
(3) void setNameInfo( NamaInfo Name) { _Name = Name; }
もどれも同じ挙動でした。(3)にすると、実体がコピーされて遅そうなので、
(1)か(2)かと思ったのですが、一般的にはどちらを使うものなのでしょうか?
実体コピーしなきゃ結局他でNameInfo変更したときに影響するだろ…
便乗ですまない
>>770の(1)はマネージでないとダメで、(2)はアンマネージでないとダメだと
思っていたんだけど、両方とも許される状況っていうのはあるもんなの?
773 :
772:2009/09/17(木) 02:37:45
value classだと(2)は問題なく参照となり、
(1)はボクシングが行われた上で、ハンドルを取得できる、と考えたけどあってるのかなぁ。
難しいなぁ
public value class NameInfo
{
public: property Int32 ID;
};
public ref class NameHolder
{
NameInfo _Name;
public:
NameInfo get(){return _Name;}
// void set(NameInfo^ Name ){_Name = *Name;}
// void set(NameInfo& Name ){_Name = Name;}
void set(NameInfo Name ){_Name = Name;}
};
int main(array<System::String ^> ^args)
{
NameInfo Name;
Name.ID = 10;
NameHolder Holder;
Holder.set(Name);
NameInfo Buf1 = Holder.get();
Console::WriteLine(Buf1.ID);
Name.ID = 20;
NameInfo Buf2 = Holder.get();
Console::WriteLine(Buf2.ID);
return 0;
}
どれも結果は 10、 10と表示され、値は登録後の値は変わりませんでした。
根本的に、なんか勘違いしてますかね?
メンバがいつの間にかハンドルじゃなくなったな
NameInfo^ _Name; これに変更。
NameHolder() { _Name = gcnew NameInfo(); } これ追加
してやって見ました。結果は同じでした。C++からハンドルが一つ増えただけで、こんなにも苦労するとは・・・・
もとのC++の記述と同じようにかきゃいいと思うけどな
value classならほぼ変わらんし
移植って時点で思想とか意味ないだろうし
元のコードにあわせてハンドルじゃなくしたのかと思ったけど、あっさりハンドルに戻すとか
ほんとに移植しようとしてるのかが疑問
>>770 ちなみに、ネイティブなC++だったら、そのsetの引数の型は、NameInfoかconst NameInfo&にするとこだよね。
自分だったら、NameInfoにするかなあ。コピーのコストが心配っていうならそもそも値型にしないし。
読み取りだけの引数にconst付けないのは嫌だ。
値型の場合、T& → T%、T* → interior_ptr<T>へと機械的に変換すればいい。
その上で、他言語で使えないのでconstは削除し、値型のハンドルも使わないのが自分の方針。
ちなみに、(1)の値型のハンドルで、
>>774のようにボックス化されていない(ハンドルでないもの)を実引数にする場合、
ボックス化(ようは新しくメモリ確保してそこへ実引数をコピー)が行われるので(3)より遅いよ。
>>779 横からごめん
> 他言語で使えないのでconstは削除
というのはどういうこと?
>>780 C#などからそのメソッドを呼ぶ場合、あたかもconstはなかったかのように無視される。
そのため、自分はC++/CLIは他言語から呼び出すことを前提に使っているので、
C++/CLIの段階でpublicな型のpublicなメソッドの引数・戻り値にはconstを付けようと思わないというだけのこと。
つまり、これは自分1人の考えなんで、気にせずconst使うという人も中にはいると思う。
いろいろとありがとうございます。
先輩にきいて、値を保持したいのであれば、このクラスを移植すれば良いとともらったソースを移植中です。
中身を見ると、シングルトン形式で値を保持しているようです。
C++であれば const NameInfo& Name なので、const NameInfo% Name にしたらコンパイラ君に怒られて
パニックになってしまいました。
C++の時は、メンバー関数の後ろをはじめ、constをつけるように、強く教育を受けたので、CLIでもかんばって
つけようとするとことごとく怒られて・・・・。
NameInfo という値で渡すのがよさそうなので、これでいって見ようかと・・・。
教えていただいた 機械方式 NameInfo% にしたいですが、先輩に % は関数内で値を変えるとき意外は使うなといわれて・・・。
くそー 何でconst NameInfo% て読み取り専用にできないだよ!!!!
constが付いていたら、自動生成した読み取り専用ラッパーに包んで返す。
……とかどうなんだろう。やっぱ駄目かなあ。
プロパティでgetterのみにすればいいんじゃないか?
値型^って普通使わないよ
一番効率悪いし他の言語では全く使えない
String型だけなんで^なしで宣言出来ないんだろう…
あとshortの列挙型に-32768が使えないのもわからん
C#なら通るのに
String型がcharの配列なので。
shortの-32768(全ビットon)は未定義値の代わりなので。
即レスありがとう
Stringの内部構造までは見たんだけど、つまりC++/CLIでは配列はスタックに作れないってことなのかな
動的にサイズを変えられるんだからヒープまたはマネージドヒープと考えるのが妥当なんじゃないの
^なしに記述しているのだって、別にスタックに配置している訳じゃないし
String型だけなんで^なしで宣言出来ないんだろう…
ref class だから
C++のRAIIパターンでDispose持ちの参照型を扱おうって意図だから
参照型でもこれはOKなんよ。
実際はDisposeのシグネチャを持ってる必要もないんだが。
ただ何故かStringとarrayは宣言できんのね。
deleteしたオブジェクトのファイナライザって呼ばれないの?
C++/CLIのデストラクタ=C#のDisposeだと思ってたんだけど
C#でもDisposeしたときはGC.SuppressFinalizeでファイナライザの呼び出しを抑制するが?
ファイナライザの呼び出しが有効になってるとGCのパフォーマンスに悪影響を与える。
明示的にDisposeが行われた後はファイナライザ呼び出しは不要なはずなので
ファイナライザを呼び出さないようにGCに指示するようになってる。
アンマネージリソースを直接持ってない限りはファイナライザ(!の方)は定義しない方がよい。
~ClassA()や!ClassA()はDispose()やFinalizerそのものではない。
正確にこのコードになるわけじゃないのだけれどイメージとして捉えて欲しい。
~ClassA() { }
!ClassA() { }
上2つを使っていると、ここからはコンパイラが生成する。
void Dispose(bool disposing) {
if (disposing) ~ClassA(); else !ClassA();
}
void Dispose() {
Dispose(true); GC.SuppressFinalize(this);
}
void Finalize() {
Dispose(false);
}
C/C++室より、案内されてこちらのスレに来ました。
void test(int x[]){cout << sizeof x << endl;return;}
int main(array<System::String ^> ^args)
{
int x[] = {1,2,3,4,5};
test(x);
cout << sizeof x << endl;
}
■出力結果
4
20
なんで両方とも20にならないんでしょうか?
CLI一切関係ないな
仮引数が配列表記でも実際はポインタとして渡される
>>799 >CLI一切関係ないな
失礼しました。
void test(int x[]) が void test(int* x)として解釈されるという事ですね。
誘導元のほうでも親切な方が教えてくれました。
ありがとうございます。
ハンドル使ってるから脊髄反射したんだろう
>>801 つーか内部的にMSIL使ってる言語は気持ち悪いんだよ
全部こっちに回すから頼んだ
803 :
デフォルトの名無しさん:2009/10/10(土) 23:57:23
出力結果から想像できるだろうに。
近頃の子は自分で考えるってこと、しないのかねぇ。
804 :
デフォルトの名無しさん:2009/10/11(日) 09:13:05
void func(int *a);
とかアドレスを引数にする昔の関数に
int b;
func(&b);
などとすると、
cli::interior_ptr<Type>' から 'int *' に変換できません。
とかいうエラーが出てしまいます。
どうしたらいいでしょうか?
reinterpret_cast<Int32*>(&b)
つーかその例でそのエラー出るか?
>>804 pin_ptr<int> p = &b;
func(p);
>>804 int bがref classのメンバーなのかな。ローカル変数だったら出ないだろ。
C++/CLIの仕様書ってある?
C++で言うとISO/IEC 14882:2003みたいな奴
それがあれば簡単な質問ぐらいならC++スレでレスしてやってもよい
仕様書じゃなくて規格票だったorz
ぐぐるかecma行って372見てこい
>だめじゃんISO規格じゃない
これが言いたかったのか(笑
IETF > Ecma > ISO
日本の車もウインカーレバーが右で、ISO規格と違うからな。
イギリスは右ハンドルでもISO通りに左なのに。
要するにISOってオナニー規格か
そういえばC#のコンパイラの言語バージョンを選ぶオプションは
ISO3.0みたいな表記だったな
818 :
デフォルトの名無しさん:2009/10/14(水) 09:55:30
現在自民党が民主党を批判していること、
おまえが言うか、とあきれている。
ヤトウの仕事だから。
>>818 今まで民主党が批判してた事を民主党がやったりもするわけですよ
ヨトウになるとはそういうこと
>>818 スレタイを読めないおまえが言うか、とあきれている。
Side-by-sideでexe作ろうとしてるけど
M$っていろんな意味で終わってるなw
保険屋の仕事を作るようにしてあるシステムと同じだろこれw
仕事にしてる奴らは悲惨だろうな。
後には何も残らん。
とりあえずMS叩くと出来る奴っぽく見えるよなw
824 :
デフォルトの名無しさん:2009/10/21(水) 01:14:26
エラーがなくせずに困っています。
関数のポインタを渡すときに
error C3867: 'SM::f': 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&SM::f' を使用してください
などとエラーになってしまいます。
Move(f);
のfが関数なのですが・・・。
どうすればよいでしょう?
1.0系でとりあえず行くのかと思ったらいきなり2.0かよw
6月の時点で2.0ベータが出てただろ
てす
830 :
デフォルトの名無しさん:2009/11/30(月) 21:33:43
TreeViewで追加したノードAとノードAの子のノードBのチェックボックス
にチェックしようと思ったんですが以下のコードではうまくいきませんでした。
各ノードの子が存在するかを調べてチェックする以外の方法でコードがすっきりする方法ありますか?
int countMax = treeView_Action->GetNodeCount(true);
for ( int i = 0; i < countMax; ++i )
{
treeView_A->Nodes[i]->Checked = true;
}
> 各ノードの子が存在するかを調べてチェックする
これで十分すっきりすると思うが
再帰を知らないとか言うのか?
どなたかくだすれスレを立ててくだすれ
こんだけ過疎ってんだから無駄だろ
聞きたきゃここで聞けばいい
失礼します。
Iniファイルの読み書きを行いたいのですが、うまくいきません。
エラーは出ないのですが、ファイルが作成されないので・・・。
すいませんが、どこが間違っているのか教えてください。
よろしくお願いします。
using namespace System::IO;
using namespace System::Text;
using namespace System::Reflection;
using namespace System::Runtime::InteropServices;
[DllImport("kernel32.dll")]
static UInt32 GetPrivateProfileString(String^ lpAppName, String^ lpKeyName, String^ lpDefault, StringBuilder^ lpReturnedString, UInt32 nSize, String^ lpFileName);
[DllImport("kernel32.dll")]
static UInt32 WritePrivateProfileString(String^ lpAppName, String^ lpKeyName, String^ lpDefault, StringBuilder^ lpReturnedString, UInt32 nSize, String^ lpFileName);
// Iniファイル読み込み
private: System::Void IniRead(System::Void){
String^ path = Path::Combine(Path::GetDirectoryName(Assembly::GetEntryAssembly()->Location), L"test.ini");
StringBuilder^ sb = gcnew StringBuilder(1024);
UInt32 ret = GetPrivateProfileString(L"DB_INFO", L"SERVER_NAME", L"default", sb, sb->Capacity, path);
System::Console::WriteLine(sb->ToString());
}
// Iniファイル書き込み
private: System::Void IniWrite(System::Void){
String^ path = Path::Combine(Path::GetDirectoryName(Assembly::GetEntryAssembly()->Location), L"test.ini");
StringBuilder^ sb = gcnew StringBuilder(1024);
sb->Append("TestVal");
UInt32 ret = WritePrivateProfileString(L"DB_INFO", L"SERVER_NAME", L"default", sb, sb->Capacity, path);
}
835 :
834:2009/12/12(土) 02:26:25
開発環境を書くのを忘れてました。
WindowsXP SP3
Visual Stadio 2010 Beta2
です。
C++/CLIでわざわざDllImport?
/clr:safe なのでは
WritePrivateProfileStringの引数がなんでGetPrivateProfileStringと同じなんだよ。
MSDNをみろよ。
BOOL WritePrivateProfileString(
LPCTSTR lpAppName, // セクション名
LPCTSTR lpKeyName, // キー名
LPCTSTR lpString, // 追加するべき文字列
LPCTSTR lpFileName // .ini ファイル
);
>>833の手前初心者スレに池とはいえんな(笑
初心者スレではCLIスレへ池と言われ
CLIスレでは初心者スレへ池と言われ・・・
841 :
sage:2009/12/12(土) 20:27:27
今まで
Diagnostics::Debug::WriteLine("文字列");
Diagnostics::Trace::WriteLine("文字列");
の違いで Debug は、Debug版コンパイルのみに出力され、
Traceは Debug/Release版 双方で出力される・・・と思って、
Debug::WriteLine("文字列");
を使ってきました。しかし、先ほど
DefaultTraceListener^ dtl = (DefaultTraceListener^)Debug::Listeners["Default"];
dtl->LogFileName = "C:/debug.txt";
としてみると、Release版でも C:/debug.txt に出力されて
しまいました。
Debug版でのみ、出力させるには
#if defined(_DEBUG)
Diagnostics::Debug::WriteLine("文字列");
#endif
としないとダメなのでしょうか?
>>841 Conditional属性ついてるから、その認識で間違ってないはずだが
Trace::Listeners
Debug::Listeners
は同じコレクションをポイントしていて、片方を変更すればもう片方も変更になる。
>>841-842 C++/CLIではC#やVB.NEtのようにConditionalAttributeを認識しないから、
自分で#ifdef使って、呼び出しを消す必要がある
846 :
841:2009/12/13(日) 01:26:19
>>845 ConditionalAttributeを認識しない・・・んですね。
初耳です。勉強になりました。
>自分で#ifdef使って、呼び出しを消す必要がある
とても面倒ですね。自前のDEBUG関数を定義して、
それでまとめて処理させるべきなんでしょうかね。
847 :
834:2009/12/13(日) 02:10:44
>>838 遅くなってすいません。
無事にできました、ありがとうございます。
>>846 関数を使わなくても、#define でいいじゃないか
#ifdef DEBUG
#define DEBUGOUT Trace::〜
#else
#define DEBUGOUT
#endif
>>846 ちなみに、.NET2からは(Debug|Trace)::WriteLineよりはTraceSourceを使う方がいいことになってる
VS 2005で、System::Windows::Forms::ToolStripを継承して、'MyToolStrip' クラスを実装しました。
ビルドすると、ツールボックスの中にMyToolStripが現れましたが、
Formに貼り付けようとすると、
ツールボックス アイテム 'MyToolStrip' の読み込みに失敗しました。アイテムはツールボックスからから削除されます
と表示され、ツールボックスから消えてしまいます。
それならと、既に貼り付けてあるFormクラスの中のToolStripを、MyToolStripへコードを直接書き換えて
みました。コンパイルも通り、実行もできるのですが、FormのデザインをGUIで開こうとすると
デザイナの読み込み時に 1 つ以上のエラーが発生しました。
C++ CodeDOM parser error: Internal Error
が表示され開けません。.NETの標準クラスを継承して、フォームデザイナで使いたいのですが、
どうすれば良いのでしょうか?
とりあえず、これで動いてる。どこかで下手打ってるのだろう。
ソースをさらせ。
public ref class MyToolStrip : System::Windows::Forms::ToolStrip { };
コンストラクタで例外投げてるとかじゃね
これはC#でも同じだが、Controlのコンストラクタに副作用があると
デザーなーの表示に失敗することがあるよ。
まあそういう場合は、親がデザイナかどうか判定して挙動を変える必要があるわな
855 :
850:2009/12/16(水) 22:16:49
プロジェクトをWindowsフォームで新規作成して、
>>851 のクラスを定義した所、問題無くツールボックスの中にMyToolStripが現れ、
フォームに貼り付けできました。
プロジェクトのランタイムプロパティが
「純粋 MSIL 共通言語ランタイム サポート (/clr:pure)」の場合問題ありませんが、
当方「共通言語ランタイム サポート (/clr)」で開発をしており、
その場合、850で書いたような状況になります。ノートPCのサブ開発環境でも
再現するので、再現性はあります。
皆さんの所では問題ありませんか?
知るか
再現云々言うんだったらまずソースを出せ
857 :
850:2009/12/16(水) 22:31:48
>>856 Windowsフォームを新規作成して、ランタイムを
共通言語ランタイム サポート (/clr)に変更するだけなのですが・・・。
ソースを貼ります。
Form1.h
#pragma once
#include "test.h"
namespace test {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
858 :
850:2009/12/16(水) 22:32:30
Form1.hの続き
/// <summary>
/// Form1 の概要
///
/// 警告: このクラスの名前を変更する場合、このクラスが依存するすべての .resx ファイルに関連付けられた
/// マネージ リソース コンパイラ ツールに対して 'Resource File Name' プロパティを
/// 変更する必要があります。この変更を行わないと、
/// デザイナと、このフォームに関連付けられたローカライズ済みリソースとが、
/// 正しく相互に利用できなくなります。
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
//
//TODO: ここにコンストラクタ コードを追加します
//
}
859 :
850:2009/12/16(水) 22:33:28
Form1.hの続き
protected:
/// <summary>
/// 使用中のリソースをすべてクリーンアップします。
/// </summary>
~Form1()
{
if (components)
{
delete components;
}
}
private:
/// <summary>
/// 必要なデザイナ変数です。
/// </summary>
System::ComponentModel::Container ^components;
Form1.h のつづき
#pragma region Windows Form Designer generated code
/// <summary>
/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
/// コード エディタで変更しないでください。
/// </summary>
void InitializeComponent(void)
{
this->components = gcnew System::ComponentModel::Container();
this->Size = System::Drawing::Size(300,300);
this->Text = L"Form1";
this->Padding = System::Windows::Forms::Padding(0);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
}
#pragma endregion
};
}
test.h の中身
#pragma once
public ref class MyToolStrip : System::Windows::Forms::ToolStrip { };
プロジェクトのプロパティでランタイムを共通言語ランタイム サポート (/clr)に変更して
コンパイル。ツールボックスの中にMyToolStripが現れるので、Form1へ貼り付け。
以上です。
だらだらコピペするんじゃなくて、再現する最小限のソースを作って貼るんだよ
>>861 最小限を貼っているようにしか見えないが。
//
//TODO: ここにコンストラクタ コードを追加します
//
つーかここでいう最小限は天順とtest.hを貼ればいいだけじゃないかw
天順→手順
何で貼るのかというと、レスをみた人が追試するためにはるんで
そもそも見る気失せるような書き方しちゃ手伝ってくれる人が減るだけだな。
>プロジェクトのプロパティでランタイムを共通言語ランタイム サポート (/clr)に変更して
ソースが見当たらないが。IDEの制限だったような。pureじゃだめなん?
MyToolStripにpublicついてねぇぞ
そもそもデザイナってILONLYじゃないアセンブリ読み込めたっけ
とりあえずソリューション内に別プロジェクトを作って、
そっちにMyToolStripを作って、メインプロジェクトから参照すれば、
/clr /clr:pure とどちらでもいけた。
>>850の問題とは関係ないかも知れないが、
自分もデザイナが見れないエラーに悩まされ、さっき解決したから載せとく。
(12).ToString();
上記のように、ToStringに直値指定するとデザイナが見れなくなる。
コンパイルも通り、実行もちゃんと反映されてるから、見つけるの苦労した
873 :
872:2009/12/23(水) 13:56:38
>>872に追加
InitializeComponent関数内でのToString直値がダメな原因だった。
そもそも、InitializeComponent関数はコードエディタで変更してはいけないらしい
InitializeComponent関数外でToString直値は正常に使える。
874 :
デフォルトの名無しさん:2009/12/29(火) 16:20:36
皆さんはC+/CLIでポインタを宣言する場合、
^や*を型の後ろにつけます?それとも変数名の頭につけます?
書籍等だと以下の形式が多い気がするのですが、
マネージとアンマネージで統一感がとれないような・・
[マネージ]
String^ hoge
[アンマネージ]
char *hoge
どっちも型名の直後につけるかな。
アンマネージでは変数の方につける人が多いみたいだけど、
ポインタ型っていう型名だから、変数の側につけるのには違和感があるんだ。
C#では構文上も型名の一部ということになってる
int *x, y, z;
と書くと全てポインタになる
877 :
デフォルトの名無しさん:2009/12/29(火) 21:16:52
>>875 >>876 C++/CLIだと型名の一部にはならないよね?
例えば以下のコードはコンパイルエラーとなる。
class Hoge{};
int main()
{
Hoge* x,y;
x= new Hoge;
y= new Hoge;//yがポインタとして認識されないため、コンパイルエラー
return 0;
}
CとかC++と同じ仕様なんだろうけど、
ポインタ型っていう考えでいくとなんでコンパイルエラーとなるのかが説明できない。
C#が特殊な気がする。
なんかCLIやってる人って可哀想だね
C/C++の構文がおかしいだけで意味上はポインタ型
不自然なのは誰の目にも明らかだからわざわざC#では変えたんだろ
どっちでもいいけどマネージとアンマネージで変えたりせずにどっちかに統一するべき
「つもり」は「意味」にならんだろ
ならんだろうね
あの記法でポインタを表そうとすると、
関数ポインタ型を表す場合、型の方に*をつけることは出来ないので、
変数の方に*をつけてポインタを表すというのは一定の合理性がある。
一定の合理性があるな。
884 :
デフォルトの名無しさん:2010/01/02(土) 10:56:36
CLIでcallocするとどうなるの?
普通にアンマネージヒープが割り当てられるだけ
当初VB.netで作った業務アプリをVC++/CLIに移植したのですが、
実行速度もメモリ使用量も違いがあるようには思えず、
WinXPだとVC++のランタイムが別途必要になった分、劣化したような気にすらなるのですが、
VC++/CLIの利点って、上達すれば業務アプリでもあるものなのでしょうか?
ない
既存のアンマネージコードをマネージコードと混ぜるためだけに仕方なく使う言語
その場合も使用範囲は最小限に留めて,できるだけVBやC#で書くようにするのが正しい
gcnewをなめるなよ
MS自身ですら避けてるからな
マネージからアンマネージ→DllImport
アンマネージからマネージ→CLRのホスティング
XNAくらいだっけ、MS製で使ってるの
CLI 使ってる時点で速さが変わらないのは当たり前
アンマネージドコードを利用しないと速くなる訳が無い
新規にアンマネージコード書くなら普通のネイティブなDLLとして作ってC#からDllImportする形の方が扱いやすい
XNAってなんで早く動くの?
ゲームってDirect3Dに描画命令を送ってからの内部の処理が重くてボトルネックになるので
C++/CLIを挟もうがゲームロジックがマネージコードで書かれてようがあんまりパフォーマンスに影響しない
895 :
デフォルトの名無しさん:2010/01/15(金) 20:33:57
ネイティブのアプリケーションがプラグインに飛ばしてくるコールバックを拾って、
それをC#に渡して処理するアプリケーションを書きたいのですが、
その辺のノウハウについてまとまっている情報源をご存知の方はいませんか?
イベントかインターフェイス経由でC#にそのまま流せばいいだけでしょ
全く悩むところなんかない
>>896 C++/CLIで書いたコードって、普通にやるとマネージコードにコンパイルされると
思っていたのですが、ネイティブから呼ばれても大丈夫なのでしょうか。
/clr なら相互に呼び出し可
/clr:pure の場合、マネージドコードからネイティブ方向の呼び出しは可
/clr:safe の場合、不可、ただしP/Invokeは可能。
Win32APIのコールバックを直接C#で処理したいなら、
特殊なものでなければ、P/Invoke+Delegateで対応可能。
最悪COM経由でどうとでもなる
>>898 分かりやすい解説感謝します。
そういうことなら、普通にアプリ指定のコールバック関数を定義して、
そこからC#のコードを呼べばよさそうですね。ありがとうございます。
教えてください。
まず、VC2003 で作った一部マネージコードの混じったアンマネージの .lib ファイルがあります。
これを(ちょっと事情があって) VC2003 でアンマネージの .dll にくるみました。
で、これを(さらに事情があって) VC2008 の C++/CLI でマネージの .dll に
DllImport を利用してラッピングしようとしています。
ここで、ライブラリとして公開する関数はいくつかあるのですが、その中にパラメータとして
構造体を参照形式で持つモノがあります。
構造体の中には std::string で定義した要素を持つモノもあるのですが、これを先のアンマネージの
.lib の関数内で参照したり変更したりするとアクセスバイオレーションで不正終了することがあります。
同じ構造体内の int 型などの要素の値を参照/変更しても変な値が入ることがあります。
そこで、この構造体の std::string 型の要素を char[] 型に変更して試したところ、特に問題なく期待通りの動作をしました。
マネージ dll を介さずに、アンマネージの .dll を使用する分には元のままでも問題なさそうです。
この原因ってなんでしょうか。
また、回避方法があれば教えていただけないでしょうか。
ゲームでCOM経由はどうなんだろう
DllImport、P/Invoke+Delegate とは違うんだよね
どんな時に使うんだろう…どう使い分けるのかの時点で悩みそうだ…
>>901 そんな使い方するのがおかしい。
C++/CLIでアンマネージドとマネージドを混ぜたら、あとはマネージド側から使うだけ。
>>901 真っ先に思い浮かぶのは、メモリ確保周りの問題。
2つのDLLでstd::stringが同じメモリ確保ルーチンを使うようにしてみたらどうなる?
例えば、両方でグローバルなnew/delete演算子関数を定義するとか。
#include <new>
void* operator new(std::size_t n)
{
if (void* p = HeapAlloc(GetProcessHeap(), 0, n))
return p;
else
throw new std::bad_alloc();
}
void operator delete(void* p)
{
if (p != 0)
HeapFree(GetProcessHeap(), 0, p);
}
std::stringに対して自前のアロケータを指定するというのでもいい。
VC2003ってことはManaged C++か
>>901 C++/CLI以前の問題じゃないか、それ
基本的にDLL境界をまたいで、FILE*のようなCランタイムオブジェクトや
malloc()/newで確保されたメモリ渡すときは要注意
Aで確保されたメモリをBで開放するときは、モジュールAとBが同一の
ランタイムにダイナミックリンクしてないと即終了
C++のstd::stringなんぞをインタフェースに使ってたらそういうことは
当たり前に起きる
>>904の指摘はそれを前提にしている訳だが、
C++標準ライブラリクラスは、そもそも実装の大半がヘッダにあり、
バージョンが違えばそのバイナリ互換性すら怪しい
俺はそもそも設計として、C++標準ライブラリクラスをDLLインタフェースに
使うことは全くオススメしない
設計を見直すべき
C++/CLIも.NET総合もくだすれが発見出来ないので、おそるおそるここで聞かせて頂きます。
DLLを制作しているのですが、DLL中からフォームを呼び出すレベルで詰まっています。
DLL自体は動的に外部の別のDLLから呼び出され、初期化関数が走らされる感じで、
IDEからWindowsフォーム(CLR)を追加し、フォームを何も弄らない状態で
DLLの初期化関数中で(gcnew hoge::hogeForm())->Show();
しているのですが、Showの呼び出し中に固まってしまいます。
メッセージループが存在しないせいかと思い、Application::Run();してから
Showしても同様です。
通常のexeを作成し、メインウィンドウのインスタンスをもう一つ同様にShowしようとしても
同じく死んだので、何か初歩的なレベルでミスしているのだと思うのですが、
エスパーしていただけないでしょうか……。
Application::Run(gcnew hoge::hogeForm());
>>903-907 のみなさま、ありがとうございます。
特に
>>906 さん。なんとなくわかってはいたのですが、言葉できっちり表現がされていて助かります。
>>904 さんの方法も試した上で、週明けに改めて説明を行って対応方法を変更する方向で動きます。
>>908 (gcnew hoge::hogeForm())->Show(); じゃフォームのハンドルを押さえているヤツが居ないな
Formは表示中GCの対象外になるようになってる
913 :
908:2010/01/17(日) 04:44:50
>>909 >>911-912 どうもありがとうございます。
Application::Run(gcnew hoge::hogeForm());も試して見ましたが、同様にそこで処理が止まります。
(次の行でデバッグ用の出力を入れていますが、出力されません)
ネイティヴ関数の状態から(CLRでない空のプロジェクトにグローバル関数を置いた状態から)、
/CLRを追加し、Windowsフォーム(CLI)の追加、
グローバル関数を記述したcppからのmscorlib.dllやフォームのヘッダの参照、
Application::Run(gcnew hoge::hogeForm());と、やっていることはこれだけで、
以下のような感じです。
#include <windows.h>
#using <mscorlib.dll>
#include "hogeForm.h"
int __stdcall Init() {
Application::Run(gcnew hoge::hogeForm());
}
ManagedとUnmanagedの区分け等、何か気を遣うところがあるでしょうか。
>>913 Init()を呼び出す。
フォームが表示される。
フォームを表示したままinit()が終了して呼び出し元に戻ってくる。
というのを期待しているとかしてないよね?
915 :
908:2010/01/17(日) 05:15:53
>>914 フォームが表示されることは期待しています。
上のコードでは、フォームを終了しない限り、処理が呼び出し元に返ってくることは期待してません。
とりあえずこれで動いてる
// testd8.cpp managed
#using <System.dll>
#using <System.Windows.Forms.dll>
using namespace System;
using namespace System::Windows::Forms;
void Init() {
Application::Run(gcnew Form);
}
// testd9.cpp native
void Init();
int main() {
Init();
return 0;
}
cl /clr /c testd8.cpp
cl /MD testd9.cpp testd8.obj
917 :
908:2010/01/17(日) 18:35:12
>>916 同等の物を書いてみましたが、確かに動作しています。
呼び出し方法やら何やら、片っ端から確認していって、原因を特定しようと思います。
どうもありがとうございます。
汎用的なDLLでいきなりApplication::Runとかされたらヤだな
919 :
デフォルトの名無しさん:2010/01/21(木) 22:57:19
質問ですが、
タイトルバーがなく3Dの縁があるフォームを作るには
どうすればいいのでしょうか。
環境はVC++2008です。
フォームのプロパティ設定の中には見つかりませんでした。
C# タイトルバー 消す
とかでググれば一発
調べても分からない場合でもそういう質問はC#かVBスレでしたほうがいい
>>920 なるほど、.NETなら共通なんですね。
わかりました、ありがとうございます!
922 :
デフォルトの名無しさん:2010/01/23(土) 11:53:50
Visual Stuidion C++ 2008での書き方を教えて。
フォームクラスだと、イベント関数とかすべてヘッダの方に生成されるけど、
独自メソッドもすべてヘッダーの方に書くものなの?
それともプライベート関数はcppの方に書くとかルールがあるの?
俺はヘッダは宣言のみにして、ソースファイルに定義。プロパティも同じ。
全部ヘッダに書いて、cpp削除でもいいんじゃね?w
自分もそうかな。プロパティはヘッダに書いちゃうこともある。
C# とかは分かれてないからどっちでもいいと言えばいいんだと思うけど、C/C++ の伝統がそうさせる。w
925 :
デフォルトの名無しさん:2010/01/24(日) 16:24:16
.NET言語って全部コンパイル速いからな〜、ヘッダに書いといて無駄なコンパイル発生しても
ほとんど気にならないレベル
926 :
デフォルトの名無しさん:2010/01/26(火) 00:04:55
temp_buf[TEMP_BUF_SIZE], temp_buf2[TEMP_BUF_SIZE]は'\0'で初期化されてます。
文字列がtem_bufに格納され、その中から"search"を探索し、文字列が見つかれば
そのsearchのs以降の文字をtemp_buf2にコピーしようとしています。
が、実行すると暴走してしまいます。
*pの使い方がおかしいような気もするんですが、
原因が分かりません。
環境はgccですが手元にpcが無いので詳細は分かりません。
もし必要でしたら調べてきます。ごめんなさい。
char com[] = "search";
char *p = strstr(temp_buf,com);
if( *p != NULL ){
if( sizeof(temp_buf2) - &(temp_buf[TEMP_BUF_SIZE-1])-&(*p)+1 < 0){
fprintf( stderr, " buffer overflow 1\n" );
exit(-1);
}
strcat( temp_buf2, p );
printf("%s",temp_buf2);
}
よろしくお願い致します。
スレチですね
失礼します
930 :
デフォルトの名無しさん:2010/01/26(火) 22:01:38
VC++ 2008 ExpressEdition で Form::Controlクラスを継承した独自コントロールクラスに
枠をつけるにはどうすればいいのでしょうか?
プロパティ設定には境界線の項目がありません。
それらしきメソッドも見当たりません。誰か知っていたら教えてください。
>>930 VisualStyleRenderer使って自前で描画する
プロパティも自分で実装する
あと
>>920の3行目
要するに、
コモンコントロールのそれぞれは自前で描画していたんですね。。
良く分かりました、ありがとうございます。
>>933 Windowsで動作するほぼ全てのウィジェットレンダラーは
Win32GDIをまとめ直したものに過ぎないんだが、
最近の人はWin32APIで直接アプリを作ったりする経験がないから自前で描画する、という感覚がつかみにくいのかもしれんねぇ。
それはそうと、コントロール描画くらいならC#で実装した方が簡単だよ。
>>934 動作のコアとなる部分がC++で作ってあって、DLLとしてまとめてあるんだけど、
GUI側をC#で作るとなると、呼び出すのに定義作り直すのがめんどうで、
どうしてもこの言語に手を出さざるをえないのよね。
>>935 ええー。今時、WindowsでGUIを書くのにC++を使うなんて、マゾとしか思えん。
逆ならわかるがねぇ。
GUIをC#で書いてモデルや下回りをC++でってなら。
937 :
932:2010/01/26(火) 22:36:49
すまん枠描くのはControlPaintだった
よっぽど深い相互運用しない限りはexport/DllImportの手間を差し引いてもC#の方が楽だし
安全だし取り回ししやすいよ
938 :
935 :2010/01/26(火) 22:44:13
いわゆる普通の ウィンドウ枠は WS_BORDER だぞと。
普通は CreateParams オーバーライドして Style プロパティに
WS_BORDER のビットフラグ立てたのにするだけ。
3D 枠とかも基本は一緒な
いやWindowsネイティブのコントロールに対応しない独自描画のカスタムコントロールの場合は
枠も自分で描くべき
標準のコントロールもそうなってる
そもそもコモンコントロールだってただの画像だしな
C++/CLI と C# embedded C++ どっちがいい?
3択な上に比較対象がおかしい。
何がしたいのかも判らんのに「どれがいい」も糞もないけどな。
WM (CE) の話で C++/CLI or C# or eVC++ のどれか、っていうなら
…いや、やっぱり好きにしろとしか言えないw
(C++ in C#) の意味では?
これからはC++0x/CLIの時代だろ
敵はObjective-C++0xだな
今までC++とC#ばかりいじくっていたが、Google様にお伺いを立てると
実行速度は
C++ > C++/CLI > C#, VB.NET らしい
C++/CLIの方が効率よく高速なMSILに変換される仕組みでもあるのかな?
無いし実際同じ
C++/CLI はネイティブコードで書いた部分の実行速度が速いからとかじゃ?
ボックス化された値型とかトラッキング参照とか駆使して低レベルな最適化をやれば速くなるかもしれないけど
JITのバージョンアップであっさり逆転したりしそうだ
検証に使用したコードがないと話にならんだろ。
C#よりもC++/CLIの方ができることの制限が少ないから、速いコードを書くこと余地は大きいだろうね。
C++はUnsafeだから、こういうのを単純に比較しても意味ないと思うんだけどな。
一般に将来的な最適化の妨げになるしなあ
C++/CLIの速さはこの2つを足して2で割ったところとしているんでしょ。
マネージ部分の速さ = C#, VB.NET
ネイティブ部分の速さ = C++
まあアンマネージだけで書いたらC++もC++/CLIも変わらんわな
マネージだけで書いたらC++/CLIもC#も変わらんわな
測ってないけど
くだすれ落ちているのでここで失礼します。
unmanagedなバイト配列(unsigned char* byteArray, int len)を
managedな配列(array<Byte>)に変換したいと考えています。
とりあえずインデクサをつけて一個一個代入していったり、
Addしてみたりしたのですが、随分と処理に時間を喰ってしまいます。
そこまで速度に神経質なプログラムでも無いのですが、
もっとスマートに配列を変換する方法は無いものでしょうか。
Marshal.Copy(IntPtr, byte[], int, int) とか。
960 :
958:2010/02/01(月) 12:04:10
>>959 Marshal探せば良かったんですね。
Managedメモリを固定して確保してからmemcopyとか、明後日の方向に向かって努力していました……。
どうもありがとうございました。
C++/CLIは/clr /clr:pureでは常にunsafeであり、
Cタイプの配列を使った場合のパフォーマンスが良い。1〜2割程度。
C++/CLIの暗黙のP/InvokeはSuppressUnmanagedCodeSecurityAttributeがデフォルトでオンなので、
C#のP/Invokeに対してパフォーマンスが良い。2〜3倍程度。
C#のP/InvokeにSuppressUnmanagedCodeSecurityAttributeを追加するとその差はなくなる。
またC++/CLIのリンク時に/CLRUNMANAGEDCODECHECKを付けると、
この属性がオフになるためパフォーマンスはC#と変わらなくなる。
C#でも一応スタックに配列取ったりマネージ配列やアンマネージ配列にポインタでアクセスしたりできるよ
マネージドで書いとけばいいのにやたらアンマネージド呼び出して
結果マーシャリングコストばっかりかかってパフォーマンス悪化とか、ありそうな話
VS2010でインテリセンス外されたね
どうせ2008でもロクに機能してなかったし所詮ちょっとした橋渡しに使うだけだからどうでもいいけど
MSにとってのC++/CLIの優先度の低さは凄いな
MS特有の言語なんて使う奴は馬鹿
もともとから橋渡し専用言語だ
勘違いした奴が悪い
J言語とかと同じような扱いだろ
役に立たない機能ならなくなってもいい。
だがC++/CLI自体がなくなっては困る。
たとえ使う頻度が少なくても。
.Netごとなくなればいいだろ
MSがネイティブコード非推奨なら、unixと棲み分けができて丸く収まるんじゃないの
思うんだけど
/clr:safeとかclr:pureだったりするとインテリの構文解析も
それほど手間がかからないと思うんだが。
STLとかほかのヘッダ使うときより
それならC++/CLIなんかわざわざ使いません
それだとC++/CLIあんまり使わないだろ。
ネイティブいらないなら普通C#使う。
あえてC++/CLIを使う必要があるのってどんな時だ?
C++用ミドルウェアのC#用ラッパー作る時
HOGEHOGE *hoge
open(&hoge)
ってやるとhogeを自動的に割り当てるCで書かれたDLLがあって
これを呼び出そうとしてるんだけど
マネージド側からHOGEHOGE*をどう渡せばいいのか分かりません
cli::interior_ptr<Type>' から 'HOGEHOGE **' に変換できません。
とか言われてます
978 :
977:2010/03/06(土) 14:29:41
事故解決
クラスメンバに定数を持たせるにはどうすれば?
Hoge.Func(Hoge.Options.Option1)みたいな
literalかinitonlyで変数を宣言する
literalはコンパイル時定数でinitonlyは普通の読み取り専用フィールド
でもクラス外から見えるような定数をliteralにするのはバージョン管理上の問題があるので
.NETではなるべくinitonlyを使う
public ref Class HOGE
{
public:
ref struct Options
{
literal Int32 Option1=1;
};
};
ってやるとInt32の前に;が必要ですとか言われます
調べた限りこれでいいと思うんだけどなんででしょう
literal System::Int32 Option1 = 1;
>>981 同じですね
コンパイラにliteralが認識されてないみたいです
青色になってるからIDEは認識してるみたいなんですけどね
なんか宣言とか要るんですか?
ああ、原因が分かりました
C++のヘッダをincludeした所から下がunmanagedでコンパイルされてたみたいです
それより
>>979のような使い方をするならenum classにすればいいのに