- 1 名前:デフォルトの名無しさん mailto:sage [2006/03/12(日) 16:08:39 ]
- おそらく、.NET開発でデファクトスタンダードに最も近い
であろうC++/CLIについて語ろうぜ! このスレはC++および.NET Frameworkについて一定以上の知識を持っている人が対象となります。 .NETのクラスライブラリの使い方といった質問は姉妹スレ「くだすれC++/CLI(初心者用)」に お願いします。 前スレッドはこちら (p)pc8.2ch.net/test/read.cgi/tech/1126450441/l50 姉妹スレ くだすれC++/CLI(初心者用) (p)pc8.2ch.net/test/read.cgi/tech/1142144110/l50 managed C++ やろうぜ!! 002 (p)pc8.2ch.net/test/read.cgi/tech/1139043535/l50
- 185 名前:デフォルトの名無しさん [2006/12/04(月) 16:47:32 ]
- CLIは素人なのではずしてたらごめんね。
で、これ通ったよ。 using namespace System; int main(array<System::String ^> ^args) { String^ A="Hello"; String^ B="World"; String^ C=""; C=A+B; Console::WriteLine(C->ToCharArray()); return 0; } と、ここまで書いて見落とし発見・・・。 なんだ、普通のstd::stringか? ちょっとまってて。
- 186 名前:181 [2006/12/04(月) 17:03:45 ]
- 皆さん、ありがとう。
下記のようにして何とか動きました。 voidfunc(String*str1,String*str2,String*str3){ LPTSTRpArg; LPTSTRpStr1=(LPTSTR)Marshal::StringToHGlobalAnsi(str1).ToPointer(); LPTSTRpStr2=(LPTSTR)Marshal::StringToHGlobalAnsi(str2).ToPointer();; LPTSTRpStr3=(LPTSTR)Marshal::StringToHGlobalAnsi(str3).ToPointer();; intlen=0; len+=lstrlen(pStr1); len+=1; len+=lstrlen(pStr2); len+=1; len+=lstrlen(pStr3); len+=1; len+=1; pArg=(LPTSTR)malloc(len); len=0; memcpy(&pArg[len],pStr1,lstrlen(pStr1));len+=lstrlen(pStr1); memcpy(&pArg[len],"\0",1);len+=1; memcpy(&pArg[len],pStr2,lstrlen(pStr2));len+=lstrlen(pStr2); memcpy(&pArg[len],"\0",1);len+=1; memcpy(&pArg[len],pStr3,lstrlen(pStr3));len+=lstrlen(pStr3); memcpy(&pArg[len],"\0",1);len+=1; memcpy(&pArg[len],"\0",1);len+=1; func(pArg); free(pArg); }
- 187 名前:デフォルトの名無しさん [2006/12/04(月) 17:04:51 ]
- ミスった・・・
voidfunc(String*str1,String*str2,String*str3){ LPTSTR pArg; LPTSTR pStr1=(LPTSTR)Marshal::StringToHGlobalAnsi(str1).ToPointer(); LPTSTR pStr2=(LPTSTR)Marshal::StringToHGlobalAnsi(str2).ToPointer();; LPTSTR pStr3=(LPTSTR)Marshal::StringToHGlobalAnsi(str3).ToPointer();; int len=0; len+=lstrlen(pStr1); len+=1; len+=lstrlen(pStr2); len+=1; len+=lstrlen(pStr3); len+=1; len+=1; pArg=(LPTSTR)malloc(len); len=0; memcpy(&pArg[len],pStr1,lstrlen(pStr1));len+=lstrlen(pStr1); memcpy(&pArg[len],"\0",1);len+=1; memcpy(&pArg[len],pStr2,lstrlen(pStr2));len+=lstrlen(pStr2); memcpy(&pArg[len],"\0",1);len+=1; memcpy(&pArg[len],pStr3,lstrlen(pStr3));len+=lstrlen(pStr3); memcpy(&pArg[len],"\0",1);len+=1; memcpy(&pArg[len],"\0",1);len+=1; func(pArg); free(pArg); }
- 188 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 17:10:58 ]
- >>181お前それC++/CLIではなく、マネージドC++だろ。
とりあえず、こうすると.NET 2003の/clrと2005の/clr:OldSyntaxで動く(実行するとaaaしか表示されない)。 #using <mscorlib.dll> #include <vcclr.h> #include <windows.h> #pragma comment(lib, "user32.lib") void func (System::String* str1, System::String* str2, System::String* str3) { using System::String; String* str; str = String::Concat(str, str1); str = String::Concat(str, S"\0"); str = String::Concat(str, str2); str = String::Concat(str, S"\0"); str = String::Concat(str, str3); str = String::Concat(str, S"\0"); str = String::Concat(str, S"\0"); const wchar_t __pin* p = PtrToStringChars(str); ::MessageBoxW(0, p, L"", MB_OK); } int main() { func("aaa","bbb","ccc"); } まあAPIの相手をするならchar配列のほうが楽。 >>187 せめてsprintf使え。あとLPTSTRをマルチバイト文字列に使うな。
- 189 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 17:11:03 ]
- こらこら、ANSI文字列のポインタをLPTSTRで受けちゃダメだぞ。
- 190 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 17:14:53 ]
- …なんだか口は悪いけど親切なお兄さんと結婚することになりそうです。
- 191 名前:188 [2006/12/04(月) 17:22:28 ]
- >>188
動きました!
- 192 名前:181 mailto:sage [2006/12/04(月) 17:22:51 ]
- 名前欄まちがえた
- 193 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 17:30:11 ]
- あと、Marshal::StringToHGlobalAnsiで確保したメモリを開放していないな。
方法は幾通りもある。あんマネージ文字列への変換はCString (ATL/MFC 7以上)使うのと結構楽。 TCHARも適当にやってくれるし。 #using <mscorlib.dll> #include <atlstr.h> #include <windows.h> #pragma comment(lib, "user32.lib") void func (System::String* str1, System::String* str2, System::String* str3) { using ATL::CString; CString cs1(str1), cs2(str2), cs3(str3); CString arg; arg.Format(TEXT("%s\0%s\0%s\0"), static_cast<PCSTR>(cs1), static_cast<PCSTR>(cs2), static_cast<PCSTR>(cs3)); ::MessageBox(0, arg, TEXT(""), MB_OK); }
- 194 名前:185 mailto:sage [2006/12/04(月) 17:37:49 ]
- >>186-188
ほかの方法があったか。 色々考え出したら止まらなくって困ってたとこだった。 役に立てなくてすまない。 #include <string> #include <iostream> int main(array<System::String ^> ^args) { std::string A="BMP",B="Wav"; std::string C=""; C=A+'\0'+B+'\0'+'\0'; std::cout<<C<<std::endl; //std::cout<<C.c_str()<<std::endl; return 0; } こういう感じの想定してた。@VC2005EE
- 195 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 17:44:41 ]
- >>193の方法は短いですけど、>>188の方が見やすそうなので、使わせてもらいました。
色々勉強になりました
- 196 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 17:56:57 ]
- CLIだが最終的にこんなんなった。
std::string func(String^ str1, String^ str2, String^ str3) { IntPtr ptr1 = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str1); IntPtr ptr2 = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str2); IntPtr ptr3 = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str3); std::string result = std::string() + reinterpret_cast<const char *>(ptr1.ToPointer()) + '\0' + reinterpret_cast<const char *>(ptr2.ToPointer()) + '\0' + reinterpret_cast<const char *>(ptr3.ToPointer()) + '\0' + '\0'; System::Runtime::InteropServices::Marshal::FreeHGlobal(ptr1); System::Runtime::InteropServices::Marshal::FreeHGlobal(ptr2); System::Runtime::InteropServices::Marshal::FreeHGlobal(ptr3); return result; }
- 197 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 18:23:57 ]
- >>195
せめてStringBuilder使え。
- 198 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 23:45:05 ]
- ふつうに wstring 使った方が早くね?
- 199 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 23:49:36 ]
- String::Format 使えばいいと思う……
- 200 名前:デフォルトの名無しさん mailto:sage [2006/12/05(火) 00:23:34 ]
- >>199
>>193で出たものの、>>195で却下された。
- 201 名前:デフォルトの名無しさん mailto:sage [2006/12/05(火) 11:03:39 ]
- 個人的には(作成理由から読むに) C# で DLLImport の方法を探した方が遥かに楽だったんじゃないかという気がするけど。
色んな選択肢を使える懐の深さが C++/CLI の一つの魅力なわけだし、 最速/高効率よりも、本人が理解/吸収しやすい手法を取るのが最良だと思う。
- 202 名前:デフォルトの名無しさん mailto:sage [2006/12/05(火) 16:10:02 ]
- さすがに、それを最良と言い切るのはおかしいな。
言いたいことはわかるが、言葉の選択を誤ってるね。
- 203 名前:デフォルトの名無しさん mailto:sage [2007/01/03(水) 23:36:10 ]
- www.rupan.net/uploader/download/1167834884.zip
PASS: CLI
- 204 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 00:27:15 ]
- >>203
これってなんだったの?
- 205 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 00:31:07 ]
- 仕様書のスキャン画像
- 206 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 01:07:33 ]
- C++/CLIでWPFの開発できないの?
- 207 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:54:27 ]
- できないほうが不思議
- 208 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 04:46:46 ]
- IDEのサポートがあるかどうかは別問題だけどね。
- 209 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 20:21:14 ]
- C++/CLIでのWPF開発ではIDEのサポートは無いの?
- 210 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 21:27:14 ]
- XAMLPadで十分じゃん
どうせUIはC++じゃなくてXMLで書くんだし
- 211 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 21:27:51 ]
- Visual Studio 2007(2008?)には標準で入るはず。
- 212 名前:デフォルトの名無しさん mailto:sage [2007/03/03(土) 19:31:33 ]
- literalって何のために追加されたの?
constでいいじゃん。
- 213 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 16:28:43 ]
- >>212
よく知らんが、名前の通りリテラルの為なんじゃないのか?
- 214 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 17:59:55 ]
- いやだってManaged C++ではstatic constで済んでいただろ。
- 215 名前:デフォルトの名無しさん mailto:sage [2007/03/04(日) 22:20:44 ]
- フィールドにCILで言うところのliteral属性をつけるか否かを区別できるようになった
- 216 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 23:10:16 ]
- Managed C++ではunmanagedなものとの区別があいまいだったから、
出来るだけ違う名前を付けるようにしたとかそんなのじゃないの? 参照周りとかgcnewとか見ててもそういう思想に見えるんだが
- 217 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 19:24:28 ]
- 流れぶった切って申し訳ないですが、質問です。
C++/CLIで、既存のネイティブ関数をラップして、 public ref class Test { public : static void show( System::Int32^ x ) {} static void show( System::Double^ x ) {} }; というようなクラスを作って、C#から static void main() { Test.show( 1 ); Test.show( 2.0 ); } という風にオーバーロードして呼び出たんですが、 次のメソッドまたはプロパティ間で呼び出しが不適切です: 'Test.show(System.ValueType)' と 'Test.show(System.ValueType)' というエラーがでて、コンパイルできませんでした。 エラーをみると、引数のSystem::Int32とSystem::DoubleがSystem::ValueTypeになってる っぽいんですが、正しくラップするにはどういう風に書くんでしょうか?
- 218 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 19:34:18 ]
- ^
- 219 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 20:42:10 ]
- >>217
そういうこと。値型はハンドルを使わず生の型を使え。 C++/CLIで値型へのハンドルはボックス化の扱い。 IL上の引数・戻り値は、System.ValueType(これ自体は参照型)となる。 vene.wankuma.com/ecma372/33_cli_library.aspx#SS.33.1.5.1 基の型の情報も記録しているので、IL上は多重定義可能で、 C++/CLIでもコンパイラがそれを認識して多重定義解決を行う。 しかしC#コンパイラはそれを知らないので、 単にSystem.ValueTypeを1つ引数に取るメソッドshowが2つあるとしか認識できない。
- 220 名前:217 mailto:sage [2007/04/09(月) 23:01:02 ]
- >>218-219
なるほど。 解決しました!ありがとうございます。
- 221 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 18:06:56 ]
- ○コンストラクタ
StreamReader^ FormDataReader = gcnew StreamReader("FormData.txt", System::Text::Encoding::GetEncoding("shift-jis")); String^ locationX = MainFormDataReader->ReadLine(); String^ locationY = MainFormDataReader->ReadLine(); String^ SizeW = MainFormDataReader->ReadLine(); String^ SizeH = MainFormDataReader->ReadLine(); locationX = locationX->Substring(locationX->IndexOf("=") + 1); locationY = locationY->Substring(locationY->IndexOf("=") + 1, locationY->IndexOf("}") - locationY->IndexOf("=") - 1); SizeW = SizeW->Substring(SizeW->IndexOf("=") + 1); SizeH = SizeH->Substring(SizeH->IndexOf("=") + 1, SizeH->IndexOf("}") - SizeH->IndexOf("=") - 1); this->SetDesktopBounds(int::Parse(locationX), int::Parse(locationY), int::Parse(SizeW), int::Parse(SizeH)); MainFormDataReader->Close(); //最初の表示位置を記録 this->OnResizeEnd(nullptr); ○デストラクタ StreamWriter^ FormDataWriter = gcnew StreamWriter("FormData.txt", false, System::Text::Encoding::GetEncoding("shift-jis")); MainFormDataWriter->WriteLine(this->WindowState); MainFormDataWriter->WriteLine(LocationString->Replace(",", "\r\n")); MainFormDataWriter->WriteLine(SizeString->Replace(",", "\r\n")); MainFormDataWriter->WriteLine(splitContainer1->SplitterDistance); MainFormDataWriter->WriteLine(splitContainer2->SplitterDistance); MainFormDataWriter->Close();
- 222 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 18:09:35 ]
- ○初期設定
String^ LocationString; String^ SizeString; this->ResizeEnd += gcnew System::EventHandler(this, &MainForm::MainForm_ResizeEnd); ○フォームのサイズと位置を取得する private: System::Void MainForm_ResizeEnd(System::Object^ sender, System::EventArgs^ e) { LocationString = "" + this->Location; SizeString = "" + this->Size; } 長かったので分割してカキコしました 今日出された課題でフォーム位置を記録するという物があったのですが、どうしても汚くなってしまいます。 もう少し効率の良いフォーム位置の記録方法はありませんか?
- 223 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 21:05:32 ]
- なんつうかきったねえな、おい。
Hashtableに格納してシリアライズするとか、 シリアライズ可能な構造体を定義してそれを保存するとか、 自前で読み書きするにしても、せめて、生の整数値で保存しろよ。
- 224 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 22:03:19 ]
- >>223
ご指摘ありがとうございます >自前で読み書きするにしても、せめて、生の整数値で保存しろよ。 苦肉の策で、無理矢理保存してました(汗
- 225 名前:デフォルトの名無しさん [2007/05/10(木) 08:14:13 ]
- String^ a = "a";
String^ b = a; a = "b"; これでbが"b"にならないのはどういう仕組みなんでしょうか? いろいろ調べましたが結局わかりません。
- 226 名前:デフォルトの名無しさん [2007/05/10(木) 08:18:49 ]
- int n = 1;
int* a = &n; int* b = a; int m = 2; a = &m; で b が 2 になりません、って言ってるのと同じこと。
- 227 名前:デフォルトの名無しさん [2007/05/10(木) 08:19:26 ]
- 間違えた。*b が 2 に、だった。
- 228 名前:デフォルトの名無しさん [2007/05/10(木) 08:44:36 ]
- >>226
ありがとう。なんかぼけてました。(;´Д`)
- 229 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 21:09:57 ]
- (゚Д゚)
- 230 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 01:46:32 ]
- 致命的なエラーです。 (HRESULT からの例外: 0x8000FFFF (E_UNEXPECTED))
という警告がデザイナーで急に頻繁に表示されるようになってしまったのですが、 どなたか解決策をご存じありませんか? コンパイルはちゃんとできるんですけど...
- 231 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 18:01:24 ]
- 言語伝々自体にドトネトコード自体がお呼びじゃないからな。
- 232 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 22:56:54 ]
- 誤爆け?
- 233 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 16:56:09 ]
- でんでん?
云々の間違いなんだろうが、どうすればそんな間違いが起こるんだw
- 234 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 17:16:41 ]
- >伝々
思わずふいてしまた
- 235 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 16:01:13 ]
- treeViewの再描画を一時停止したいんだけどどうすれば良いの?
- 236 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 17:22:17 ]
- 初めまして、VC++のC++/CLIのフォームアプリケーションについて質問があります。
今、LimeChat 2 の様なアプリを作っていています。 そのアプリのテキストボックスには、カーソルが表示されていません。 どのようにすれば、カーソルを表示させないようにできるのでしょうか? また、TreeViewの再描画を一時停止させたいのですが、どうすればよいのでしょうか?
- 237 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 00:24:49 ]
- 再描画のハンドラをオーバーロードして
止めたいときだけ無視する。
- 238 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 00:28:12 ]
- 自己解決しました!
>>また、TreeViewの再描画を一時停止させたいのですが、どうすればよいのでしょうか? treeView->BeginUpdate(); キャレットが出無くなればいいわけです Win32 APIにHideCaretという関数があるのですが、C++/CLIではどうしても見つけることができませんでしたorz
- 239 名前:デフォルトの名無しさん [2007/05/27(日) 15:49:02 ]
- iconv (iconv_t cd, const char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft);
この関数のinbufにString^を渡したいのですがうまくキャストできません。 pin_ptr<const wchar_t> pIn = PtrToStringChars(in); pin_ptr<const char> pInPass = pin_ptr<const char>pIn; // error iconv(cd, &pInPass, &inlength, pOutPass, &outlength) ) どうやってキャストすればいいのでしょうか?
- 240 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 20:26:06 ]
- pInの段階で既にpinされているのだから、後は普通のC++と同じように
const char* pInPass = reinterpret_cast<const char*>(pIn);でいいと思う。
- 241 名前:かも [2007/05/27(日) 23:33:12 ]
- だれか、ニューメリカルレシピインシーっていう本やったことある人いませんか(??)
- 242 名前:デフォルトの名無しさん mailto:sage [2007/05/28(月) 02:05:15 ]
- >>239
msdn2.microsoft.com/ja-jp/library/1b4az623(VS.80).aspx String^からstd::stringにしてc_str()で渡せば。
- 243 名前:デフォルトの名無しさん mailto:sage [2007/05/28(月) 10:20:36 ]
- >240
できました。ありがとう。 >242 できればコピーしないでやりたかったので。
- 244 名前:デフォルトの名無しさん [2007/05/29(火) 18:10:26 ]
- こんなものC++の標準が改定されたら置いてきぼりになるじゃんか
志ねMS
- 245 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 19:22:06 ]
- C++/CLIはC++ではないと何度言ったら分かるんだね。
- 246 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 19:25:48 ]
- C++自体がC99から置いてきぼりになってますが何か?
でもってC++/CLIも世界標準規格のわけだが
- 247 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 20:05:06 ]
- 世界標準言ったって、盲判で有名なECMAだろ?
ちょっとまえにISOに蹴られたばっかじゃん。
- 248 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 22:43:18 ]
- 実装がひとつしかないのに世界標準とかいわれても非常に困る
- 249 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 00:09:22 ]
- っ Mono
- 250 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 00:14:38 ]
- >>249
だから一つしかないんだろ?
- 251 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 00:14:44 ]
- MonoにC++/CLIコンパイラなんてあったの?
- 252 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 00:17:41 ]
- いずれできる
- 253 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 00:20:26 ]
- >246
はあ? ISOに蹴られてるだろ? どこが世界標準規格なんだよ。 嘘もいい加減にしろ。
- 254 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 00:23:11 ]
- www.ecma-international.org/publications/standards/Ecma-372.htm
無知は黙っとけ おっとお子ちゃまに英語は読めないかなw
- 255 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 00:27:19 ]
- >>254
あれ? なにそれ? なんで普通になんの制限もないPDFがダウンロードできるの? 単にECMA規格がそーゆーもんなの? それともドラフトかなんか?
- 256 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 00:28:47 ]
- 標準規格に制限かける標準化団体はいね。
- 257 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 00:28:48 ]
- もう、C++/CLIは死に体。
- 258 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 00:29:58 ]
- >>256
IEEE
- 259 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 01:00:15 ]
- CLIもDも
C++0xへの叩き台なので問題ない
- 260 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 01:45:36 ]
- >>256
ISO も JIS も普通に金取られるぞ
- 261 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 02:35:21 ]
- ANSIも
- 262 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 22:01:33 ]
- 規格がみんな無料で閲覧できるようになればいいのに
コストはともかくトラフィックで死ねるからやらないんだろうけど
- 263 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 00:15:28 ]
- いらないものをさも必要があるかのように作って無駄にはやらせようとするM$は死ねばいいのに
- 264 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 01:02:17 ]
- 開発者に対してろくなアプローチをしないところよりはまだマシさ。
- 265 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 07:02:19 ]
- >>263
禿は「ライブラリで出来るところはライブラリでやれよ。 テンプレートで出来るだろ」という見解だったな。 というわけで、ISOでは蹴られ続けるだろうな。 実際5月のミーティングでも駄目だったし。
- 266 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 11:19:11 ]
- VC++2005です。
メインフォーム上に置いたコントロールのWndProcをオーバーライド したいんですが。普通に継承して、メインフォームのコードを書き換えると、 フォームデザイナーがうまく機能しなくなってしまいます。 フォームデザイナをちゃんと動かすためにはいろいろ大変みたいで できればやりたくないです。もっと簡単にWndProcをオーバーライド する方法はないでしょうか?
- 267 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 11:34:27 ]
- 結局、C++/CLIとC++でいつでも分離できるように実装するしかないんだよな。
C++/CLI側は「まだ実装するべき機能はあるから、追加しちゃうよ」とかほざいてるし、 標準じゃないのはいらねぇよ。
- 268 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 15:51:15 ]
- about C# Mono
Mono C# compiler version 1.2.2.1 C# Language Specification ECMA-334 Common Language Infrastructure (CLI) ECMA-335 Home Page: www.mono-project.com/ Download: www.mono-project.com/Downloads
- 269 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 17:26:09 ]
- で?
- 270 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 18:51:50 ]
- >>268
君さ、何か勘違いしてる気がするよ。
- 271 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 20:47:23 ]
- C++/CLIで作ると移植性が落ちる。
- 272 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 21:16:15 ]
- ポートも糞もないだろw
- 273 名前:デフォルトの名無しさん [2007/05/31(木) 23:26:57 ]
- 質問です。
using namespace System; using namespace System::Collections::Generic; ref class HogeItem; generic<typename CItem> where CItem : HogeItem ref class HogeList; public ref class HogeItem abstract { internal: HogeList<HogeItem^>^ list; }; generic<typename CItem> where CItem : HogeItem public ref class HogeList abstract : IList<CItem> { public: virtual void Insert(int index, CItem item) { item->list = this; ←ここでエラー } }; HogeItem::list の型は HogeList<HogeItem^>^ なんですが、this が HogeList<CItem>^ なので 変換できないって怒られます。 IList<HogeItem^>^ とかにしてもだめでした。 generic の宣言のほうを変更しても良い方法が見つからず、困っています。 item 側にどの List に格納されたのか知らせる手段がほしいのですが、 うまい方法は無いでしょうか?
- 274 名前:デフォルトの名無しさん mailto:sage [2007/06/01(金) 08:39:29 ]
- >271 名前: デフォルトの名無しさん [sage] 投稿日: 2007/05/31(木) 20:47:23
>C++/CLIで作ると移植性が落ちる。 だから世の中の0$や重要なソフトはC++なのさ。
- 275 名前:デフォルトの名無しさん mailto:sage [2007/06/01(金) 11:56:46 ]
- >>273
item->list = (HogeList<HogeItem^>^) this; HogeListは事実上HogeItemの派生クラス専用なのだから、 IList<T>の継承じゃなくてListを包含してしまったほうが楽だと思うけどな。
- 276 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:21:36 ]
- ネイティブのクラスがハンドルを持てないのはなぜ?
- 277 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 11:19:47 ]
- ハンドルはGC管理領域を指すマネージドポインタだから。
- 278 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 14:38:46 ]
- >>277
それは織り込み済みです。
- 279 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 15:13:16 ]
- ベンダーはECMAを見るだろうからISOとか関係ないっしょ
- 280 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 15:50:03 ]
- いや、ベンダーって、誰が実装するのよ?
- 281 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 18:39:41 ]
- >>276
ネイティブクラスのインスタンスは、マネージヒープ・スタック以外に作られる可能性がある しかし、CLRのGCは、自身が管理するメモリ以外を見ない だからネイティブクラスはハンドルを持てない おとなしくmsclr::gcrootを使いなさいということ
- 282 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 18:49:32 ]
- >>281
ありがとう。 つまりネイティブヒープ上にあると、ハンドルがGC対象にしていいか追跡 できなくなるって理解しました。 gcrootなんてあったんですね。調べてみます。
- 283 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 18:49:50 ]
- CreateFileとかCloseHandle呼べばいいんでは?
- 284 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 19:00:12 ]
- 審議中
∧,,∧ ∧,,∧ ∧ (´・ω・) (・ω・`) ∧∧ ( ´・ω) U) ( つと ノ(ω・` ) | U ( ´・) (・` ) と ノ u-u (l ) ( ノu-u `u-u'. `u-u'
- 285 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 19:16:51 ]
- >>279
つーか、ECMAに最初だけ登録しておいて、 以後のバージョンアップは放置ってのがMSの手法。 で「仕様は公開されてますよ、オープンです」って言う。
|

|