おそらく、.NET開発でデファクトスタンダードに最も近いであろう
C++/CLIについて語ろうぜ!
このスレはC++および.NET Frameworkについて一定以上の知識を持っている人が対象となります。
.NETのクラスライブラリの使い方といった質問は Visual Studioスレにお願いします。
前スレッドはこちら
くだすれC++/CLI(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1142144110/l1
dat落ち姉妹スレ
C++/CLI part3
http://pc12.2ch.net/test/read.cgi/tech/1206447234/l1
http://pc11.2ch.net/test/read.cgi/tech/1142147319/l1
http://pc8.2ch.net/test/read.cgi/tech/1126450441/l1
managed C++ やろうぜ!! 002
http://pc8.2ch.net/test/read.cgi/tech/1139043535/l1
探検
くだすれC++/CLI(初心者用)part2
■ このスレッドは過去ログ倉庫に格納されています
2010/03/15(月) 09:41:19
436デフォルトの名無しさん
2011/11/23(水) 22:13:47.85 自作したグローバル関数を書くのはどこが一番よろしいですか?
プロジェクト全体でつかうような関数です。
stdafx.hに書いたら
error LNK2005: "int __clrcall testfunc(void)" (?testfunc@@$$FYMHXZ) は既に stdafx.obj で定義されています。
ってエラーが出るのですが( ;∀;)
プロジェクト全体でつかうような関数です。
stdafx.hに書いたら
error LNK2005: "int __clrcall testfunc(void)" (?testfunc@@$$FYMHXZ) は既に stdafx.obj で定義されています。
ってエラーが出るのですが( ;∀;)
437デフォルトの名無しさん
2011/11/23(水) 23:10:37.60 そらそうだろ
C++/CLIというか、C++の基本から勉強し直してこい
C++/CLIというか、C++の基本から勉強し直してこい
438デフォルトの名無しさん
2011/12/07(水) 06:58:01.68 インクルードガード
439デフォルトの名無しさん
2011/12/07(水) 07:29:07.57 関数にstaticかinlineつけて内部結合にするがよろし
440デフォルトの名無しさん
2011/12/07(水) 15:36:45.42 ガードしても意味無いだろ。
別々のソースでインクルードされてコンパイルして、
それらをリンクしたら同じ名前の関数が複数出来上がってるわけだし。
と、ついでに質問者に説明してみる
別々のソースでインクルードされてコンパイルして、
それらをリンクしたら同じ名前の関数が複数出来上がってるわけだし。
と、ついでに質問者に説明してみる
441デフォルトの名無しさん
2011/12/07(水) 18:59:29.54 >>440
スマヌ
スマヌ
442デフォルトの名無しさん
2011/12/12(月) 18:04:16.59 あるサイトを参考にUnicodeからshift_jisに代えようとしてるんですが以下のコードで
cli::array<unsigned char^>^ ToShiftJis(System::String ^ unicodeStrings)
{
System::Text::Encoding^ unicode = System::Text::Encoding::GetEncoding(1200);
cli::array<unsigned char>^ unicodeByte = unicode->GetBytes(unicodeStrings);
System::Text::Encoding^ s_jis = System::Text::Encoding::GetEncoding(0);
cli::array<unsigned char>^ s_jisByte = System::Text::Encoding::Convert(unicode,s_jis,unicodeByte);
cli::array<unsigned char^>^ s_jisChars = gcnew cli::array<unsigned char^>(s_jis->GetCharCount(s_jisByte,0,s_jisByte->Length));
s_jis->GetChars(s_jisByte,0,s_jisByte->Length,s_jisChars,0);
return s_jisChars;
}
をビルドすると
error C2664: 'int System::Text::Encoding::GetChars(cli::array<Type> ^,int,int,cli::array<wchar_t,dimension> ^,int)' : 4 番目の引数を 'cli::array<Type> ^' から 'cli::array<Type,dimension> ^' に変換できません。
とエラーが出るのですが、どうすればよいのでしょう
どなたかご教示ください。
cli::array<unsigned char^>^ ToShiftJis(System::String ^ unicodeStrings)
{
System::Text::Encoding^ unicode = System::Text::Encoding::GetEncoding(1200);
cli::array<unsigned char>^ unicodeByte = unicode->GetBytes(unicodeStrings);
System::Text::Encoding^ s_jis = System::Text::Encoding::GetEncoding(0);
cli::array<unsigned char>^ s_jisByte = System::Text::Encoding::Convert(unicode,s_jis,unicodeByte);
cli::array<unsigned char^>^ s_jisChars = gcnew cli::array<unsigned char^>(s_jis->GetCharCount(s_jisByte,0,s_jisByte->Length));
s_jis->GetChars(s_jisByte,0,s_jisByte->Length,s_jisChars,0);
return s_jisChars;
}
をビルドすると
error C2664: 'int System::Text::Encoding::GetChars(cli::array<Type> ^,int,int,cli::array<wchar_t,dimension> ^,int)' : 4 番目の引数を 'cli::array<Type> ^' から 'cli::array<Type,dimension> ^' に変換できません。
とエラーが出るのですが、どうすればよいのでしょう
どなたかご教示ください。
443デフォルトの名無しさん
2011/12/12(月) 21:18:25.11 MFC の CString 使ったら?
444デフォルトの名無しさん
2011/12/13(火) 04:07:52.11 Encoding.GetChars()ってChar[]とるんじゃないのか?
関係ない型をボックス化して何がしたいの?
というか、Encoding.Convert()の時点で既にSJISになっているし
関係ない型をボックス化して何がしたいの?
というか、Encoding.Convert()の時点で既にSJISになっているし
445デフォルトの名無しさん
2011/12/13(火) 13:58:16.46 Hoge hoge[x];
の要素数はsizeof(hoge)/sizeof(hoge[0])で取得できますが
Hoge *hoge=new Hoge[x];
の要素数はどうやって取得すればいいですか?
の要素数はsizeof(hoge)/sizeof(hoge[0])で取得できますが
Hoge *hoge=new Hoge[x];
の要素数はどうやって取得すればいいですか?
446デフォルトの名無しさん
2011/12/13(火) 17:05:42.47 >>442
unsigned charに ^ は要らないと思うが
unsigned charに ^ は要らないと思うが
447デフォルトの名無しさん
2011/12/13(火) 20:58:34.89448デフォルトの名無しさん
2012/01/13(金) 18:39:32.59 System::Stringからchar*に変換する関数を書きました。
半角256文字以上のテキストを投げると、255文字+\0でめられてしまいます。
下記をどのように修正すればいいでしょうか?
#include <msclr/marshal.h>
inline char* toPtChar(const String^ Text)
{
String^ temp = (String^)Text;
msclr::interop::marshal_context^ context = gcnew msclr::interop::marshal_context();
return (char*)(context->marshal_as<const char*>(temp));
}
半角256文字以上のテキストを投げると、255文字+\0でめられてしまいます。
下記をどのように修正すればいいでしょうか?
#include <msclr/marshal.h>
inline char* toPtChar(const String^ Text)
{
String^ temp = (String^)Text;
msclr::interop::marshal_context^ context = gcnew msclr::interop::marshal_context();
return (char*)(context->marshal_as<const char*>(temp));
}
449448
2012/01/13(金) 18:45:03.89 >半角256文字以上のテキストを投げると、255文字+\0でめられてしまいます。
半角256文字以上の文字列を投げると、255文字+\0で丸められてしまいます。
2000文字程度変換できれば良いのですが、
の間違いです。すみません。
半角256文字以上の文字列を投げると、255文字+\0で丸められてしまいます。
2000文字程度変換できれば良いのですが、
の間違いです。すみません。
450448
2012/01/13(金) 19:43:34.29 関数を以下のように書き換えてSystem::String→char*しても、
やはり256文字以上は消えてしまいます。
関数ではなく、何か他に原因があるんでしょうか?
#include <msclr/marshal.h>
using namespace msclr::interop;
using namespace System::Runtime::InteropServices;
char* toPtChar(const String^ Text)
{
String^ foo = (String^)Text;
IntPtr ptr = Marshal::StringToHGlobalAnsi(foo);
return (char*)ptr.ToPointer();
}
http://is.gd/BgDTis
やはり256文字以上は消えてしまいます。
関数ではなく、何か他に原因があるんでしょうか?
#include <msclr/marshal.h>
using namespace msclr::interop;
using namespace System::Runtime::InteropServices;
char* toPtChar(const String^ Text)
{
String^ foo = (String^)Text;
IntPtr ptr = Marshal::StringToHGlobalAnsi(foo);
return (char*)ptr.ToPointer();
}
http://is.gd/BgDTis
451デフォルトの名無しさん
2012/01/16(月) 10:35:10.44 ttp://www.cetix.de/DotNetNews/Thread61630-String_to_string_-_truncates_at_255.aspx
これか?
試してないけど。
これか?
試してないけど。
452デフォルトの名無しさん
2012/01/18(水) 17:31:31.29 ◢▀▅ ▃
▋ ▋ ◢▀ ▀◣
▌ ▌ ▌ ▌
▌ ▌ ▌ ▌
▐ ▌ ▌ ▌
▐ ▀■ ▌
◢◤ ▀▃
◢◤ ◥◣
▌ ▌
▐ ● ● ▌ 馬鹿にはコピペできないの。
▌ ▌
◥◣ ╳ ◢◤
◢▀▅▃▂ ▂▂▃▅▀▅
◢◤ ▀▀▀▀▀ ◥◣
▐◣▃▌ ▐▃◢▌
◥◣▃▌ ▐▃◢◤
▀▅▃ ▂▅▀
▀■▆▅▅▅▆■█▀
▐▃▃▃▲▃▃▃◢▍
▋ ▋ ◢▀ ▀◣
▌ ▌ ▌ ▌
▌ ▌ ▌ ▌
▐ ▌ ▌ ▌
▐ ▀■ ▌
◢◤ ▀▃
◢◤ ◥◣
▌ ▌
▐ ● ● ▌ 馬鹿にはコピペできないの。
▌ ▌
◥◣ ╳ ◢◤
◢▀▅▃▂ ▂▂▃▅▀▅
◢◤ ▀▀▀▀▀ ◥◣
▐◣▃▌ ▐▃◢▌
◥◣▃▌ ▐▃◢◤
▀▅▃ ▂▅▀
▀■▆▅▅▅▆■█▀
▐▃▃▃▲▃▃▃◢▍
453デフォルトの名無しさん
2012/01/18(水) 17:32:09.47 ◢▀▅ ▃
▋ ▋ ◢▀ ▀◣
▌ ▌ ▌ ▌
▌ ▌ ▌ ▌
▐ ▌ ▌ ▌
▐ ▀■ ▌
◢◤ ▀▃
◢◤ ◥◣
▌ ▌
▐ ● ● ▌ 馬鹿にはコピペできないの。
▌ ▌
◥◣ ╳ ◢◤
◢▀▅▃▂ ▂▂▃▅▀▅
◢◤ ▀▀▀▀▀ ◥◣
▐◣▃▌ ▐▃◢▌
◥◣▃▌ ▐▃◢◤
▀▅▃ ▂▅▀
▀■▆▅▅▅▆■█▀
▐▃▃▃▲▃▃▃◢▍
▋ ▋ ◢▀ ▀◣
▌ ▌ ▌ ▌
▌ ▌ ▌ ▌
▐ ▌ ▌ ▌
▐ ▀■ ▌
◢◤ ▀▃
◢◤ ◥◣
▌ ▌
▐ ● ● ▌ 馬鹿にはコピペできないの。
▌ ▌
◥◣ ╳ ◢◤
◢▀▅▃▂ ▂▂▃▅▀▅
◢◤ ▀▀▀▀▀ ◥◣
▐◣▃▌ ▐▃◢▌
◥◣▃▌ ▐▃◢◤
▀▅▃ ▂▅▀
▀■▆▅▅▅▆■█▀
▐▃▃▃▲▃▃▃◢▍
454デフォルトの名無しさん
2012/01/18(水) 18:05:42.86 日本の国民の中には、外国の事情がある程度分かっている人を除けば、
放送内容を信頼している人がまだいることは確かだ。一方で、ネット
住民たちのほぼ全員が、放送番組には政府の意図が色濃く反映されて
いることを知っている。自分の国がどういう国かということが、よく
分かるようになってきているのだ。
放送内容を信頼している人がまだいることは確かだ。一方で、ネット
住民たちのほぼ全員が、放送番組には政府の意図が色濃く反映されて
いることを知っている。自分の国がどういう国かということが、よく
分かるようになってきているのだ。
455デフォルトの名無しさん
2012/01/20(金) 23:34:30.86 失礼します。色々まわっていたのですが此方を勧められたので此方でも質問させて頂きます。
VC++でWindowsフォームのプログラムを組んでいるのですが、
別ファイルでextern宣言したクラス(の配列)をform1.h等で参照したいのですがコンストラクタが上手く働いてくれないのか、宣言の場所が悪いのか
ゴミ値ばかりで上手く動作してくれません。
何かヒントもらえませんか?
VC++でWindowsフォームのプログラムを組んでいるのですが、
別ファイルでextern宣言したクラス(の配列)をform1.h等で参照したいのですがコンストラクタが上手く働いてくれないのか、宣言の場所が悪いのか
ゴミ値ばかりで上手く動作してくれません。
何かヒントもらえませんか?
456デフォルトの名無しさん
2012/01/21(土) 02:53:36.13 ソース貼るか
エラー貼るか
何かヒントもらえませんか?
エラー貼るか
何かヒントもらえませんか?
457デフォルトの名無しさん
2012/01/21(土) 23:51:21.19 いきなりcharではなくwchar_tに変換
でWinAPI使ってcharに
でWinAPI使ってcharに
458デフォルトの名無しさん
2012/01/22(日) 11:17:33.74 >>455
コードも何も書かれてないから憶測でしかないが、newとgc_newを使い分けてないとか、*と^を使い分けてないとか、その辺じゃない?
後は配列が.netのクラスをちゃんと継承してないとか
生のC++とC++/CLIは全くと言って良いほど別言語で、でも生のC++も使えちゃうからC#とC++の合わせ技より罠が多く、バグが多くなり易いよ
コードも何も書かれてないから憶測でしかないが、newとgc_newを使い分けてないとか、*と^を使い分けてないとか、その辺じゃない?
後は配列が.netのクラスをちゃんと継承してないとか
生のC++とC++/CLIは全くと言って良いほど別言語で、でも生のC++も使えちゃうからC#とC++の合わせ技より罠が多く、バグが多くなり易いよ
459デフォルトの名無しさん
2012/01/23(月) 11:32:22.34 publicにしてないとか
460デフォルトの名無しさん
2012/01/23(月) 12:35:15.69 dll が違うとか
461デフォルトの名無しさん
2012/02/21(火) 23:29:28.14 VC++のプロジェクトのwindowsフォームアプリでOpenMPって使えないんですかね?
'/clr:pure' と '/openmp' は同時に指定できません
ってエラーが出てるんで、CLIでは使えないのかな?とか思ったりしたんですがどうでしょう
'/clr:pure' と '/openmp' は同時に指定できません
ってエラーが出てるんで、CLIでは使えないのかな?とか思ったりしたんですがどうでしょう
462デフォルトの名無しさん
2012/02/21(火) 23:38:46.12 /clr:pureで使えるわけがないだろネイティブコード入れられないんだから
/clrならどう?
っていうかWindowsフォーム使いたいだけだったら終わってるC++/CLIなんてやめて
C#でGUI作って重い計算だけC++(/CLIでない)で書いてC#から呼んだほうがいいよ
/clrならどう?
っていうかWindowsフォーム使いたいだけだったら終わってるC++/CLIなんてやめて
C#でGUI作って重い計算だけC++(/CLIでない)で書いてC#から呼んだほうがいいよ
463デフォルトの名無しさん
2012/02/24(金) 20:06:17.85 >>461 です
/clrならできました。ありがとうございます。
よくわかっていないのですが、/clr:pureにしていたのはネイティブとごっちゃになって
変なことになるのを防ぐためなんですかね?だから/clrとしてもそこらへんを気をつければ
問題ない、ということでいいんでしょうか?
C++/CLIは初めてなんで、どう”終わってる”のかわかりませんが、C#はやったことが無いので、
できればこっちでやりたいところなんです。
/clrならできました。ありがとうございます。
よくわかっていないのですが、/clr:pureにしていたのはネイティブとごっちゃになって
変なことになるのを防ぐためなんですかね?だから/clrとしてもそこらへんを気をつければ
問題ない、ということでいいんでしょうか?
C++/CLIは初めてなんで、どう”終わってる”のかわかりませんが、C#はやったことが無いので、
できればこっちでやりたいところなんです。
464デフォルトの名無しさん
2012/02/24(金) 20:20:54.26 大丈夫だ、C++経験者からしてもC++/CLIの習得よりC#の習得の方が楽だから
465デフォルトの名無しさん
2012/02/24(金) 20:21:49.18 /clr:pureだとアセンブリにネイティブコードが混ざらない。
ネイティブコードを混ぜないC++/CLIなんて存在価値ゼロだから、C++/CLI使うんなら常に/clrでおk。
C#をやれ。いくらC++の経験があろうが関係ない。間違いなくC#の方が早く使えるようになるし
開発効率に天と地ほどの差がある。C++/CLIはMSに完全に見捨てられている技術。
ネイティブコードを混ぜないC++/CLIなんて存在価値ゼロだから、C++/CLI使うんなら常に/clrでおk。
C#をやれ。いくらC++の経験があろうが関係ない。間違いなくC#の方が早く使えるようになるし
開発効率に天と地ほどの差がある。C++/CLIはMSに完全に見捨てられている技術。
466デフォルトの名無しさん
2012/02/24(金) 20:25:20.13 VS2010ではもうインテリセンスすら付けてくれてないもんね
467デフォルトの名無しさん
2012/02/24(金) 21:09:13.08 C#やってみます。
過去のレス見てきたんですけど、ひどい言われようですね
あと、あんま書き込み無いのにレスは早くて面白かったです。
過去のレス見てきたんですけど、ひどい言われようですね
あと、あんま書き込み無いのにレスは早くて面白かったです。
468デフォルトの名無しさん
2012/02/27(月) 08:13:52.05 いろいろと屈折した愛があるからなw
469デフォルトの名無しさん
2012/02/29(水) 02:03:40.75 俺はこのスレに張り付いてるけど一応ちょっと待ってからレスしてるわ
470デフォルトの名無しさん
2012/03/02(金) 07:33:50.86 呼び出し規約がよくわからないのですが、関数を宣言した場所で明示しない場合
・引数・返り値の型にマネージ型が含まれる→__clrcall になる
・含まれない→__stdcall になる。実装がマネージドコードにコンパイルされると、double-thunkingになる
という理解であっているでしょうか。
また、非マネージ型のメンバ関数においては、
managed-code -> __thiscall stub -> __clrcall のような double-thunking が発生するのでしょうか?
・引数・返り値の型にマネージ型が含まれる→__clrcall になる
・含まれない→__stdcall になる。実装がマネージドコードにコンパイルされると、double-thunkingになる
という理解であっているでしょうか。
また、非マネージ型のメンバ関数においては、
managed-code -> __thiscall stub -> __clrcall のような double-thunking が発生するのでしょうか?
471デフォルトの名無しさん
2012/03/07(水) 16:17:15.87 VS11βでもインテリセンス無いかな?
472デフォルトの名無しさん
2012/03/08(木) 00:59:01.93 今ちょっと打ってみたが効くみたいだよ。
473デフォルトの名無しさん
2012/03/13(火) 21:11:04.75 C1001 が出た。
みんな報告してる?
みんな報告してる?
474デフォルトの名無しさん
2012/03/14(水) 04:07:10.11 可能な限りする
475デフォルトの名無しさん
2012/03/14(水) 11:15:03.77 やっぱそうだよな。VS11Betaで試してconnect行くわ。
476デフォルトの名無しさん
2012/03/15(木) 09:53:47.89 VS11betaでもやっぱりIntellisSense効かなくて
"No additional information available"って言われるんだけど
何が悪いんだろう
ButtonとTextBox置いてButtonのイベントハンドラの中で
textBox1->とかやってるだけなんだけど
最初のt打っただけで上のエラーが出て
->まで打ってもエラー出たままでメンバも表示されない
"No additional information available"って言われるんだけど
何が悪いんだろう
ButtonとTextBox置いてButtonのイベントハンドラの中で
textBox1->とかやってるだけなんだけど
最初のt打っただけで上のエラーが出て
->まで打ってもエラー出たままでメンバも表示されない
477デフォルトの名無しさん
2012/03/15(木) 20:40:01.46 http://homepage3.nifty.com/ishidate/vcpp10_20/vcpp10_20.htm
ここの一番下の図5は図6用の計算式はどの様に記入すれば良いのですか。
ここの一番下の図5は図6用の計算式はどの様に記入すれば良いのですか。
478デフォルトの名無しさん
2012/03/16(金) 10:49:25.88 function1のとこだろ
どう考えてもC++/CLIでやるべきことじゃないよなこれ
内容は凄いのに…C#にすれば…
どう考えてもC++/CLIでやるべきことじゃないよなこれ
内容は凄いのに…C#にすれば…
479デフォルトの名無しさん
2012/03/18(日) 11:04:51.87 おお、派手だなw
.net framework 使いたいだけならC#でいいなーほんとに
.net framework 使いたいだけならC#でいいなーほんとに
480デフォルトの名無しさん
2012/03/18(日) 12:14:54.13 eのこと聞いてんのかな?
Math::Exp() にすりゃいいと思うが、、、、
Math::Exp() にすりゃいいと思うが、、、、
481デフォルトの名無しさん
2012/03/20(火) 20:55:02.08 こういう変に優秀な勘違いがいるからC++/CLIに手を出す奴がいなくならないんだよな
C++/CLIの記事や書籍ってC#やVBに比べて妙に良質だったりするし
C++/CLIの記事や書籍ってC#やVBに比べて妙に良質だったりするし
482デフォルトの名無しさん
2012/03/21(水) 00:15:02.30 C/C++では配列の終端の一つ次を指すポインタは有効なポインタだったのですけど、
マネージ配列の終端の一つ次を指す interior_ptr は配列がGCで移動したときに正常に更新されますか?
マネージ配列の終端の一つ次を指す interior_ptr は配列がGCで移動したときに正常に更新されますか?
483482
2012/03/25(日) 13:00:47.00 いまさらですが、試してみたところ正常に移動するようでした。
484482
2012/03/26(月) 18:19:27.80 (勝手な推測ですが) interior_ptr はハンドルとオフセットのペアで実装されているのではないかと思います。
array<int> ^a;
auto pa = &a[3]; // { a, 12 }
int *p;
interior_ptr<int> ip (p); // { nullptr, p }
ところで、長さ 0 の配列 (b) に対して &b[0] は IndexOutOfRangeException なんですね…。困った困った。
array<int> ^a;
auto pa = &a[3]; // { a, 12 }
int *p;
interior_ptr<int> ip (p); // { nullptr, p }
ところで、長さ 0 の配列 (b) に対して &b[0] は IndexOutOfRangeException なんですね…。困った困った。
485デフォルトの名無しさん
2012/03/26(月) 21:59:14.05 配列でinterior_ptrなんて必要?
君が言ってるように常に配列のハンドルとオフセットをペアにしとけばよくね
interior_ptrってクラスのインスタンスフィールド指すのに使うやつでしょ
君が言ってるように常に配列のハンドルとオフセットをペアにしとけばよくね
interior_ptrってクラスのインスタンスフィールド指すのに使うやつでしょ
486デフォルトの名無しさん
2012/03/27(火) 07:37:57.33 既存コードの一部だけマネージに持っていく実験なので。
*& はできても interior_ptr<T>% はできないので、配列 + オフセットの方が便利なのはその通りです。
*& はできても interior_ptr<T>% はできないので、配列 + オフセットの方が便利なのはその通りです。
487デフォルトの名無しさん
2012/05/27(日) 20:25:49.04 引数としてstring型の配列を用いたいのですが・・・
自分C#しかやったことないので・・・
自分C#しかやったことないので・・・
488デフォルトの名無しさん
2012/05/27(日) 20:28:19.00 void foo(cli::array<System::String^> ^bar);
489デフォルトの名無しさん
2012/05/27(日) 20:33:46.88 Thank you sir.
490デフォルトの名無しさん
2012/05/31(木) 15:51:08.78 cli::array<System::String^> ^hoge を char* hogehoge[] に変換したいのですが・・・
491デフォルトの名無しさん
2012/05/31(木) 16:43:56.11492491
2012/05/31(木) 17:00:23.87 すまん、コンストラクタが例外安全でなかったので修正した
http://ideone.com/xbcbh
http://ideone.com/xbcbh
493デフォルトの名無しさん
2012/05/31(木) 17:15:25.25 全然わかんね
494デフォルトの名無しさん
2012/05/31(木) 17:26:57.22 cli::array<System::String^> ^hoge = ...;
char_pp p(hoge);
char** hogehoge = p.get();
ってことなんだが
char** は char* xxx[] を引数に取る関数にそのまま渡していい
char_pp p(hoge);
char** hogehoge = p.get();
ってことなんだが
char** は char* xxx[] を引数に取る関数にそのまま渡していい
495デフォルトの名無しさん
2012/05/31(木) 18:36:01.89 Hmm...
496デフォルトの名無しさん
2012/05/31(木) 18:57:30.99 補足しておくと
・PtrToStringCharsで内部ポインタを取得
・System::Stringはunicodeなのでwcstombs_sでマルチバイト文字列に変換
・std::auto_ptr, std::vector, char_ppはRAIIイディオムにより例外安全にするため
・try{}catch(...){throw;}もchar_ppコンストラクタを例外安全にするため
用語はググってくれ
もしC++初心者で.NETからよそのライブラリ使いたいとかなら
C#からP/Invokeした方が多分楽
・PtrToStringCharsで内部ポインタを取得
・System::Stringはunicodeなのでwcstombs_sでマルチバイト文字列に変換
・std::auto_ptr, std::vector, char_ppはRAIIイディオムにより例外安全にするため
・try{}catch(...){throw;}もchar_ppコンストラクタを例外安全にするため
用語はググってくれ
もしC++初心者で.NETからよそのライブラリ使いたいとかなら
C#からP/Invokeした方が多分楽
497デフォルトの名無しさん
2012/05/31(木) 19:02:53.62 P/Invokeですか・・・
498デフォルトの名無しさん
2012/06/01(金) 00:26:18.04 そんなコード書かれたら、俺なら普通に書き直しさせるわ
文字列のマーシャリングで標準のマーシャリング以外を使うなよ
marshal_context c;
for (...) native_str[i] = c.marshal_as<char*>(managed_str[i]);
文字列のマーシャリングで標準のマーシャリング以外を使うなよ
marshal_context c;
for (...) native_str[i] = c.marshal_as<char*>(managed_str[i]);
499デフォルトの名無しさん
2012/06/01(金) 03:21:17.29 それコンパイル通るの?
500デフォルトの名無しさん
2012/06/01(金) 15:18:44.76 MFC 使うんだったら、CString に直接放り込めばいいだろうに
CString strBuff(strManaged);
CString strBuff(strManaged);
501sage
2012/06/08(金) 17:29:51.46 VC++2008のC++/CLIでUSBカメラが抜かれたことを検知したいのですが,どなたかわかりませんか?
USBメモリーなら
virtual void WndProc(System::Windows::Forms::Message% m) override
{
if(m.Msg == WM_DEVICECHANGE)
{
switch((int)(m.WParam))
{
case DBT_DEVICEREMOVECOMPLETE:
MessageBox::Show("out");
break;
case DBT_DEVICEARRIVAL:
MessageBox::Show("in");
break;
}
}
Form::WndProc(m);
}
で判断できたんですが,USBカメラだとm.Wparamが変化しません...
USBメモリーなら
virtual void WndProc(System::Windows::Forms::Message% m) override
{
if(m.Msg == WM_DEVICECHANGE)
{
switch((int)(m.WParam))
{
case DBT_DEVICEREMOVECOMPLETE:
MessageBox::Show("out");
break;
case DBT_DEVICEARRIVAL:
MessageBox::Show("in");
break;
}
}
Form::WndProc(m);
}
で判断できたんですが,USBカメラだとm.Wparamが変化しません...
502デフォルトの名無しさん
2012/06/09(土) 12:49:43.11 c++を使い始めたものなんですけど
こっちはちゃんとなるんですけど
http://www.dotup.org/uploda/www.dotup.org3073322.jpg
includeを使うと
http://www.dotup.org/uploda/www.dotup.org3073352.jpg
こんな感じになっちゃって・・・(´;ω;`)
だれか解決して下さいませんか?
こっちはちゃんとなるんですけど
http://www.dotup.org/uploda/www.dotup.org3073322.jpg
includeを使うと
http://www.dotup.org/uploda/www.dotup.org3073352.jpg
こんな感じになっちゃって・・・(´;ω;`)
だれか解決して下さいませんか?
503デフォルトの名無しさん
2012/06/09(土) 12:58:27.44 苦Cか
504デフォルトの名無しさん
2012/06/09(土) 13:00:34.24505デフォルトの名無しさん
2012/06/09(土) 13:20:04.01 まずスレタイを読みます
506デフォルトの名無しさん
2012/06/09(土) 13:21:59.00507デフォルトの名無しさん
2012/06/09(土) 13:40:18.44 わろた
508デフォルトの名無しさん
2012/06/19(火) 22:37:50.62 DOSで趣味でプログラム組んでた程度で、APIめんどくせ、MFCうぜえってレベルなんだが
久しぶりにちょっとしたゲームでも作ろうとして
VCに無料版があるのか!と飛びつき
無料版でフォームの統合環境まであるんか、今はMFCにかわってCLRなんかと早とちりし
ネット漁ればサンプルやら何やらゴロゴロしてるかと思えば…
何じゃこりゃ
久しぶりにちょっとしたゲームでも作ろうとして
VCに無料版があるのか!と飛びつき
無料版でフォームの統合環境まであるんか、今はMFCにかわってCLRなんかと早とちりし
ネット漁ればサンプルやら何やらゴロゴロしてるかと思えば…
何じゃこりゃ
509デフォルトの名無しさん
2012/06/19(火) 23:16:03.51 CLRってなんだよ。CLIはMicrosoftにも見捨てられかけてるのでね…泣けてくる。
どうせ.NET使うならもうC#で全部やっちまえよって感じか?
どうせ.NET使うならもうC#で全部やっちまえよって感じか?
510デフォルトの名無しさん
2012/06/20(水) 01:01:15.51 CLIは規格の名前、それのMSによる実装がCLR
CLRに大量のライブラリ群を加えたやつが.NET Framework
CLIに対応する構文を追加したC++だからC++/CLI
>どうせ.NET使うならもうC#で全部やっちまえよって感じか?
その通り。過去の資産を使わないといけないというような、必要に迫られて仕方なく使う物だよ。
CLRに大量のライブラリ群を加えたやつが.NET Framework
CLIに対応する構文を追加したC++だからC++/CLI
>どうせ.NET使うならもうC#で全部やっちまえよって感じか?
その通り。過去の資産を使わないといけないというような、必要に迫られて仕方なく使う物だよ。
511デフォルトの名無しさん
2012/06/20(水) 01:14:40.12 ところでVC++のC++/CLIってMS CLRじゃなくて純粋なCLIで動くの?
一応CLIではアセンブリはネイティブイメージを持てるという決まりだった覚えがあるけど
細かい相互運用のことは決まってなさそう
一応CLIではアセンブリはネイティブイメージを持てるという決まりだった覚えがあるけど
細かい相互運用のことは決まってなさそう
512デフォルトの名無しさん
2012/06/20(水) 03:37:32.95 C++/CLIをMonoで動かそうとするとCRT使えない&/clr:pureだったよね。今は変わったのかな?
513デフォルトの名無しさん
2012/06/20(水) 07:32:37.59514デフォルトの名無しさん
2012/06/20(水) 11:20:48.23 /clr:safe だね。
using namespace System;
int main(array<String^>^ args) {
Console::WriteLine("Hello World !");
}
cl /clr:safe test.cpp
mono test.exe
でいける。
using namespace System;
int main(array<String^>^ args) {
Console::WriteLine("Hello World !");
}
cl /clr:safe test.cpp
mono test.exe
でいける。
515デフォルトの名無しさん
2012/06/24(日) 02:05:59.36 http://www.atoker.com/blog/2012/04/12/llvm-europe-2012-cli-compiler/
ClangベースにC++/CLIコンパイラ作ったという話。
(1)と(2)とあるけど、どちらもVisual C++の吐く
混在アセンブリとは違う仕組みっぽい感じがする。
ClangベースにC++/CLIコンパイラ作ったという話。
(1)と(2)とあるけど、どちらもVisual C++の吐く
混在アセンブリとは違う仕組みっぽい感じがする。
516デフォルトの名無しさん
2012/06/24(日) 20:35:21.91 VC++のclrで,ref classはなぜref classからしか継承できないんでしょうか?
仕組み的に継承先でgcとか実装されるなら別にvalue classからとかでも継承できていいと思うんですけど……
仕組み的に継承先でgcとか実装されるなら別にvalue classからとかでも継承できていいと思うんですけど……
517デフォルトの名無しさん
2012/06/24(日) 22:14:12.48 というか普通のクラスをpublic refで継承したいのおおおお
518デフォルトの名無しさん
2012/06/25(月) 11:36:44.70 継承出来ても仕組み上ハンドル変数にしか入れられないから意味なくね
519デフォルトの名無しさん
2012/06/25(月) 15:36:06.92 構造体がなんかインターフェイスを実装してる場合には意味ないこともないが
CLIを拡張するのに見合った利益があるかどうか考えると当然切り捨てだろうな
あくまでC#とVBが主役なんだからC#やVBから使えないクラス作っても意味ない
CLIを拡張するのに見合った利益があるかどうか考えると当然切り捨てだろうな
あくまでC#とVBが主役なんだからC#やVBから使えないクラス作っても意味ない
520デフォルトの名無しさん
2012/06/25(月) 18:42:31.48 混合型ェ・・・
521デフォルトの名無しさん
2012/06/25(月) 22:06:41.59 混合型こそ仕組み的には特にできない理由がなくて比較的大きな利益のあるものだよな
CLIやCLRを弄る必要もなく、コンパイラだけで対応できるはず
永遠に将来的に対応予定だが
CLIやCLRを弄る必要もなく、コンパイラだけで対応できるはず
永遠に将来的に対応予定だが
522デフォルトの名無しさん
2012/06/26(火) 10:12:49.68 いや仕組み的に無理だから
マネージド領域のポインタはfixedなしに取得してはいけない
実装部分でそれを止める(無いことを保証する)には宣言部分で付加情報が必要
それがrefキーワード
ヒープ領域ならポインタを取得するのは問題ない
だからrefクラスのメンバにポインタ型なら定義可能
コンストラクタでnewしてCLIデストラクタ(IDisposable)でdeleteすること
マネージド領域のポインタはfixedなしに取得してはいけない
実装部分でそれを止める(無いことを保証する)には宣言部分で付加情報が必要
それがrefキーワード
ヒープ領域ならポインタを取得するのは問題ない
だからrefクラスのメンバにポインタ型なら定義可能
コンストラクタでnewしてCLIデストラクタ(IDisposable)でdeleteすること
523デフォルトの名無しさん
2012/06/26(火) 10:13:55.17 例
template <typename T> ref class ref_auto_ptr{
T* p;
public:
ref_auto_ptr(T* ap):p(ap){}
~ref_auto_ptr(){delete p;}
T* get(){return p;}
};
struct val_class{
val_class(){Console::WriteLine(L"new val_class");}
~val_class(){Console::WriteLine(L"del val_class");}
};
ref class ref_class{
public:
ref_class():p(new val_class()){}
ref_auto_ptr<val_class> p;
};
int main(array<System::String ^> ^args){
ref_class c;
Console::WriteLine(L"a");
return 0;
}
-----------------
new val_class
a
del val_class
template <typename T> ref class ref_auto_ptr{
T* p;
public:
ref_auto_ptr(T* ap):p(ap){}
~ref_auto_ptr(){delete p;}
T* get(){return p;}
};
struct val_class{
val_class(){Console::WriteLine(L"new val_class");}
~val_class(){Console::WriteLine(L"del val_class");}
};
ref class ref_class{
public:
ref_class():p(new val_class()){}
ref_auto_ptr<val_class> p;
};
int main(array<System::String ^> ^args){
ref_class c;
Console::WriteLine(L"a");
return 0;
}
-----------------
new val_class
a
del val_class
524デフォルトの名無しさん
2012/06/26(火) 12:26:48.81 仕組み的に無理って
C++/CLI のもともとの目的は混合型を実現することだったんじゃなかったか?
C++/CLI のもともとの目的は混合型を実現することだったんじゃなかったか?
525デフォルトの名無しさん
2012/06/26(火) 16:07:00.24 Some Notes about Mixed Types
http://blogs.msdn.com/b/branbray/archive/2005/07/20/441099.aspx
http://blogs.msdn.com/b/branbray/archive/2005/07/20/441099.aspx
526デフォルトの名無しさん
2012/06/26(火) 22:12:26.16 PODなネイティブ構造体をマネージ型に置いたり、マネージハンドルをメンバに持たない
マネージ構造体をネイティブ型に置いたりするのは別に問題ないが(ミスを誘発しやすいという懸念はあるが)
もっと一般的に混合型を扱えるようにする構想があったからとりあえず全部禁止しといたってことか
で結局はC++/CLIそのものが見捨てられて計画倒れになり、理不尽な制限として残ってしまったと
マネージ構造体をネイティブ型に置いたりするのは別に問題ないが(ミスを誘発しやすいという懸念はあるが)
もっと一般的に混合型を扱えるようにする構想があったからとりあえず全部禁止しといたってことか
で結局はC++/CLIそのものが見捨てられて計画倒れになり、理不尽な制限として残ってしまったと
527デフォルトの名無しさん
2012/06/27(水) 03:22:10.94 ちょっとした配列をメンバに持ちたいときにmallocしたりgcnewしたりしないといけないのは
なんとかならんかったんかなぁ、と思う。
なんとかならんかったんかなぁ、と思う。
528デフォルトの名無しさん
2012/06/27(水) 08:24:51.05 >>525の
Point* G(R^ r) {
pin_ptr<Point> pinp = &r.p;
return pinp;
}
これってGCの問題というよりはC++でもよくあるミスの一種だよね
ローカル変数のポインタを残すなってのと同類
Point* G(R^ r) {
pin_ptr<Point> pinp = &r.p;
return pinp;
}
これってGCの問題というよりはC++でもよくあるミスの一種だよね
ローカル変数のポインタを残すなってのと同類
529デフォルトの名無しさん
2012/06/27(水) 10:51:13.99 初心者みたいな質問ですがすみません。
今、マネージコードからネイティブなコードを呼び出す ということがやりたいのですが
例えば、native_program.hを
#pragma unmanaged
int func(int num){
return num*2;
}
のように書き、Form.hで
#include "native_program.h"
(中略)
int num2 = func(50);
(後略)
のように呼び出しても、マネージコードでは呼び出せませんのようなエラーが出て上手くいきません。
1つのプロジェクト内で、ネイティブコードも書きながら、#pragma unmanagedを使って
コンパイルするというのは無理なのでしょうか?
http://www.atmarkit.co.jp/fdotnet/special/vcppinvista01/vcppinvista01_02.html
ここにあるようにdll化して呼び出すということをしないとダメなのでしょうか。
これだとデバッグが大変なので、1つのプロジェクト内やりたいのですが・・・・
よろしくお願いします。
今、マネージコードからネイティブなコードを呼び出す ということがやりたいのですが
例えば、native_program.hを
#pragma unmanaged
int func(int num){
return num*2;
}
のように書き、Form.hで
#include "native_program.h"
(中略)
int num2 = func(50);
(後略)
のように呼び出しても、マネージコードでは呼び出せませんのようなエラーが出て上手くいきません。
1つのプロジェクト内で、ネイティブコードも書きながら、#pragma unmanagedを使って
コンパイルするというのは無理なのでしょうか?
http://www.atmarkit.co.jp/fdotnet/special/vcppinvista01/vcppinvista01_02.html
ここにあるようにdll化して呼び出すということをしないとダメなのでしょうか。
これだとデバッグが大変なので、1つのプロジェクト内やりたいのですが・・・・
よろしくお願いします。
530デフォルトの名無しさん
2012/06/27(水) 10:57:39.47 include ってそこに書いたのと同じ意味になるんだがそれはわかってる?
531デフォルトの名無しさん
2012/06/27(水) 13:42:46.79 >>530
小一時間考え、
#include "native_program.h" の下に #pragma unmanaged を入れたら通りました・・・お騒がせしました
ところで、func()は実際はクラスの中に入ってるのですが、
呼び出し側では、
Classname* classname;
classname->func();
のようにすればOKなのでしょうか。この2行はマネージコードの中に入ってるけど
特にnewとかしなくても上の一行だけでクラスのオブジェクト作られてるのかなと・・・
というか、このように書いたら動いたのでOKなのかなと思ってるのですが。
小一時間考え、
#include "native_program.h" の下に #pragma unmanaged を入れたら通りました・・・お騒がせしました
ところで、func()は実際はクラスの中に入ってるのですが、
呼び出し側では、
Classname* classname;
classname->func();
のようにすればOKなのでしょうか。この2行はマネージコードの中に入ってるけど
特にnewとかしなくても上の一行だけでクラスのオブジェクト作られてるのかなと・・・
というか、このように書いたら動いたのでOKなのかなと思ってるのですが。
532デフォルトの名無しさん
2012/06/27(水) 13:43:46.48 失礼、#pragma managedです。。。
書き間違いました^^;
書き間違いました^^;
533デフォルトの名無しさん
2012/06/27(水) 14:15:48.48 オブジェクトは無いだろう。
thisポインタがNULLのまま
thisポインタがNULLのまま
534デフォルトの名無しさん
2012/06/27(水) 14:23:15.98 オブジェクトはないけど動いている・・・
ということは、実行ファイルを直接読んでるということか・・・
よくわからないし動いてるので気にしないことにします^^;
失礼しましたw
ということは、実行ファイルを直接読んでるということか・・・
よくわからないし動いてるので気にしないことにします^^;
失礼しましたw
535デフォルトの名無しさん
2012/06/27(水) 14:24:02.48■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「1800万円の売り上げゼロに…」中国インバウンドに特化の宿の今 [蚤の市★]
- 「中国人の訪日熱は冷めた」 人気旅行先から日本外れる 14日で自粛呼びかけ1カ月 [蚤の市★]
- クリスマスの「予定なし」54% [少考さん★]
- 最新版Z級クソ映画ランキングが決定! [牛丼★]
- 【話題】好きな鍋は?! 「寄せ鍋」「キムチ鍋」「水炊き」「もつ鍋」「豆乳鍋」「ちゃんこ鍋」「ごま坦々鍋」「トマト鍋」 [ひぃぃ★]
- 【STARTO ENTERTAINMENT】SUPER EIGHTの横山裕、フジ『ドッキリGP』ロケで全治2ヶ月の重傷 [Ailuropoda melanoleuca★]
- 【実況】博衣こよりのえちえち機動戦士ガンダム逆襲のシャア🧪★2
- 【実況】博衣こよりのえちえち機動戦士ガンダム逆襲のシャア🧪★3
- 茶ぁしばこうや··· ( ¨̮ )︎︎𖠚ᐝ2
- 愛国者「釘を使わない日本独自の伝統工法スゴイ!」X民「それ中国起源ですよ」→批判殺到 [834922174]
- 茶ぁしばこうや···
- 【高市仰天】スペイン、40分早く出社した社員を労基法違反で解雇 [347751896]
