◎正当な理由による書き込みの削除について: 生島英之 とみられる方へ:くだすれC++/CLI(初心者用)part2YouTube動画>1本 ->画像>4枚
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1268613679/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。
ドキュメントの MSDN には、System::String(SByte*); て書いてあるけども、 System::String(char*); が正解ってことか? それとも SByte が signed char ではなくて char てこと?それは無いような気が。 ちなみに、使ってる教科書のサンプルプログラムは8bitでは char* 配列を渡してる。
厳密名の付け方が分かりません 検索しても意味不明なものしか引っかからない
>>3 LINKにある。
/KEYCONTAINER /KEYFILE
というか必要な時だけ最小限使うもの 基本的に使わないほうがいい
フォームの中にあるテキストボックスの内容をmainとか関数とかから書き換えたいんだけど どんな方法があるでしょうか? 今までは強引にチェックボックスにチェックが入ると void test(System::Windows::Forms::TextBox^ tb_log_view); こんな感じの関数呼び出してTextBoxを強引にわたして指定の処理して テキストボックスにメッセージ表示させてたんだけど 何せ使い勝手が悪いので・・・
今、「Cで書かれたライブラリをC++/CLIでラッピング(DLL化)し、 C#で使おう」という目的に向けて、Cのライブラリをラッピング中ですなのですが、構造体で悩んでます。 C++/CLI側でC#側に「構造体の配列」を返す関数が見せてるのですが、実行すると思ったように動きません。 C++/CLI側 [宣言] public ref struct SampleStruct { static CHAR cUpdate; }; static array<SampleStruct^>^ pstSample = gcnew array<SampleStruct^>(10); 関数 array<SampleStruct^>^ hogehoge(){ if(pstSample[0] == nullptr ){ for(int i=0; i<10; i++ ){ pstSample[i] = gcnew (SampleStruct); } } pstSample[2]->cUpdate = 2; return pstSample; } C#側 SampleStruct[] stTest = new SampleStruct[10]; stTest = LIBSAMPLE.hogehoge(); ここで、stTest[0].cUpdateからstTest[9].cUpdateまでを見ると 全部2が入っております。(本当は[2].cUpdateだけ2が入っていて欲しい) どこが原因か分かりますでしょうか? OS:XP 環境:VS2008 ExpressのC++版とC#版を使ってます。
> static CHAR cUpdate; Cさえ理解していないのがよくわかる。
うわ・・・・・ 泣ける・・・・orz 回答有難うです
突っ込みどころや怪しい箇所が多すぎて、どうしたいかが見えてこない(笑 配列はC++/CLIでアロケーションしていいのかとか。 C#でいう構造体はvalue class (or struct)であって、ref structはクラスだけどどっちにしたいのとか。
目的は、「Cで書かれたライブラリをC#で使う」事なのですが、
現状は、Cの方には手を加えないように、やる方法として、C++/CLIで
ラッピングするという手段があるという事なので、作業している次第。
そこで、構造体のポインタを戻り値としている関数はどう扱えば?と
思ってましたら、
http://ap.atmarkit.co.jp/bbs/core/fdotnet/17380 このような話をみつけたので、まずはref structでやってるという状況です。
CのライブラリだったらC++/CLIなんか使わずにC#でDllImportすればいいような
>>17 説明不足でした。
(当然の疑問ですよね)
そのCのライブラリというのが、元がスタティックしか考慮されておらず、
DLL用にはなってなく(__declspec(dllexport)のような記載は一切なし)、
選択肢として
1 Cのソースをdll対応に修正(__declspecを全関数に追加)
2 元のCには手を加えず、新しくラッパーを作る
があり、今後もCの方は勝手にバージョンが上がっていくので、
それなら、元のソースに手を加えない方向でやろうとなった次第です。
だからってそのラッパーをC++/CLIで書く必要はないだろ Cで薄ーいラッパー書いて普通のネイティブDLLとしてコンパイルすればおk C++のライブラリとなると面倒だけどそうでないならC++/CLIはできるだけ避けたほうが賢明
>>19 その手がありましたか!
C#でDllImportして、
DLL関数に渡す構造体、DLL関数から受け取る構造体は
[StructLayout(LayoutKind.Sequential)]を用いてC#側に定義して
やりとりするという事ですね。
試してみます
【初心者歓迎】C/C++室 から誘導されてきました。 Form1とForm2があり、Form1からForm2を呼び出すようにしています。 また、Form2に配置したボタンを押すと関数が呼び出されて、所望の処理をするようにしています。 以下の2点について教えてください。 1.関数内の処理の進捗をForm2内のLabelやProgressBarに表示したいです。 2.Form2からForm1を操作したい(Form2のボタンを押すとForm1/Form2ともに終了するようにしたい)です。 両方ともポインタを使えば出来そうな気がするのですが、例えば2.の方ではForm2を指すポインタの宣言の仕方が わからないです。 よろしくお願いします。
>>21 ポインタじゃなくて参照になる。
Form2^ form2;
>>21 動くかどうかは試してない。
【Form1.h】
ref class Form1 {
public: System::Void Form1Func() {〜}
private: System::Void Form2Func();
private: System::Void Form1_KeyDown(〜) {Form2Func();}
}
【Form1.cpp】
#include "Form1.h"
#include "Form2.h"
System::Void Form1::Form2Func(){
Form2^ form2 = safe_cast<Form2^>(Application::OpenForms["Form2"]);
form2->Form2Func();
}
【Form2.h】
ref class Form2 {
public: System::Void Form2Func() {〜}
private: System::Void Form1Func();
private: System::Void Form2_KeyDown(〜) {Form1Func();}
}
【Form2.cpp】
#include "Form1.h"
#include "Form2.h"
System::Void Form2::Form1Func()
{
Form1^ form1 = safe_cast<Form1^>(Application::OpenForms["Form1"]);
form1->Form1Func();
}
>>22 >>23 ありがとうございます。
残念ながらうまくいかないです。
環境はVS2005 C++ WinXP SP3
Form1(親フォーム)からはForm2.hをインクルードして
Form2^ frm = gcnew Form2();
frm->ShowDialog();
とできるのですが、Form.hではForm1.hをインクルードすると循環参照になってしまうようでエラーになります。
また、Form2.h内で関数宣言だけしてForm2.cpp内でForm1.hをインクルードして実行部分を書こうとしましたが
Form2.h内の関数宣言(
>>23 のprivate: System::Void Form1Func();にあたる部分)がコンパイルエラーになってしまいます。
なんでこういう意味での初心者がC++/CLIなんてマニアックな言語触ってるんだろう……? > Form2に配置したボタンを押すと関数が呼び出されて > 1.関数内の処理の進捗をForm2内のLabelやProgressBarに表示したいです。 Form1関係ないよね? Form2が勝手にやってろって話 > 2.Form2からForm1を操作したい(Form2のボタンを押すとForm1/Form2ともに終了するようにしたい)です。 Form1がForm2を作ったとき、Form2のFormClosedイベントに引っかけるとかすればいいんじゃね? // Form1内のForm2を表示させる処理 Form2^ form = gcnew Form2(); form->FormClosed += gcnew FormClosedEventHandler(this, &Form1::OnForm2Closed); form->Show(); // Form1内で定義 private: void OnForm2Closed(Object^ sender, FormClosedEventArgs^ e) { this->Close(); } ×アイコンで閉じたときはForm1は閉じない、ボタン押したときだけとかなら Form2にCloseWithParentみたいなプロパティ用意して 表示させるときのForm2^はメンバ変数に保持しておいて OnForm2Closedで確認
C++/CLIだと、Cのランタイム例外のハンドリングが出来ない臭いんだけど、どうすれば良いんだろう… ハンドラ設定してるのに動いてくれない 例えば_tcsftime(..., L"%h", ...);みたいなやつ ※普通の例外じゃないんで、マネージand/orネイティブでもtry catch出来ない
そもそもCRTが例外なんて投げないはずだが > 727 :デフォルトの名無しさん[sage]:2008/07/03(木) 13:51:22 > なんで、VC++2008の、strftime _tcsftimeは、 > 書式に無い文字を渡すと例外終了するのかなあ。 > 単に無視してくれりゃいいのに。 > 自前でパースしてから、渡してやるしか無いのかな。 > 729 :デフォルトの名無しさん[sage]:2008/07/03(木) 14:11:02 > ちょっと見てみたけど > _ASSERTE( ( "Invalid format directive" , 0 ) ); > だからデバッグ時だけの話じゃん。
>>27 つ
http://msdn.microsoft.com/ja-jp/library/ksazx244 (v=VS.80).aspx
試してみると早いかも…
int main(array<System::String ^> ^args)
{
Console::WriteLine(L"Hello World");
tm tmNow;
__time64_t tNow;
TCHAR sz[20];
try
{
_time64(&tNow);
_localtime64_s(&tmNow, &tNow);
_tcsftime(sz, 20, L"%h", &tmNow);
}
catch (...)
{
Console::WriteLine("error!");
}
Console::ReadLine();
return 0;
}
ハンドラ設定ってなんだ普通に_set_invalid_parameter_handlerで呼んでくれたが
SerialPortクラスを使ってデータを受信する際、 ・SerialPort::Data_Receivedイベントで受信 ・受信データはQueueクラス経由でメインスレッドから受信 ・メインスレッドでは、あるバイト数を数秒以内に受信できない場合タイムアウト を、実装したいのですが、タイムアウト処理はどのように記述したら良いのでしょうか? // Data_Receivedイベント private: System::Void serialPort_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e) { int length = serialPort->BytesToRead; array<unsigned char>^ buffer = gcnew array<unsigned char>(length); serialPort->Read(buffer, 0, length); Queue^ sync_queue = Queue::Synchronized(m_queue); for (int i = 0; i < length; i++) { sync_queue->Enqueue(buffer[i]); } }
マネージクラスのインスタンスをグローバルスコープっぽく参照する方法ないの? 全コンストラクタでやりとりするようなマンドクセ方法がいやだ
C++/CLIに書き換えてる奇特なものです char www[100]; char* ptr; ptr = www + i; array<char>^ www = gcnew array<char>(100); array<char>^ ptr; ptr = www + i; ← ? ?の部分をご教授くださいm(_ _)m
pin_ptr してもいいけどさ、www[i] で駄目な理由は何なの?
C++の感覚なら毎回[i+a]としないで最初からオフセット付けときたいのは当然だろ 無理なので常にwwwとiをセットにして持ちまわるのが普通 メソッドの引数にもオフセットを指定できるようにする
perlのように return a, b できるようにしてくんないかな
.NET4ではTuple型自体は導入されたのでC#やVBでは将来的に 言語レベルでサポートされる可能性はある。 C++/CLIはほぼ見捨てられてるので期待するだけ無駄。
>>34 array<char>^ www = gcnew array<char>(100);
interior_ptr<char> ptr;
ptr = &www[0] + i;
VC2010 EEを使用しています。
RS-232Cで通信を行い、プログラムを終了させようとして
this->Close();
を行うと、エラーメッセージも出ないままプログラムが固まってしまいます。
ポートを閉じてないことが原因かと思い、
serialPort1->Close();
を実行してみたところ、今度はここで同じように固まってしまいました。
http://vsug.jp/tabid/63/forumid/46/postid/9991/scope/posts/Default.aspx を、参考に、BeginInvokeを使用していますが、ダメでした。
この場合、どこを見れば良いのでしょうか?
よろしくお願いします。
画像処理を行いたいのですが、 Bitmap、Image、Graphic・・・どのコンポーネントを使うのがお得なのでしょうか
>>42 どんな画像処理をするかが分からないと、
えらべないと思われます
カラー画像をモノクロにしたり、コントラストかけたり、拡大縮小したりの初歩的なことがしたいです。 あと、今のところはCUIで行いたいです。
>>44 俺はあまり詳しくないが、
ぐぐると
http://msdn.microsoft.com/ja-jp/academic/cc998604.aspx ここで
Bitmap クラスを利用することにより、画像に対してピクセル単位で様々な処理を行うことができます
と書いてある
.netのクラスを使うなら、おそらくやりたいことはこういうことだろう
Bitmap使ってみたけれど、画像の保存の仕方がわからない・・・ WriteBitmap("C:\\・・・",data)とかdata.Save(・・・)ってな感じでできないのかな
なぜ下記のようなプログラムでエラーが発生するのかわかりますか?? --- プログラム --- #include "stdafx.h" using namespace System; using namespace System::Drawing; int main(array<System::String ^> ^args){ Bitmap^ image = gcnew Bitmap("test.jpeg"); image->SetPixel(0,0,Color::Black); ←ここでなぜかエラー起きます image->Save("test2.bmp"); return 0; } --- エラー内容 --- ハンドルされていない例外: System.ArgumentException: 使用されたパラメータが有効ではありません。 場所 System.Drawing.Bitmap..ctor(String filename) 場所 main(String[] args) 場所 c:\documents and settings\***\デスクトップ\test\test.cpp:行 10 場所 mainCRTStartupStrArray(String[] arguments) 場所 f:\dd\vctools\crt_bld\self_x86\crt\src\mcrtexe.cpp:行 309
>>49 test.jpegはちゃんとプロジェクトファイルと同じ階層にある?
余計なお世話かも知れないが、.netでやるなら
C#で作ったほうが楽なんじゃないだろうか・・・
わざわざマイナーな環境で挑戦するよりもいいと思うんだが
これだけ利用者に嫌われてる言語も珍しいな 初心者が質問するたびに使うなと勧められる
>>50-51 ありがとう。jpegじゃなくてjpgだったという凡ミスしていたことに気づけたわ
・・・一度C#に浮気してみる
>>52 嫌われているというか、言語自体が初心者お断りだからな
初心者が無謀なことしようとしていたら、そりゃ止めるだろう
C++も.NETも使いこなせる人が、止むを得ず使うための物。 使わなくていいなら使いたくない。
始めようにも資料が無さ過ぎる MDI作るときどうするかとか ちょっとしたことの逆引きがネット上で全く出てこない ようやくOpenGL表示できるようになって C++の頃の遺産をつかえると思ったのに
C#でできるから、それを参照にすればいい なにもかもC++/CLIで済ませようとしないことをお勧めする
嫌ってはいないんだ ただ何故かこの言語とのファーストコンタクトというか接し方が 一言入れておかないと不幸にしかならなそうな人が多いのよね
WinFormsデザイナとかC++/CLIにそもそも要らないんだよな こういうのがあるから「Visual C++ 2008 で簡単GUIプログラミング」みたいな勘違い本やサイトが出て初心者が道を間違える
56ですが自分 C++の文法がある程度使えて フォームデザインが総合開発環境上で扱えて 至れり尽くせりじゃん、と思ってとっかかりました 現実は情報が全く無く よくわからないクラスとかいっぱいあって 解説も無くて どうしようと途方にくれていましたが、QTとかよりは 導入コストも再勉強のコストも無いだろうと信じて使ってます。 だって、CやC++だとGUI作るの辛いんだもん っていう理由だとダメですか
まあ正直C++の名前が付いてるだけで マネージ部分はC++とは直接関係なくて学び直し必要だし それなら素直にC# C#2.0の範囲までなら多分C++/CLIより簡単だし サンプルも多いし将来WPF/Silverlightとかにも応用できるし C#やっとけば逆にC++/CLIを橋渡し用ぐらいなら書けるようになるし
けっきょくC++風に文法を汚したC#と普通のC++を無理矢理くっつけただけの代物だからな
>>62 それを一応形にできたところは評価できる。
LPVOIDからarray<String^>^に変換したいのですが、アドバイスください。 //////////Form1_Load////////// HANDLE hMap; LPVOID lpBuf; hMap=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,1024,L"View"); if(hMap==NULL){Form::Close();} lpBuf=MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,0); if(lpBuf==NULL){Form::Close();} if(GetLastError()==ERROR_ALREADY_EXISTS){//すでに同じ名前のオブジェクトが存在する lpBuf=Environment::GetCommandLineArgs();//コマンドラインから取得//ここでエラー ///////////ここまで///////////// つまり二重起動時に共有メモリを使いたいのですが、どうしてもできません。 先人方どんなことでもいいので教えてくだせえ。
> LPVOIDからarray<String^>^に変換したい > lpBuf=Environment::GetCommandLineArgs();//コマンドラインから取得//ここでエラー コードの方はarray<String^>^からLPVOIDに変換したいように見える
>>67 2008 Express Editionを使っていまして・・・ヘッダーがないらしいです。
http://www.codeguru.com/forum/showthread.php?t=468408 >>68 コマンドライン引数を得た後、array<String^>^に変換しようと思ったのです。
宣言時からarray<String^>^だとMapViewOfFileでつまずいちゃうので・・・。
どちらにせよ、コマンドライン引数を得た後、
共有メモリarray<String^>^として反映できればいいのですが。
全体にコードが滅茶苦茶に見えるし
そもそもLoadイベントなんかでやる処理には見えないけど(mainでやることだろ)
共有メモリにString^を書き込みたいのなら
>
http://www.codeguru.com/forum/showthread.php?t=468408 のリンク先にString^をポインタに変換する方法が載ってるからmemcpyなりなんなりすればいい
複数の文字列を書き込む必要があるなら\0なりなんなりで区切る
共有メモリをやめてSendMessageに妥協しました とにかく二重起動時にコマンドライン引数を渡すことができました! 皆様、貴重なアドバイスをありがとねん
C++/CLIにおけるsafe_cast,static_cast,dynamic_castの違いについて教えてくださいよ safe_cast :型が合わないと例外が発生、実行コスト中 dynamic_cast:型が合わないとNULLを返す、実行コスト大 static_cast :型が合わなくても何もしない、実行コスト小 この認識であってますか?
safe_castとdynamic_castのコストはほぼ同じ。 static_castが速くなるのはダウンキャストの場合だけ。静的に解決できる場合はsafe_castと同じ。
>>66 いまさらだけど、.NET Framework 4以降ならMemoryMappedFileクラスを使えばいいと思うよ。
.NETのハンドルのダウンキャストにstatic_cast使うのは激しく疑問 公式の説明でもパフォーマンスをえらく強調してるが、 そのためにわざわざ検証不能コードにしてまでやるほどのものなのかと
http://www.infoq.com/jp/news/2010/10/Co-Evolution-Doubts >どうやらそれらは、レガシC++アプリケーションをWindows Phoneに移植したいと考えている多くの開発者にとって、C++/CLIは、ベストなルートに見えるのであろう。
地獄への道は善意で舗装されている
筆者自身は否定的に見えるけど、まだそんなこと考えてる人もいるんだねぇ
筆者ほんとにC++/CLI触ったことあるのかな Silverlightで使える範囲のC++/CLIはC++とは全く互換性なくてただの汚いC#なんだけど
絶対的処理性能が必要な場合か、過去資産使う時以外はメリットよな?
検証可能なコードしか使えない場合は処理性能同じだし過去資産も使えないよ
音の再生ってC++/CLIでできるの? 画像の場合ピクチャボックスみたいな感じに楽に音楽再生させたいのだけど
ネイティブのC++でできるなら同じ方法でできる .NET使ってもできる どちらにしてもC++/CLIとは直接関係ない話
「気がする」ではない。 絶対初心者向けではない、その通りだ。
ですよね 俺みたいな勘違い君が集まるから スレタイ変えると平和になる気がする
「C#でアプリを作っているが、C++のライブラリで音を鳴らしたい」もしくは
「C++(非CLI)でアプリを作っているが、.NETのライブラリを使って音を鳴らしたい」
→そこだけC++/CLIを部分的に使おう
という風に特別な意図を持って言語であって、
>>81 のような質問が出てくる時点でC++/CLIを使うのは間違っている
そんなに大きなライブラリでなければ
>>19 方式がベターだな
初心者用のC++/CLIじゃなくて C++/CLIの初心者向けのスレなんだよなw
C++/CLI初心者にクラスチェンジできる条件が、 1) C++習得レベル一定以上 2) .NET習得レベル一定以上 だからな
C++とC#があった上で補助的に使うもんだからねぇ みんな言うように初心者が使う物じゃないね。
こんなのに熟練したくないわ どうしても必要なときにちょっと調べてその場が凌げれば充分
C++にGCを導入した言語。そう考えれば実用性は高いはず。
C++と、GCをサポートした別の言語を混ぜた言語。 アンマネージとマネージの境界は常に意識する必要がある。
仕事では使いたくないが、趣味でいじるのなら楽しい。 Express Editionだと実行中のプロセスにアタッチできるのが C++しかないってのも使ってる理由のひとつ。
日経のムックでC++/CLIが宣伝されてるな。 簡単GUIプログラミング!みたいな見事な勘違い記事だった。騙されて道を誤る初心者が不憫でならない。
道を踏み外しそうになり、C++Builderにシフトできました
増えた言語仕様って、ref, ^, gcnew だけでしょ?
ジェネリック,トラッキング参照,ファイナライザ,プロパティ,イベント,デリゲート, etc CLI拡張の部分だけでも言語仕様書の量がC#並み
Z言語になるころには なんとなくこんな感じ、って思い描いたものが 1行で組みあがるくらいに なるわけねぇ
ref classのメンバーに構造体がある場合、その構造体のポインターはどうやって取得すればいいの? pin_ptr<SCRIPT_STRING_ANALYSIS*> pssa = &(this->構造体型の変数); こういう風にしてもうまくいかないんだが
>>104 自己解決した
単にpin_ptrの型を間違っていただけだった
これって変数名とかに全角文字がつかえるのだな。 int 数値 = 0; みたいに。 うっかり全角アルファベット混ぜたりしたら大変だな。
それCLIでない方のC++でもできるよ コンパイラが共通なんだから
>>106 今のパソコンて、ゼロに斜線が入らないから、うっかり
int 数値 = O;
とかしてしまうとやばいぜw
Windows Mobile用のWM_GESTUREが入ったgesture.hは何を入れたら良いんですか? Windows Mobile 6 Professional SDK Refresh.msiと 試しにVS2010EEを入れてみたけど ダメでした Windows Mobile 6 Professional SDK Refresh.msiは2環境でインストールして いるのでインストーラがコケたとかでは無さそうです 定義だけなのでGoogle Codeとかでも良いのですが、MS系は上手く手に入りません。 くだすれですがよろしくお願いします。
queue<array<String^>^ > queue_dwnload; こう宣言すると System.ArgumentException' の初回例外が発生しました。 とイミディエイトウィンドウにメッセージが出るんだけど 宣言の仕方どこが間違ってますか?
つ STL/CLI #include <cliext/queue> using namespace System; cliext::queue<array<String^>^ > queue_dwnload;
すまん書き足りなかった、インクルードはちゃんとしてて プログラムも正常に動作してます それでもう少しシンプルなコードで試してみたんだけど VS2008で新規作成、プロジェクト、CLRのwindowsフォームアプリケーション のテンプレートでプロジェクトを作成して #include <cliext/queue>を追加 ~Form1(){}の下あたりに cliext::queue<array<String^>^ > queue_dwnload;を追加 デバッグ実行する これだけでメッセージが出ます、キューの宣言は間違ってないみたいだけど 何が原因なんだろう?
VS2010にしてしまっているので再現できないが、 ~Form1()と同じprotectedには出来ないのかコンパイル時に警告がでる。 privateにしたらどう? private: cliext::queue<array<String^>^ > queue_dwnload;
とりあえず問題の切り分けだな。 まずコンパイルが警告なしで通るかどうか。 通るならデバッグ実行とデバッグなし実行で差があるかどうか。 別のPCでも再現するかどうか。
使用環境:VS2008 Professional Edition プロジェクト:CLR クラスライブラリ 目的:コピーコンストラクタ、代入演算子を潰したい エラーの出ないコード。 ref class Hoge sealed { private: Hoge % operator=( Hoge const % rhd ) { return *this; } ; Hoge( Hoge const % src ) {} ; } 実装したいコード。 ref class Hoge sealed { private: Hoge % operator=( Hoge const % ) ; // error LNK2020 未解決のトークン(06000001) Hoge::op_Assign Hoge( Hoge const % ) ; // error LNK2020 未解決のトークン(06000003) Hoge::ctor } C++/CLIでメンバ関数の実装をせずに放置というのは可能でしょうか?
そもそもref classは定義しない限りコピーとか無理じゃなかったか
C#などから使わせるつもりなら演算子のオーバーロードは全部staticにしないといけないし 代入演算子やコピーコンストラクタはそもそもオーバーロードできないし constも使えないし参照渡しや参照返しもダメ(そもそもref classだから無意味) つかまずC#やるべき。.NETの常識が無さすぎ。
>>118 そうなんですか、回答ありがとうござます。
>>119 回答ありがとうございます。
http://msdn.microsoft.com/ja-jp/library/sy1y3y1t (VS.80).aspx
このサンプルコードのコンパイルが通らなかったのですが、そもそもサンプルが間違ってるという事なのでしょうか?
あと、.NETの常識を学ぶのにオススメの書籍などあれば教えていただけると幸いです。
Lock に関係ない実装は省略して書いてるだけでしょ 間違ってると言うより、そこは問題とは関係ない部分なだけ
>>121 回答ありがとうございます。
別途実装をするしか無いという事ですね。分かりました。
そうすると
>>119 の回答から考えて、C#などから使わせるつもりが無いなら、
・演算子のオーバーロードはstaticにする必要はない
・代入演算子やコピーコンストラクタはオーバーロードできる
・constも使えて参照渡しや参照返しもOK
ということでしょうか?
C++/CLIではref classのメソッドにconstを付けられないから C#やVBと相互運用しないとしてもconstパラメータは事実上役に立たない。
趣旨がわからないね。 C++スタイルでやりたいだけなら、そもそもC++/CLI 使う必要性がないんでない?
>>123 回答ありがとうございます。
Hoge % operator=( Hoge % arg ) { 代入処理の実装 } ;
これだと代入元が書き換えられそうで気持ち悪いですけど、そういう流儀なのですね。分かりました。
>>124 >>122 の質問に関しては元々あった疑問ではありません。
>>119 の解答に書かれている内容に関しての事実確認です。
趣旨に関してはスレ違いだと思いますので書きません。
%もいらん ref classだから常にポインタ渡し
>>124 MSのサンプルだか自動生成されるコードだかで、
あんな風にrefクラス上でC++っぽいことをやっているものを見た覚えがある。
元の質問者のコードもそういうのに影響されたのではないかと思う。
private ref struct A{ UInt32 data[5]; }; これがコンパイル通らないんだけど、 array<UInt32>^ data;とかにしていちいちgcnewするしかないんですか? データ宣言するだけのためにコードなんて書きたくないので、うまい解決法お願いします。
うん、array<UInt32>^にしてコンストラクタ書くしかないんではないかなあ。
C#では構造体でstackallocが使えるからvalue classならいけるだろうと思ったけど無理なのね この手の機能でC#に負けてどうする
CStringを使うには何をインクルードすればよいの? atlstr.h、atlbase.h、atlapp.hは入れてるけどコンパイルとまる
VC++2010 ExpressEditionです。 System::windows::form::timer で一秒ごとにlabel->textを更新していますが(要は時計です) 最小化から復帰するとlabel->textが更新されなくなります、何故でしょう。
最小化したときにとめたタイマーを元に戻すんだキバヤシ
そもそもUI用のタイマで時計を作るな MSDNにもはっきりそう書いてあるだろ
>>133 故意に止めるようなことはしていないんですが、そういう仕様なんでしょうか?
>>134 えぇぇぇぇぇ。時間分解能が悪いとかあの辺ですか!ヽ(´Д`;)ノアゥ...
スレッドタイマークラスとかに変えます。ご教授ありがとうございます。
MS公式のガイドラインかなんかで「System.Windows.Forms.Timerで時計を作らないでください」って無かったっけ? どこだったか忘れたけど
一番使い易いところにあるのに、一番性能悪いとかひでー話だよな 俺も最初使ってみて混乱した
VS2005です。 C++/CLIでラップしたネイティブのライブラリから例外が発生して、 C++/CLI側でcatchした時に、 ネイティブ側のインスタンスのデストラクタが呼ばれません。 これはバグと考えて良いのでしょうか? VC++2010 expressでは普通に呼ばれたので・・
>>132 です。
あれからいろいろいじりまくっていたんだけど、どうもフォームの透過色(TransparencyKey)が特定の色の場合
この問題が発生しているようです。引き続き調べてみます。
全く相手にされてないようですが、 解決したので適当に報告しときます。 とりあえず、ネイティブのライブラリオプションを /EHscから/EHaに変更することで、デストラクタが呼ばれるようになりました。 どうやらオプションの違いでABIに互換性が無くなり、 例外をハンドルできても、その後のアンワインディングを正常に実行できていなかったようです。 デフォルトのオプション設定だと上記のような状態になるので、 自分みたいに知らずに組んでる人はメモリリークし放題ですね。
C++/CLIでSystem::Actionって使えないの? event Action^ Foo; とやると エラー1error C2955: 'System::Action' : クラス ジェネリック を使用するには ジェネリック 引数リストが必要です って出てくる…
Action<T>はmscorlib.dllだがそれ以外はSystem.Core.dllだ
>>144 ありがとう…
おまえそんなところにいたのか…
聞きたいんだけどスレ住人はVC2010でC++/CLI書いてる? それともインテリセンス使うために2008書いてる? それともC++/CLI書かない?
C++/CLI書かない…けど次の案件がVS2010指定でネイティブDLL呼び出す必要があるから 書かざるを得なくなるかもしれなくてちょっと憂鬱
.NET用言語で一番の糞言語だからね>C++/CLI
>>148 C++自体が言語として糞だから仕方がない。
それと互換性保ちながらここまで実現したということを考えると、かなりすごいと思う。
>>150 え。それは、今では使うのは好ましくないとされているレガシー関数群をいまだにお使いになられているからではないですか?
CとC++に互換性があるとは言わないだろ CLIの部分については互換性ゼロなんだから
>>152 > CとC++に互換性があるとは言わないだろ
それは上位互換ありでしょ。完全ではないけれども。
boostを完璧にコンパイルできないだろとか言い始めるのかと思ったら 斜め上をいく馬鹿だったか
初心者です。 ストリップメニューを開くと5個ぐらい項があって 3つチェックされているとして、その3という数字を取りたいのですが どうすれば良いでしょうか? 開く部分の変数はStripMenuItem1です。 for(int = 0;i<StripMenuItem1->項目数;i++){if(StripMenuItem1->子項目->checked == true){temp++;}} みたいなのはありますでしょうか?どうすれば良いでしょうか?よろしくおねがいします
自前で数えろよ、毎回書くのがいやなら関数にしとけ。
>>155 StripMenuItem1.Itemsプロパティで子が全て取得できる
言っちゃ悪いけどそういう意味での初心者がC++/CLIなんか使うもんじゃない
先にC#覚えて
>>156 レスありがとうございます
申し訳ありません。理解できません
何か関数があるのでしょうか?
自前で数えるといっても、2個チェックのときは2と自動で取ってこれるようにしたいのです。
そういえば
if(項の変数->checked == true){temp++;}
を何行も書けばいいだけですね。ありがとうございました!
ときどき勘違いした可哀想な子が紛れ込んでくるな
>>21 や
>>42 はまだC++/CLI使ってるんだろうか
次スレでは「初心者用」を消して、 > - C++プログラミング > - .NETプログラミング (C#, VB.NET, etc.) > > に不自由する方はお引き取りください とか若干きつめに書いておけばいいじゃね? 何年先になるかは分からんけどw 4,5年ぐらい?ww
WCHAR f[] = aToolStripMenuItem->Text->ToCharArray(); cli::array<Type,dimension> ^' から 'WCHAR []' に変換できません。 ->ToCharArray();でWCHARが帰ると思っていたのですがなぜでしょうか?どうすれば良いですか?
>>163 wcscpyしたいです。
というか元々wcscpyの引数に入れるつもりでしたができませんでした。
>>163 ちなみに、第二引数にその->TEXTの文を入れて
別に用意した第一引数のWCHAR[3][]とかに入れたいのです
>>161 もともとは初心者お断りスレもあったが、話題があまりなくて落ちた
>dat落ち姉妹スレ
>C++/CLI part3
このスレでもC++、.NETの初心者は対象外だけどな
C++と.NETの両方を極めないとCLIは使いこなせないからな
Express EditionでもC#プロジェクトと同じソリューションに入れられればいいのになあ VCのExpress Editionが入門者向けというより達人の縛りプレイ用になってるじゃないか
ダイアログで値を入力させて、その値を親ウィンドウで処理したい場合に どうやって値の受け渡しをすればいいの? 親にpublic関数を用意して呼び出すのが簡単なわけだけど この.hファイルに親の.hファイルをインクルードすると子のデザイナが壊れる 子ダイアログで親の形を認識させる手段がない
子のプロパティを公開して親からアクセスすればいいんじゃねえの?
比較関数を書く形式で、リスト(cliext::list)をクラスのメンバで ソートするにはどうしたら良いでしょうか? こんな感じじゃないかと思うのですが 「関数呼び出しには引数リストがありません。 メンバへのポインタを作成するために '&Test::Form1::less' を使用してください」 とエラーが出ます 以下コードを簡略化して書いてます //クラスTest ref class Test { public: DateTime date; Test(void){}; }; //比較関数 bool less(Test^ lhs, Test^ rhs) { return lhs->date < rhs->date; } //リストの作成 list<Test^> list_item; Test^ item = gcnew Test(); list_item.push_back(item);//(以下省略 //ソートする list_item.sort(less);
試してないけど、static にして Test::less じゃね?
レスありがとうございます Form1クラスの上で定義したらできました いまいちよくわからないですが これからじっくり理由を考えて見たいと思います、感謝
VC++のスレでこちらの方がふさわしいのではないかと言うことで移ってきました。 VC++2010 Expressでフォームからマウスが外れているときはフォームの透明度を あげる(薄くする)と言うプログラムを組んでいます。フォームのMouseLeaveイベントと、 MouseEnterイベント発生時にOpacityプロパティを変えることで実現を目論んだのです が、ウインドウの外枠(サイズを変えるときにドラッグする部分や、上部のウインドウ名 が書かれている部分)にマウスがあると、MouseLeaveイベントが発生して、薄くなって しまいます。もちろん、ここではたとえ、フォーム外側から移動してきてもMouseEnter イベントは起きません。 フォームから完全にマウスカーソルがそれた時のみ透明度を高めたいのですが、 どういうイベントを用いればよいんでしょうか?
で、その質問内容のどこがC++/CLIに関係しているんだ?
ってことは、.Net Frameworkのスレ探します。
.net Framework関連のスレって見つからないんですが、どこが適切でしょう。 すみません。
ref classのメンバー変数にID2D1SolidColorBrush*のようなものがある template <class T> inline void SafeRelease(T *ppT) { unsigned long refCount; if (*ppT) { refCount = (*ppT)->Release(); *ppT = NULL; } } にID2D1SolidColorBrush*のポインターを渡すことが出来ないからpin_ptrで渡してたんだが、いい加減書くのがめんどくさくなってきた スマートに処理しようと思い、template <class T> inline void SafeRelease(T *%ppT)というパラメーターの関数を定義したんだが、こいつへの渡し方がわからない 誰か教えてくれまいか
あるプロセスをオープンしようとしてます 読み取り専用で試したが結果は同じ CLIとしてコンパイルしたWindowsアプリからOpenProcessを呼び出すとフル権限で開ける C++としてコンパイルしたコンソールアプリからはOpenProcess読み取り専用でもアクセス拒否される OSはWindows7 64bit 内部のことは分からないですが、OpenProcessは同じ標準process.h内のものを使ってると思う 少なくともソース上ではそういう記述をしてますがコンパイラが何をしてるかまでは定かじゃないです 大きな違いはコンソールアプリであることですが、それが拒否の原因になるんでしょうか?
VC2010を使用しています。 テキストボックスに文字が入力され、エンターを押されたら動作する処理を行いたいのですが、 TextChangedイベントに if(TextBox1->Text->EndsWith("\r\n")) では、認識出来ないのですが、どのようにすればよろしいのでしょうか? よろしくお願いします。
フレームワークの話はどこですれば良いのでしょうか?
>185 com::ptr で保持して、リリース処理はそっちで対応しちゃあかんの?
>>191 ref classにはcom::ptrはおけない思う
>>192 すまん。
CComPtrと勘違いしてた
com:ptrはCLRでも使えるのか
>193 それ用のクラスだぜ あとは .net Framework の System::Runtime::InteropServices::SafeHandle を実装したら?
DirectXのリソースの解放にSafeHandleは使えないんじゃなかったっけ 最近のは知らんけど
Direct3D自体の作成/解放が1スレッドに限定されるのに対し ファイナライザスレッドでどーのこーのみたいな話だったか 使えないというか使う意味がない、みたいな
printfとか普通に書いたとき、 なんでprintfがアンマネージのコードって コンパイラは理解できるの? それらしい印になるようなキーワードを 特に書いてないような気がするのだが?
内部的には #pragma managed や unmanaged 指定がされてんじゃね? #include か #using かで切り分けてるんだと思うけど
失礼します。 Form1からForm2を開き、Form2を表示した状態でForm1のテキストボックスにフォーカスを合わせたいのですが、何か良い方法はありますでしょうか? Form2のShownイベントで、Form1->TextBox1->Forcus();を実行してみましたが、Form1が見つかりませんでした。 よろしくお願いします。
見つかりませんでしたじゃなくて 見つかる様にするんだよ。 作成時にインスタンス渡すとか、間を取り持つ作るとか
http://imagingsolution.blog107.fc2.com/blog-entry-109.html ここを参考に、Ownerを指定してもダメでした。
と、言うよりサンプル通りに作ってみても
1>d:\vc2010\test\form2test\form2test\Form2.h(60): error C2039: 'Form2_Load' : 'Form2Test::Form2' のメンバーではありません。
1> d:\vc2010\test\form2test\form2test\Form2.h(15) : 'Form2Test::Form2' の宣言を確認してください。
1>d:\vc2010\test\form2test\form2test\Form2.h(60): error C2065: 'Form2_Load' : 定義されていない識別子です。
(以下略)
と、なってしまいました。
Form2.hの宣言
this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(292, 273);
this->Name = L"Form2";
this->Text = L"Form2";
this->Load += gcnew System::EventHandler(this, &Form2::Form2_Load);
this->ResumeLayout(false);
Form2.cppにて
#include "Form1.h"
using namespace Form2Test;
System::Void Form2::Form2_Load(System::Object^ sender, System::EventArgs^ e) {
Form1^ PForm;
if(this->Owner != nullptr){
PForm = static_cast<Form1^>(this->Owner);
}
}
この記述では間違っているのでしょうか?VC2010を使用してます。
よろしくお願いします。
本当にForm2はグローバル名前空間なのか? とりあえずヒントだけ出したけど、C++、.NET、プログラミングの基礎にあたる内容はスレチだから返答は不要 というか、C++/CLIはコンパイル可能なコードすら書けないようなプログラミング初心者が使うものじゃない
VC++2010&CLIで4.0以前(4.0は含まない)のNETを使う方法はありますか? MSDNには3.5を利用するには2008SP1を入れろとかありましたが NETのバージョンごとに入れるのはさすがに無駄すぎるので。
http://msdn.microsoft.com/ja-jp/library/ff770576.aspx プロジェクトファイルをテキストエディタで編集しろということらしい
C++/CLIで作った混合アセンブリはCLR2(.NET2.0-3.5)向けにコンパイルすると
CLR4では動作しなくなるので注意
インテリセンスも削られてるのでC++/CLIなら2008で作業するほうがいいよ
>>206 http://msdn.microsoft.com/ja-jp/library/47w1hdab.aspx こちらのページを読んだところ
2010は4.0だけ、2008SP1なら3.5だけなのかと思ってしまったのですが
2008SP1は2.0〜3.5まで扱えるんですね
2008を入れることにします
ありがとうございました
質問です 画面を表示させ、ボタンを押したら表示されている画面をbitmapイメージとして保存(出来れば印刷も)したいのですが、 そういう事は可能なのでしょうか? サンプルソース等探してみたのですが見つからなくて行き詰ってしまいました。
C# スクリーンショット でググれ C#だぞ。C++/CLIじゃないぞ。
>>209 なるほど、C#で調べれば良かったんですね。。
自身に[Alt]+[Print Screen]を送れば良かったんですね
ありがとうございます
フォーム上にメニューバーを追加したいんですが どういうソース書けばいいんでしょうか?
C# MenuStrip でググれ C#だぞ。C++/CLIじゃないぞ。
質問です。
テキストファイルから設定を読み取り、動的にリンクを生成し、別プログラムを起動するランチャーを作っています。
動的にリンクは生成できますが、イベントハンドラに仕込むコールバック関数を動的には生成できないため、
1つのコールバック関数を呼び出しそのなかで起動するプログラムを判断せざるを得ないと考えました。
gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandlerで登録される関数には、
呼び出し元のリンクが引数に渡されるので、cliext::mapで事前に、リンクとコマンドラインの組を格納して判断に用いよう
と考えました。が、リンクのハンドラ( System::Windows::Forms::Label^ )はoperator <が定義されておらず
ソートできないため使用できませんでした。
それではcliext::vectorに、リンクとコマンドラインのcliext::pairを格納しようと思いましたが、どうやらムリみたいです。
実際コンパイルエラーになりました。参考ウェブサイト:
http://blogs.wankuma.com/episteme/archive/2007/11/21/109646.aspx http://d.hatena.ne.jp/crimsonwoods/20071130/1196384990 どうすれば、リンクとコマンドラインの型を管理できるでしょうか。
リンクの型(System::Windows::Forms::LinkLabel)を継承したクラスを定義し、
コマンドラインをメンバ変数として持たせるというのも考えましたがどうも無理やり過ぎる気がします。
何かよい方法はないでしょうか。
.NETでSTLは使うな
System.Collections.GenericのDictionary<,>使え
というか
>>208 以降の人はC++/CLIやる前にまずC#やったほうがいい
>>215 お早い回答ありがとうございます。
> System.Collections.GenericのDictionary<,>使え
どのようなものか、調べてみます。
> というか
>>208 以降の人はC++/CLIやる前にまずC#やったほうがいい
C++を既に学習しており、基本C++の文法でいける(と私が思う)C++/CLIのほうが新たにC#を学ぶより
よさそうだと考えておりましたが、
今後考えてC#を学ぶことも考えたいと思います。ありがとうございました。
コントロールのTagプロパティを使う手もあるけどね C++/CLIはC++とC#を理解して その上でもしも両方同時に必要になったときに橋渡しするために嫌々ちょっとだけ使う言語です
>>218 そんな手もあるのですね。
結局
>>214 で述べた
> リンクの型(System::Windows::Forms::LinkLabel)を継承したクラスを定義し、
> コマンドラインをメンバ変数として持たせると(略
これで作ってしまいました。今回はこれでいいとして、今後はC#を学んでみたいと思います。
ありがとうございました。
>>214 手元にあるvs2010では問題なく動いた
CLIはすぐデザイナが壊れるし IDEが自動でインデントをぐちゃぐちゃに破壊してくれるので C++をラップするくらいにしか使わない
VSの次のバージョンではC++/CLIのWinFormsデザイナは削除したほうがいいと思う
>>219 のようなかわいそうな人を生むだけで害悪しかない
C++もかわいそう 別に「統合」してくれと頼んだわけでもないのに へんな統合開発環境の下で働かされてる
繰り返しの多い処理をするとメモリオーバーになってしまいます どのようにメモリを解放するのですか?
C++/CLIのコードをビルドしたアセンブリにアンマネージコードが 含まれてないかチェックする方法って知ってますか? なぜこういうことを聞くかというとこのクラスライブラリをマネージコードから 使う必要が出てきたためです。
意味がわからん 混在アセンブリはマネージコードから使えるけど セキュリティとか移植性とかでマネージコードしか使えないケースなんだとしたら まず間違いなく/clr:pureではダメで/clr:safeでないといけない でも/clr:safeなんて世の中にあるC++/CLIのコードのほとんどがコンパイルできないよw
>>228-230 レスありがとう
> 混在アセンブリはマネージコードから使えるけど
> セキュリティとか移植性とかでマネージコードしか使えないケースなんだとしたら
> まず間違いなく/clr:pureではダメで/clr:safeでないといけない
説明不足でした
とにかくC++/CLIのコードのすべてのパブリックなクラスとメンバに
マネージコードからアクセスできるようにしたいんです
アンマネージコードが含まれてるとそれができないんじゃないかと思って質問しました
アンマネージコードは含まれててもいい というかそのためのC++/CLI
何を持って出来ないと思ったかがポイントかな。 とりあえず動くコードを張っとこう。 VS2010だとこのままで動くし、 VS2005-2008の場合はmanifestをちょこちょこいじる必要がある。 // cl /LD /O1 /clr test1s.cpp #include <iostream> class baz { public: void say() { std::cout << "Hello BAZ" << std::endl; }}; public ref class Foo { public: void Say() { std::cout << "Hello FOO" << std::endl; baz b; b.say(); }}; ref class Bar { public: void Say() { std::cout << "Hello BAR" << std::endl; baz b; b.say(); }}; // csc /o /r:test1s.dll test1.cs using System; class Program { static void Main() { new Foo().Say(); // new Bar().Say();// internalは呼び出せない。 } }
そんな有り得ないというか無意味な使い方を想定するのは不毛だし C++/CLIみたら混在しているものと見なせばいいよ
>>232-235 レスありがとう
アンマネージが含まれてもマネージから呼び出せるということだけど
C++/CLIのソースコードで画像処理とかやってて、
例えばビットマップの構造体をnewして先頭からのバイト数でアクセスするとか、
その情報を渡してWin32APIを呼ぶとかしまくってるんだけど、
これってアンマネージにコンパイルされるよね。
こんなメソッドをC#から呼んでまともに動作するんだろうかって心配なんです。
やっぱり、Managed Unmanagedの意味を取り違えてたか。 その程度ならManagedでコンパイルされてるよ。ただしunsafeだけどね。
>>237 マネージだけど暗黙的にunsafeとしてコンパイルされるから
アンマネージのように構造体やポインタが使えるってことか。
納得した。ありがとう。
文字列を逆順にするプログラムを書こうとした場合、自分で考えると以下のようになりました。 --------------------------- #include <string> string str = "abcde" string new_str; int i; int length = str.size(); for (i=0; i<length; ++i) { new_str[i] = str[length-i-1]; } --------------------------- なにかかカッコ悪い感じがするのですが、 一番スマートな書き方はどのような感じになりますでしょうか? PHPのarray_popみたいのがあったらwhileで回して綺麗にかけると思うのですが、 C++のstringライブラリにありましたでしょうか? あと、C++では i++は++iの方がよいと誰かに教わったのですが、理由を忘れてしまいました。 何故でしたでしょうか・・? ご教示いただけますと幸いです。
このスレ的にはこういう回答になる(笑 // cl /FUSystem.Core.dll /clr:safe test2.cpp using namespace System; using namespace System::Linq; int main(array<String^>^ args) { String^ str = "abcde"; String^ new_str = gcnew String(Enumerable::ToArray(Enumerable::Reverse(str))); Console::WriteLine(new_str); } 拡張メソッドは使えなかったっけ?ちとスマートじゃないな。
WCHAR [32]' から 'System::Object ^' に変換できません というエラーがでた場合、どういう変換処理をかいたらいいんでしょうか??
System::Object^ v_obj = gcnew System::String(v_wchar);
たぶんこれかな msclr::interop::marshal_as
>244 ありがとうございました。その逆の変換はどうするんでしょうか?
>>242 今時サロゲートペアすら考えないコーディングは絶滅すべき
>>247 サロゲートペア対応に挑戦しようと思うのだが、VS2010expressのコンパイラでエラーになる。
なんかスマートな対応方法ないすか?
literal String^ str = L"「叱る」と「\uD842\uDF9Fる」";
error C3850: '\uD842': ユニバーサル文字名が無効な文字を指定しています。
error C3850: '\uDF9F': ユニバーサル文字名が無効な文字を指定しています。
>>249 ググると𠮟るのユニコードは「20B9F」となってるけど。
textBoxに入力した文字を分割して配列に割り当てる方法がわかりません
C# 文字列 分割 でググれ C#だぞ。C++/CLIじゃないぞ。
>>249 \uxxxxじゃなくて\UxxxxxxxxでUTF-32使って指定するとか?
>>250 ,253
CLRは内部コードが16bitのユニコードなのでこうなちゃうんですね。
C#はこれでいけるのですけどね;;
const string msg = "「叱る」と「\uD842\uDF9Fる」";
とりあえず、これで対応しました。
array<wchar_t>^ cmsg = { L'「', L'叱', L'る', L'」', L'と', L'「', 0xD842, 0xDF9F, L'る', L'」' };
String^ msg = gcnew String(cmsg);
サロゲート対応のコードを書いてみました。
http://ideone.com/rXbuf string.Concat( StringInfo.GetTextElementEnumerator(s) .Cast<string>() .Reverse() .ToArray() ) でええやん(めんどくさいからC#)
.GetTextElementEnumeratorの戻値はIEnumerableじゃくて IEnumertorだから直接Linqにつなげない。
C++/CLIの具体的な難点ってなんでしょうか? 少し触ってみたところ、GUIも作り易い感じがするしCライブラリも簡単に使えそうだし、 いったいどういう問題があるのかなと気になりました (VC++2008EEなのでintellisenseもとりあえず大丈夫です)
>>261 できればもうちょっと具体的にお願いします
・C++言語ではなくではなくてC++/CLI言語であること、 C++/CLI独特の文法を覚える必要がある。C#との互換性もない。 ・使う人が少ないので情報が少ない ・Intelisenceの不具合が多い(例え2010でも逃れられない) ・中途半端にネイティブなのでCLRとしての最適化も中途半端。
Cのライブラリ使うにしても、DllImportの手間を差し引いてもよっぽどでなきゃC#の方が楽なんだよね
どうもありがとうございます Visual C#を試しに入れてみたところ、 何だこれは…ひょっとしてC++/CLIだけでなくVisual C++自体が手抜き…?と思ってしまいました これだとたしかに生産性に差が出るかもと思うと同時にMSの露骨な贔屓に少し閉口してしまいました まだほんの入口ですしCライブラリについて不安はありますが、とりあえず使ってみようと思います
VC++はネイティブC++の開発環境としては現在最高だろ 言語そのものがインテリセンスやRADに向いてない C++にはC++にしかできないことをやらせるとMSは言ってるので フォームデザイナを使うような用途へのサポートが強化されるようなことは今後も期待できない C++はネイティブ特化、C++/CLIは橋渡し専用
まだVS2010のC++/CLIのインテリセンスないのか この分だともうずっと出ないだろうな
2010で外されたってことは、MSは諦めたってことなじゃないの?
いや、次のバージョンでは復活させるって言ってる。 問題は「次」というのがSP2なのかVS2014とかになるのかが分からないこと。
その前にC++/CLI自体が… 今やMSにとってはATLでCOM触るラッパーを書くためだけの言語だからなあ
/*********************************/ /* __finallyブロックは何のために */ /*********************************/ try { throw 128; } catch (int num1) { System::Console::WriteLine("catchブロック: num1 == {0}", num1); } __finally { System::Console::WriteLine("__finallyブロックって何の意味があるのか疑問だな"); } System::Console::WriteLine("__finallyブロックがなくても、throwの有無にかかわらずここで実行できるじゃないか。");
だがその処理の呼び出し元でcatchしたかった時はどうする? C++なら自分で再throwする必要があるが、 finallyを使えばそういうことを考える必要がない。 ついでに言うと、finallyブロックは 例外が起きようとも起きなかろうとも、 breakやreturnで抜けても必ず実行されるので ファイルの閉じ忘れなどを回避する実に有効な手段である。
>>273 だいたいそれで間に合うとは思う。
auto_handleやauto_gcrootの助けもあるしな。
まあ、今までのVisual C++にも__finallyあるし、C#にもfinallyあるし、
あえてC++/CLIに__finallyを搭載しない理由もないと言ったところでは?
使ったオブジェクトのデストラクタ呼ぶだけでいいケースは確かに多いけどそうじゃないときもあるだろ その場限りのちょっとした後処理のためにもいちいちクラス作るの?
超初心者です。 教えてほしいのですが、 hoge(int *piyo)は hoge(int^ piyo)と してるのですが hoge(int **piyo)は どのように書き換えれば良いのでしょうか すいませんが教えてください
/* Hashtableのポインターへのポインターがコンパイルエラー */ using namespace System; using namespace Collections; const char *pc1; const int nmax = 4; // const char * の任意の要素数のデータを動的にメモリを割り当てて使う const char **ppc1 = new const char *[nmax]; int n1 = 0; *(ppc1 + n1++) = "higasi"; *(ppc1 + n1++) = "nisi"; *(ppc1 + n1++) = "minami"; *(ppc1 + n1++) = "kita"; for (n1 = 0; n1 < nmax; ++n1) { pc1 = *(ppc1 + n1); Console::WriteLine(gcnew String(pc1)); } // 同様の手段で、Hashtable ^^ にメモリを動的に割り当てて任意の数 // のHashtable ^ を格納しようとするとコンパイルエラー ArrayList ^pArrayList1 = gcnew ArrayList(); for (n1 = 0; n1 < nmax; ++n1) { pArrayList1->Add(gcnew Hashtable()); } Hashtable ^pHashtable1, ^pHashtable2; Hashtable ^^ppHashtable1 = gcnew Hashtable ^[nmax]; // コンパイルエラー ppHashtable1 = gcnew Hashtable ^[nmax]; for (n1 = 0; n1 < nmax; ++n1) { pHashtable1 = dynamic_cast<Hashtable ^>(pArrayList1[n1]); // ^(ppHashtable1 + n1) = pHashtable1; // コンパイルエラー // pHashtable2 = ^(ppHashtable1 + n1); // コンパイルエラー pHashtable1 = pHashtable2 = nullptr; }
このコンパイルエラーになる System::Collections::Hashtable ^^ppHashtable1; って何とかならんかいな。多重ループで毎回dynamic_cast演算子使ってる と効率悪いだろうし。
delete [] ppc1; を忘れとった。 それと、ppHashtable1 = gcnew Hashtable ^[nmax]; の行も 「// コンパイルエラー」を忘れ取った。
/* cli::array を使ってもコンパイルエラーかいな、難しいもんだな */ cli::array<Hashtable^> ^ppHashtable1 = gcnew cli::array<Hashtable ^>[nmax]; IEnumerator ^pIEnumerator1; pArrayList1->GetEnumerator(); while (pIEnumerator1->MoveNext()) { pHashtable1 = dynamic_cast<Hashtable ^>(pArrayList1[n1]); ^(ppHashtable1 + n1) = pHashtable1; pHashtable2 = ^(ppHashtable1 + n1); pHashtable1 = pHashtable2 = nullptr; } pIEnumerator1 = nullptr;
間違えた pHashtable1 = dynamic_cast<Hashtable ^>(pArrayList1[n1]); の行は間違いで正しくは pHashtable1 = dynamic_cast<Hashtable ^>(pIEnumerator1->Current); だった。
using namespace System; using namespace Collections; typedef Hashtable^ pHashtable; pHashtable pHashtable1 = gcnew Hashtable(); pHashtable pHashtable2 = gcnew Hashtable(); pHashtable pHashtable3 = gcnew Hashtable(); pHashtable *ppHashtable1; ppHashtable1 = &pHashtable1; // 可能 ppHashtable1 = nullptr; // ppHashtable1 = new pHashtable; // コンパイルエラー // delete ppHashtable1; // ppHashtable1 = nullptr; // const int nmax = 3; // ppHashtable1 = new pHashtable[nmax]; // delete [] ppHashtable1; new演算子が使えないならSTLのvectorなら何とかなるんだろうか。 でも、.NET Framework 2.0 SDKをダウンロードしたものでは標準ライブラリの ヘッダーファイルを#includeできないからアンマネージは使えない。
中途半端な質問をしてすいませんでした。
>>277 さんレスありがとうございました。
実はDirectXのBaseClassesをCLIで書いてるのですが
GetSyncSource( [Out]IReferenceClock** pClock) ;
(IReferenceClockはmanagedインターフェイスです)
の部分をどう書けば良いかわからないです。
interior_ptrというのを使えと出てきますが、使い方がよくわかりません。
どう書けば良いか、どなたかご教示ください。
静的配列も作成できないのか。これもエラーになるのか。 typedef System::Collections::Hashtable ^pHashtable; pHashtable pHashtable_hairetu[8]; マネージなクラスというのはどうしようもないな、困ったもんだ。
これもエラーになるのか。 やっぱりArrayListのままで甘んじるしかないようだな。 typedef System::Collections::Hashtable ^pHashtable; pHashtable *pHashtable1 = new pHashtable(); char *pc1 = reinterpret_cast<char *>(&pHashtable1); pc1 = reinterpret_cast<char *>(&pHashtable1); pHashtable pHashtable2 = *(reinterpret_cast<pHashtable *>(pc1)); CLIってぼろいな。
マネージドクラスをネイティブクラスでラップしてから配列に入れるとか・・ C++/CLIは異なる言語が同居する2世代住宅言語だからなぁ。 #include <msclr/auto_gcroot.h> using namespace msclr; using namespace System; ref struct Foo { void Say() { Console::WriteLine("Hello World !"); } }; struct Bar { auto_gcroot<Foo^> foo; Bar() : foo(gcnew Foo()) {} }; int main(array<String^>^ args) { Bar bs[] = { Bar(), Bar(), Bar() }; for (int i=0; i<3; i++) bs[i].foo->Say(); }
もうちょっと改良 #include <msclr/auto_gcroot.h> using namespace msclr; using namespace System; ref struct Foo { void Say() { Console::WriteLine("Hello World !"); } Foo() { Console::WriteLine("Foo Created"); } ~Foo() { Console::WriteLine("Foo Deleted"); } }; typedef auto_gcroot<Foo^> foo; int main(array<String^>^ args) { foo ag[] = { gcnew Foo(), gcnew Foo(), gcnew Foo() }; for (int i=0; i<3; i++) ag[i]->Say(); }
すいませんが再度質問さしていただきます C++で class Foo{ --色々なメソッドやメンバ-- } である別のクラスのメソッドで void Piyo(Foo **hoge);というのがあり 渡す値がFoo* fooとして Piyo(&foo);とするとします。 これをCLIで実現するにはどのようにすればよいでしょうか どなたかご教示ください。
質問の意図が良く分からないけど、こんな感じの回答でいい? using namespace System; ref class Foo {}; void Piyo(Foo^ %hoge) { hoge = gcnew Foo(); } int main(){ Foo^ f = nullptr; Piyo(f); Console::WriteLine(f); Foo f2; Piyo(%f2); Console::WriteLine(%f2); }
.NET的には単にreturnで返すのが普通 どうしても参照渡しでやりたいなら void Piyo([System::Runtime::InteropServices::OutAttribute]Foo^ %hoge) こう書くのが.NET的には正解 クラスライブラリ作ってるんでなければ好きにすればいいけど
ありがとうございました。 たいへん参考になりました。
教えてほしいんですが。 C,C++なら typedef union { int a; short b; double d; }Union; としたらUnionのサイズはsizeof(double)で Union u = 1;としたら、aに1が入ると思うんですが。 CLIで [StructLayout(LayoutKind::Explicit)] ref struct Union { [FieldOffset(?)]int a; [FieldOffset(?)]short b; [FieldOffset(?)]double d; }; と宣言したとして、?の部分には何の数値を入れればよいのでしょうか。 ヘルプを見ると「フィールドの物理的な位置を示します。」 と書かれているのですが、馬鹿なんでわかりません。 どなたか教えてください。
C++/CLIにおけるジェネリックメソッドとテンプレート関数の違いを説明してくださいお願いします
>>294 全部0
>
>>295 テンプレートはただの言葉遊び
ジェネリックは実行時に展開される
DLLを作る場合、アセンブリのパブリックメンバにテンプレートを使ってはいけない
DirextXXinputのXInputGetState関数実行の格納先構造体 struct CONTROLER_STATE { XINPUT_STATE lastState; XINPUT_STATE state; DWORD dwResult; bool bLockVibration; XINPUT_VIBRATION vibration; }; をC#で受け取れるようにするにはどうすればいいんですか? ラップというのはどういう流れになるんですか?C++/CLIの本2冊読んだんですが解説コードからちょっとでも違うと全くわからないです 今のところの認識は、 structをそのままrefクラスに入れる>エラー大量 structの前にrefをつける>エラー大量 structから一つ一つ値を完全にC++/CLIで作った構造体に抜き出し、その構造体をC#から読み込む>これなら当然できる ラップするとはどういうことなんでしょうか
本二冊読んでvalue classが出てこないってありえるのか…?
どういうことですか?structの前にvalueをつけたら混合型はサポートされていませんというエラーがでます
そりゃ、ref や value をつけたら C++/CLI の管理だからな 通常の C++ のポインタとか持ってちゃ、混合型になるだろ
>>297 > structから一つ一つ値を完全にC++/CLIで作った構造体に抜き出し、その構造体をC#から読み込む
もちろんこれ
単純に書くだけなら直接C#でも大して手間の差はない
まじですか・・・ 何かものすごい事を期待していました・・・
ってC++CLI使わなくても直接C#からXinput呼べるんですか? どうやるんですか?
PInvoke で渡す構造体はC#側で用意してあげればいい
ありがとうございます 意味が全く分かりませんがPInvokeを調べてみます
再度質問さしていただきます struct Hoge { union { DWORD dwGBitMask; DWORD dwUBitMask; DWORD dwZBitMask; DWORD dwBumpDvBitMask; struct { WORD wFlipMSTypes; WORD wBltMSTypes; } MultiSampleCaps; }; を ref struct Hoge { [StructLayout(LayoutKind::Explicit)] ref struct Union { [FieldOffset(0)]DWORD dwGBitMask; [FieldOffset(0)]DWORD dwUBitMask; [FieldOffset(0)]DWORD dwZBitMask; [FieldOffset(0)]DWORD dwBumpDvBitMask; とまでしたのですが、 struct MultiSampleCaps { WORD wFlipMSTypes; WORD wBltMSTypes; } の部分はどのように書けば良いのでしょうか、すいませんが教えてください。
C++/CLIでわざわざマネージ型をP/Invokeに使う意味がわからん。 しかもよりによってなぜ今時DirectDrawなのか。 [StructLayout(LayoutKind::Sequential)]struct MultiSampleCaps { ここは同じでオフセットも不要 } /*Hogeの中*/[FieldOffset(4)]MultiSampleCaps MultiSampleCaps; .NET関連で調べ物するときのキーワードはC++/CLIじゃなくてC#ね。 情報量1000倍だから。アホらしいと思ったらC#へどうぞ。
VC++6.0のMFCなプログラムとVC++2008 Express Edition の.NETなプログラムで プロセス間通信したいのですがどうすればいいですか。
Graphicsをつかって1ドット書きたいのですが方法在りますか? g->DarwLineだと2ドット最小?
g->FillRectangle(Brushes::White, 0, 0, 1, 1); できた! これからc++/cliするのとc#するのどっちがいいですか? GPGPU & direct Xやるとしたらc++の方向のほうがいい?
GPGPUやDirectXならC++のみじゃね? C#だとラッパー使うことになるし まぁ、C++/CLIだけは無いけど
C++/CLIを使おうとした初心者を思いとどまらせるスレになってるな
進む先が地獄であることを知らない奴を追い返してやるのは当然だろう
何も知らないでVisualC++使ってWindowsアプリを作ろうと思うと、 自動的にC++/CLIになるからなー MSは鬼や
.NET FrameworkとC++を知ってればどうって事無い
C++だとUI作り辛いし、C#だとネイティブじゃないから、 C++/CLIを使えば良いんじゃね?
こうしてC++/CLIを勘違いした犠牲がまたひとり・・・
と、思っていた時期が俺にもありましたってだけ MSは頑張って理想通り完成させてくれよう むしろ諦めたっぽいがw
正直、むしろ起動速度や処理の即応性とかの GUI こそ C++ でやって、ロジックとかに .net fw を使うための言語だと思うんだが
C++とC#を使いこなしたうえで両方を使うために C++/CLIというならいいけど、両者の利点を 生かすためにいきなりこれ、というのは無理w
>>328 起動速度や応答性を気にしないなら、C#で十分ってことだな
いや起動速度はC#と変わらないよ ネイティブのDLLを読み込む分遅くなることはあっても速くなることはない それからアンマネージコードとマネージコードの境界を越えるオーバーヘッドは馬鹿にならないので 下手するとマネージコードだけの方が速い
さらにC++/CLIの存在価値が下がったw 本当にラッパー専用言語だな
C++にGCを入れろと言う要望への、一つの回答。 D言語も悪いところも見えてくる。
C++/CLIがなかったら どうやってラップするの?
別にスタティックライブラリだろうがC++ライブラリだろうが なんでもかんでもDLLに包んでP/Invokeでおk ObjCコンパイラ以上の荒業でラッパーコードが書けるのがC++/CLIの醍醐味だけど なんか、こう、便利とは違うんだよなあ…
C#でできなくてC++/CLIでなら可能なポインタ関係の操作ってあったっけ? C#のunsafeの方が簡潔にCっぽく書けて扱いやすい気がするんだが
C#はMarshal派 C++のUIだけC++/CLIやC#みたいに自動で作ってくれるC++は無い物か BCBなら出来るけどさ
MSからBCB出してくんねーかな C++/CLIは無かったことにして、買収しちゃえばそれで済むのに
だからC++/CLIは「WinFormsが使えるC++」なんて生易しいものじゃないと何度言えば
なぜC++は易しいのにC++/CLIは易しくないのか? みたいな無神経な言い回しが何度も言われていた時期があった。 聞くほうも同じくらい無神経だから何度言っても通じないことは容易に想像できる。
まあネイティブのC++でGUI作るよりはずっと簡単だけど C++/CLIでWinForms使うなっていうのは どうせC#わからないと使えないしC++の経験があってもC#覚えたほうが早いからC#やれってこと C++の経験があるからC++/CLIがいいだろうと思って始めた初心者が C#のTIPSサイトですぐ出てくるようなコントロールの使い方を質問してくるとそりゃC#やれと言いたくなる
>>344 Windowsでの基本はC++だが、
WinFormでの基本はC++じゃない件
2010にインテリセンスのらないの確定か vNextも最初のバージョンは載らないらしいし
GUIでUI設計ができてネイティブコードその上爆速コンパイル Borland時代のDelphiはまさに神言語だったんだなぁと思う
C#がネイティブコード吐く言語だったとしてもコンパイルは爆速のはずだよ C++の言語仕様が糞なだけ
理屈では可能でも 現実の大部分のプログラムはそうなってないんだけど
そうか? それだと原発事故と飛行機事故と自動車事故と比べて騒いでる連中と同じだぞ
Cは標準ライブラリが安全性を確保するのが難しい作りになってるだけで、 使うライブラリによっては安全に書ける、気がする
セキュリティは別にして、.NETはメモリ破壊が起きないのがいい お前はもう死んでいる的なバグがずっと少ない
ガベコレは、理論武装とかしなくても安全性が明らかだから好感を持てるんだが、 逆に言うとガベコレ使わなくても明らかに安全な部分はCで書いていい
C++/CLIはやれば出来る子 計算部分はネイティブで書いて、GUIや描画部分は.NETにやらせることで 高速かつ生産性の高いプログラミングが出来る ・・・と、言う夢だったのさ
>>357 Cは安全性を捨てて速度得てんだよ バカか?
Cに安全性を追加したら
それは劣化C#になるから、下手に自分でかいた甘いコードで安全性をはかるよりも
C#でやるべき
お前はなんか、C++上で劣化C#作って喜んでそうなバカだな
VS2010で作っちゃったんだけど、VS2008に変換することって出来ます? インテリセンス無いから入力がめんどくさい・・・
無理 一応注意しとくと2008でコンパイルした混在アセンブリは.NET4でロードできなくなるよ?
新規プロジェクトにコードだけ引っ越した方が簡単な気がするけど
俺もそう思う projファイル書き替えでなんとかなるけどね 混在はapp.config無理やりつけてやるとか
MSBuild 用のXMLなんだから、直接修正しろよ
どうでもいい事だよ C++/CLI で better C なんて
切るんじゃなくてWinRT API用の拡張。 .net framework用には今まで通りC++/CLIを使う。
.NETとCOMで共通のAPIを用意して、C++は完全ネイティブでCOM使うっていうのは C++/CLIに比べれば至極真っ当なやり方だと思う 最初からそうしてくれてれば良かったのに
>>374 それではプラットホームに依存してしまう。
C++/CLIってCLI拡張の部分は標準化されてるけど ネイティブコードとどう結びつけるかは実装依存でしょ CLIに依存する記述だけ言語仕様から削ればCOMとのバインディングは実装次第ってことで問題ない
Win32アプリケーションとして作成したプロジェクトで、 作成されたウィンドウに.net framework用のコントロールを 貼ることは可能でしようか?
>>378 ありがとうございます。
MFCのCViewの派生なんですね。
CView系は使いたくないのでちょっとソースを読んでみます。
別にソース読まなくても、CWinFormsControl じゃ駄目なの?
>>380 CWinFormsControl で大丈夫そうですね。
ご指摘ありがとうございます。
>>362 多分わかってるだろうけど、おかしいよ。
Cは安全性を捨ててなんていない。安全性なんて無かった。
C++/CLIならほとんど何も違わないが C++/CLIはC++じゃないけどそれはわかってる? そんな質問するような人がなんでC++/CLIなんか使うのか正直意味がわからない 素直にC#使うか、C++やりたいんだったらネイティブでATLやMFC使ったほうが
初心者用といっても、.NETとC++はマスターしてないと。
>>384 は
>>385 の意味がわかるまで精進しましょう
今までFormで自動で作る機能でストリップメニューを作ってたのですがそうすると一個づつthis->A = gcnew... this->B = gcnew... みたいな感じで作られてしまって、ABCのときもあればABCDEの時もあるようにしたいので ループみたいな感じでまとめたいのですが array<System::Windows::Forms::ToolStripMenuItem>^ strips = gcnew array<System::Windows::Forms::ToolStripMenuItem>(5); というやり方だとは教わったのですがこれをメニューアイテムに登録するときに this->StripMenuItem1->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(5) {this->AToolStripMenuItem,this->BToolStripMenuItem,this->CToolStripMenuItem・・・} と書いてたのですがここはどうすれば良いでしょうか?
その前にusing namespace System::Windows::Forms;を入れることを激しくおすすめするw
array<System::Windows::Forms::ToolStripMenuItem^>^ じゃないの っていうかC++/CLIなんかやめてC#やれ
>>392 ありがとうございます
そこは直しました
this->StripMenuItem1->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(5) {this->AToolStripMenuItem,this->BToolStripMenuItem,this->CToolStripMenuItem・・・}
ここに何を入れていいのかわかりません
C#もやってますがどちらにしろ初心者でわかりませんし・・・
配列を作ったら次は各要素にToolStripItemのインスタンスを代入する C#の入門書買って出直してきたら
for i=0 < .. <i++ IntPtr ptr(hoge[i]); strips[i] = (gcnew System::Windows::Forms::ToolStripMenuItem()); strips[i]->Text = System::Runtime::InteropServices::Marshal::PtrToStringAnsi(ptr);} hoge[i]はhoge[5][20]のWCHARです 先頭の一文字しかTextに入っていません。どうすれば良いでしょうか?
> Marshal.PtrToStringAnsi メソッド
> アンマネージ ANSI 文字列から最初の null 文字に遭遇するまでのすべての文字をマネージ String にコピーし、
> 各 ANSI 文字を Unicode に拡張します。
何故、WCHAR*を入れられると思ったのだろうか
http://msdn.microsoft.com/ja-jp/library/bb384865.aspx >>396 >アンマネージ ANSI 文字列から最初の null 文字に遭遇するまでのすべての文字をマネージ String にコピーし、
> 各 ANSI 文字を Unicode に拡張します。
どの部分がcharって意味なんですか?
ちなみにsize_t wLen = 0;errno_t err = 0;/*ロケール指定*/setlocale(LC_ALL,"japanese");/*変換*/err = wcstombs_s(&wLen, wStrC, 20, charmoji, _TRUNCATE);で直したらできました
array<System::Windows::Forms::ToolStripMenuItem^>^ strips = gcnew array<System::Windows::Forms::StripMenuItem^>(5); のstripsをフォームいじっても消えないところでグローバル宣言したいのですがどうすれば良いでしょうか?
>>397 ANSI 文字列って書いてるんだから違うものを入れるなよ
しかも、文字列のマーシャリングとか
>>397 のリンク先を見れば一発で解決するような超FAQだから、
そんな無駄なコードなんか貼らなくていいよ
>>398 クラス直下に書いとけば
そんなレベルで試行錯誤してても時間の無駄だよ
悪いことは言わないからちゃんと1から言語を勉強してきたほうがいい(C#かCLIじゃない方のC++を)
arrayの内1つを消して間を詰めるにはどうしたら良いですか?
arrayって使わない方が良いんですか? vectorとかの方が良いんですか?
.NETが絡むところでvectorは使うな 動的に要素数を変えたいならSystem::Collection::Generic::List<T>を使う もういいからC#やれ
じゃあ最後にC++/CLIのメリットを教えてください
キモかわいい array<Hoge^>^%はC#だとref Hoge[]で味気ない
for(int i=1;i<5;i++){this->textBox1->Text += (i + ". \n");} 改行しません。どうしてでしょうか?
\r\nと書かないといけないのですね ありがとうございました
WCHAR *g; *g= this->textBox1->Text->ToCharArray()[0] ; コンパイルは通るし画面のテキストボックスにも文字はちゃんと表示されてるのに オブジェクト参照がオブジェクト インスタンスに設定されていません とエラーが出て止まります。どうすれば良いですか?
まぁ、pin_ptr が何のためにあるのか、という話だな
C++/CLIのプロジェクトに C#のソースも追加出来ますが(Prof以上のみ?)、 C++/CLIからそのC#のクラスを使えますか? C#からC++/CLIのクラスは使えるようですが・・・
C#のソースは知らんが、C++/CLIから.netのクラスやら機能を使うのは.netの機能使うのと同じ
プロジェクトに追加するだけなら自由だが。 混ぜてコンパイルは無理。 dllを参照して使用するのは相互に可能。
やっぱ使えませんか 大人しくプロジェクト分けるしかないのですね・・・
アプリ起動中にpictureBox内に矩形を表示させておきたいのですが どこにコードを書けばいいですか? pictureBox_Paint内だと起動直後の一瞬しか表示されません
大方CreateGraphicsとか使ってるんじゃね
質問です。 ネイティブ(アンマネージド)なC++の静的ライブラリを C++/CLIでリンクして使うと変な所で死んだりするんだけど、 こういう事しちゃだめなのでしょうか? 一旦ネイティブなDLLを作って、そこを介して呼べば死なないのですが・・・。 そのライブラリは実装を隠蔽するため クラスのインタフェース部分のみ公開して、 インスタンスの生成と開放を関数化してあるのですが、 つまりはnew/deleteがライブラリ内で実行され、 ライブラリ内でnewした結果を返し、マネージドコード内で保持し、 そのポインタをライブラリに渡してdeleteしてもらう形になっています。 よく分からないのは、わざとnewをせずポインタをNULLで初期化したままにしておき、 「NULLでなければ開放関数を呼ぶ」というコードを書いただけでも、 そこで死んでしまうのです。(NULLなので開放関数は呼ばれない!) vectorヘッダをインクルードするかしないかで、死んだり死ななかったりと、 挙動がおかしすぎて正直よく分からない状況です。
ファイナライザが別スレッドから呼ばれるからとかじゃない
(gcnew Form1)->Show(); で作成されたフォームに 元のフォームにある文字列変数を渡す方法があったら教えてください
コンストラクタの引数で渡すかプロパティ定義して渡す つかそれだとC#もC++もさっぱりだよね? ならまだ遅くないから今すぐC#に乗り換えること。
FindWindow で探すとか、EnumWindow でタイトルを調べるとか?
同じアプリ内でしかも.NETのフォームでFindWindow/EnumWindowとかアホか
オブジェクトとメンバ関数名を与えられたときに、その関数を呼び出すことはリフレクションを介して簡単にできますが、 指定された名前のグローバル関数を呼び出すことは可能ですか?
.NETでグローバル関数なんて使うもんじゃない クラスの静的メンバにする
自作したグローバル関数を書くのはどこが一番よろしいですか? プロジェクト全体でつかうような関数です。 stdafx.hに書いたら error LNK2005: "int __clrcall testfunc(void)" (?testfunc@@$$FYMHXZ) は既に stdafx.obj で定義されています。 ってエラーが出るのですが( ;∀;)
そらそうだろ C++/CLIというか、C++の基本から勉強し直してこい
関数にstaticかinlineつけて内部結合にするがよろし
ガードしても意味無いだろ。 別々のソースでインクルードされてコンパイルして、 それらをリンクしたら同じ名前の関数が複数出来上がってるわけだし。 と、ついでに質問者に説明してみる
あるサイトを参考に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> ^' に変換できません。 とエラーが出るのですが、どうすればよいのでしょう どなたかご教示ください。
Encoding.GetChars()ってChar[]とるんじゃないのか? 関係ない型をボックス化して何がしたいの? というか、Encoding.Convert()の時点で既にSJISになっているし
Hoge hoge[x]; の要素数はsizeof(hoge)/sizeof(hoge[0])で取得できますが Hoge *hoge=new Hoge[x]; の要素数はどうやって取得すればいいですか?
>>442 unsigned charに ^ は要らないと思うが
>>445 ネイティブ配列のサイズは自分で変数や定数で覚えとくのが基本
というかC++/CLI関係ないだろ
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でめられてしまいます。 半角256文字以上の文字列を投げると、255文字+\0で丸められてしまいます。 2000文字程度変換できれば良いのですが、 の間違いです。すみません。
関数を以下のように書き換えて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 ◢▀▅ ▃ ▋ ▋ ◢▀ ▀◣ ▌ ▌ ▌ ▌ ▌ ▌ ▌ ▌ ▐ ▌ ▌ ▌ ▐ ▀■ ▌ ◢◤ ▀▃ ◢◤ ◥◣ ▌ ▌ ▐ ● ● ▌ 馬鹿にはコピペできないの。 ▌ ▌ ◥◣ ╳ ◢◤ ◢▀▅▃▂ ▂▂▃▅▀▅ ◢◤ ▀▀▀▀▀ ◥◣ ▐◣▃▌ ▐▃◢▌ ◥◣▃▌ ▐▃◢◤ ▀▅▃ ▂▅▀ ▀■▆▅▅▅▆■█▀ ▐▃▃▃▲▃▃▃◢▍
◢▀▅ ▃ ▋ ▋ ◢▀ ▀◣ ▌ ▌ ▌ ▌ ▌ ▌ ▌ ▌ ▐ ▌ ▌ ▌ ▐ ▀■ ▌ ◢◤ ▀▃ ◢◤ ◥◣ ▌ ▌ ▐ ● ● ▌ 馬鹿にはコピペできないの。 ▌ ▌ ◥◣ ╳ ◢◤ ◢▀▅▃▂ ▂▂▃▅▀▅ ◢◤ ▀▀▀▀▀ ◥◣ ▐◣▃▌ ▐▃◢▌ ◥◣▃▌ ▐▃◢◤ ▀▅▃ ▂▅▀ ▀■▆▅▅▅▆■█▀ ▐▃▃▃▲▃▃▃◢▍
日本の国民の中には、外国の事情がある程度分かっている人を除けば、 放送内容を信頼している人がまだいることは確かだ。一方で、ネット 住民たちのほぼ全員が、放送番組には政府の意図が色濃く反映されて いることを知っている。自分の国がどういう国かということが、よく 分かるようになってきているのだ。
失礼します。色々まわっていたのですが此方を勧められたので此方でも質問させて頂きます。 VC++でWindowsフォームのプログラムを組んでいるのですが、 別ファイルでextern宣言したクラス(の配列)をform1.h等で参照したいのですがコンストラクタが上手く働いてくれないのか、宣言の場所が悪いのか ゴミ値ばかりで上手く動作してくれません。 何かヒントもらえませんか?
ソース貼るか エラー貼るか 何かヒントもらえませんか?
いきなりcharではなくwchar_tに変換 でWinAPI使ってcharに
>>455 コードも何も書かれてないから憶測でしかないが、newとgc_newを使い分けてないとか、*と^を使い分けてないとか、その辺じゃない?
後は配列が.netのクラスをちゃんと継承してないとか
生のC++とC++/CLIは全くと言って良いほど別言語で、でも生のC++も使えちゃうからC#とC++の合わせ技より罠が多く、バグが多くなり易いよ
VC++のプロジェクトのwindowsフォームアプリでOpenMPって使えないんですかね? '/clr:pure' と '/openmp' は同時に指定できません ってエラーが出てるんで、CLIでは使えないのかな?とか思ったりしたんですがどうでしょう
/clr:pureで使えるわけがないだろネイティブコード入れられないんだから /clrならどう? っていうかWindowsフォーム使いたいだけだったら終わってるC++/CLIなんてやめて C#でGUI作って重い計算だけC++(/CLIでない)で書いてC#から呼んだほうがいいよ
>>461 です
/clrならできました。ありがとうございます。
よくわかっていないのですが、/clr:pureにしていたのはネイティブとごっちゃになって
変なことになるのを防ぐためなんですかね?だから/clrとしてもそこらへんを気をつければ
問題ない、ということでいいんでしょうか?
C++/CLIは初めてなんで、どう”終わってる”のかわかりませんが、C#はやったことが無いので、
できればこっちでやりたいところなんです。
大丈夫だ、C++経験者からしてもC++/CLIの習得よりC#の習得の方が楽だから
/clr:pureだとアセンブリにネイティブコードが混ざらない。 ネイティブコードを混ぜないC++/CLIなんて存在価値ゼロだから、C++/CLI使うんなら常に/clrでおk。 C#をやれ。いくらC++の経験があろうが関係ない。間違いなくC#の方が早く使えるようになるし 開発効率に天と地ほどの差がある。C++/CLIはMSに完全に見捨てられている技術。
VS2010ではもうインテリセンスすら付けてくれてないもんね
C#やってみます。 過去のレス見てきたんですけど、ひどい言われようですね あと、あんま書き込み無いのにレスは早くて面白かったです。
俺はこのスレに張り付いてるけど一応ちょっと待ってからレスしてるわ
呼び出し規約がよくわからないのですが、関数を宣言した場所で明示しない場合 ・引数・返り値の型にマネージ型が含まれる→__clrcall になる ・含まれない→__stdcall になる。実装がマネージドコードにコンパイルされると、double-thunkingになる という理解であっているでしょうか。 また、非マネージ型のメンバ関数においては、 managed-code -> __thiscall stub -> __clrcall のような double-thunking が発生するのでしょうか?
やっぱそうだよな。VS11Betaで試してconnect行くわ。
VS11betaでもやっぱりIntellisSense効かなくて "No additional information available"って言われるんだけど 何が悪いんだろう ButtonとTextBox置いてButtonのイベントハンドラの中で textBox1->とかやってるだけなんだけど 最初のt打っただけで上のエラーが出て ->まで打ってもエラー出たままでメンバも表示されない
function1のとこだろ どう考えてもC++/CLIでやるべきことじゃないよなこれ 内容は凄いのに…C#にすれば…
おお、派手だなw .net framework 使いたいだけならC#でいいなーほんとに
eのこと聞いてんのかな? Math::Exp() にすりゃいいと思うが、、、、
こういう変に優秀な勘違いがいるからC++/CLIに手を出す奴がいなくならないんだよな C++/CLIの記事や書籍ってC#やVBに比べて妙に良質だったりするし
C/C++では配列の終端の一つ次を指すポインタは有効なポインタだったのですけど、 マネージ配列の終端の一つ次を指す interior_ptr は配列がGCで移動したときに正常に更新されますか?
いまさらですが、試してみたところ正常に移動するようでした。
(勝手な推測ですが) 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 なんですね…。困った困った。
配列でinterior_ptrなんて必要? 君が言ってるように常に配列のハンドルとオフセットをペアにしとけばよくね interior_ptrってクラスのインスタンスフィールド指すのに使うやつでしょ
既存コードの一部だけマネージに持っていく実験なので。 *& はできても interior_ptr<T>% はできないので、配列 + オフセットの方が便利なのはその通りです。
引数としてstring型の配列を用いたいのですが・・・ 自分C#しかやったことないので・・・
void foo(cli::array<System::String^> ^bar);
cli::array<System::String^> ^hoge を char* hogehoge[] に変換したいのですが・・・
すまん、コンストラクタが例外安全でなかったので修正した
http://ideone.com/xbcbh cli::array<System::String^> ^hoge = ...; char_pp p(hoge); char** hogehoge = p.get(); ってことなんだが char** は char* xxx[] を引数に取る関数にそのまま渡していい
補足しておくと ・PtrToStringCharsで内部ポインタを取得 ・System::Stringはunicodeなのでwcstombs_sでマルチバイト文字列に変換 ・std::auto_ptr, std::vector, char_ppはRAIIイディオムにより例外安全にするため ・try{}catch(...){throw;}もchar_ppコンストラクタを例外安全にするため 用語はググってくれ もしC++初心者で.NETからよそのライブラリ使いたいとかなら C#からP/Invokeした方が多分楽
そんなコード書かれたら、俺なら普通に書き直しさせるわ 文字列のマーシャリングで標準のマーシャリング以外を使うなよ marshal_context c; for (...) native_str[i] = c.marshal_as<char*>(managed_str[i]);
MFC 使うんだったら、CString に直接放り込めばいいだろうに CString strBuff(strManaged);
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が変化しません...
c++を使い始めたものなんですけど
こっちはちゃんとなるんですけど
includeを使うと
こんな感じになっちゃって・・・(´;ω;`)
だれか解決して下さいませんか?
>>503 正解
あれはとてもためになります
ところで
対処の方法は?
DOSで趣味でプログラム組んでた程度で、APIめんどくせ、MFCうぜえってレベルなんだが 久しぶりにちょっとしたゲームでも作ろうとして VCに無料版があるのか!と飛びつき 無料版でフォームの統合環境まであるんか、今はMFCにかわってCLRなんかと早とちりし ネット漁ればサンプルやら何やらゴロゴロしてるかと思えば… 何じゃこりゃ
CLRってなんだよ。CLIはMicrosoftにも見捨てられかけてるのでね…泣けてくる。 どうせ.NET使うならもうC#で全部やっちまえよって感じか?
CLIは規格の名前、それのMSによる実装がCLR CLRに大量のライブラリ群を加えたやつが.NET Framework CLIに対応する構文を追加したC++だからC++/CLI >どうせ.NET使うならもうC#で全部やっちまえよって感じか? その通り。過去の資産を使わないといけないというような、必要に迫られて仕方なく使う物だよ。
ところでVC++のC++/CLIってMS CLRじゃなくて純粋なCLIで動くの? 一応CLIではアセンブリはネイティブイメージを持てるという決まりだった覚えがあるけど 細かい相互運用のことは決まってなさそう
C++/CLIをMonoで動かそうとするとCRT使えない&/clr:pureだったよね。今は変わったのかな?
>>508 そういう用途だったら、C#おすすめだけどね。
プロトタイピングに最適!
/clr:safe だね。 using namespace System; int main(array<String^>^ args) { Console::WriteLine("Hello World !"); } cl /clr:safe test.cpp mono test.exe でいける。
http://www.atoker.com/blog/2012/04/12/llvm-europe-2012-cli-compiler/ ClangベースにC++/CLIコンパイラ作ったという話。
(1)と(2)とあるけど、どちらもVisual C++の吐く
混在アセンブリとは違う仕組みっぽい感じがする。
VC++のclrで,ref classはなぜref classからしか継承できないんでしょうか? 仕組み的に継承先でgcとか実装されるなら別にvalue classからとかでも継承できていいと思うんですけど……
というか普通のクラスをpublic refで継承したいのおおおお
継承出来ても仕組み上ハンドル変数にしか入れられないから意味なくね
構造体がなんかインターフェイスを実装してる場合には意味ないこともないが CLIを拡張するのに見合った利益があるかどうか考えると当然切り捨てだろうな あくまでC#とVBが主役なんだからC#やVBから使えないクラス作っても意味ない
混合型こそ仕組み的には特にできない理由がなくて比較的大きな利益のあるものだよな CLIやCLRを弄る必要もなく、コンパイラだけで対応できるはず 永遠に将来的に対応予定だが
いや仕組み的に無理だから マネージド領域のポインタはfixedなしに取得してはいけない 実装部分でそれを止める(無いことを保証する)には宣言部分で付加情報が必要 それがrefキーワード ヒープ領域ならポインタを取得するのは問題ない だからrefクラスのメンバにポインタ型なら定義可能 コンストラクタでnewしてCLIデストラクタ(IDisposable)でdeleteすること
例 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
仕組み的に無理って C++/CLI のもともとの目的は混合型を実現することだったんじゃなかったか?
PODなネイティブ構造体をマネージ型に置いたり、マネージハンドルをメンバに持たない マネージ構造体をネイティブ型に置いたりするのは別に問題ないが(ミスを誘発しやすいという懸念はあるが) もっと一般的に混合型を扱えるようにする構想があったからとりあえず全部禁止しといたってことか で結局はC++/CLIそのものが見捨てられて計画倒れになり、理不尽な制限として残ってしまったと
ちょっとした配列をメンバに持ちたいときにmallocしたりgcnewしたりしないといけないのは なんとかならんかったんかなぁ、と思う。
>>525 の
Point* G(R^ r) {
pin_ptr<Point> pinp = &r.p;
return pinp;
}
これってGCの問題というよりはC++でもよくあるミスの一種だよね
ローカル変数のポインタを残すなってのと同類
初心者みたいな質問ですがすみません。
今、マネージコードからネイティブなコードを呼び出す ということがやりたいのですが
例えば、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つのプロジェクト内やりたいのですが・・・・
よろしくお願いします。
include ってそこに書いたのと同じ意味になるんだがそれはわかってる?
>>530 小一時間考え、
#include "native_program.h" の下に #pragma unmanaged を入れたら通りました・・・お騒がせしました
ところで、func()は実際はクラスの中に入ってるのですが、
呼び出し側では、
Classname* classname;
classname->func();
のようにすればOKなのでしょうか。この2行はマネージコードの中に入ってるけど
特にnewとかしなくても上の一行だけでクラスのオブジェクト作られてるのかなと・・・
というか、このように書いたら動いたのでOKなのかなと思ってるのですが。
失礼、#pragma managedです。。。 書き間違いました^^;
オブジェクトは無いだろう。 thisポインタがNULLのまま
オブジェクトはないけど動いている・・・ ということは、実行ファイルを直接読んでるということか・・・ よくわからないし動いてるので気にしないことにします^^; 失礼しましたw
>>531 Classname classname;
classname.func();
ならOK
なんで動いてるか気持ち悪かったのでやっぱりnewとdelete追加しときましたw
>>535 それだとコンパイルする人がエラー出しますね
>>536 やっぱ暗黙的に静的インスタンス?みたいなの作られてて、それのポインタになるんですかね
実体がなかったら動くわけないし。
デバッガでみたらポインタは未定義の値みたいになってましたけど
仮想関数じゃねーんだから、実体があるとかどうとか関係無い。 単に関数呼んでるだけだ、未定義のthisポインタでな。
>>537 >実体がなかったら動くわけないし
ところがCやC++では動く。
速度重視のため、安全確保のための自動チェックなどは行われない。
そしてメンバ変数に代入すると何処とも知れないメモリアドレスを書き換えて
所謂セキュリティホールになったりする。
メモリアクセス違反で強制終了するのはまだ良い方。
>>539 いあいあ、実体というか、どこかに機械語のコードがなかったら動くわけないですよね?
その場所がわからないとうか、管理されてないというかんじなのかな?
OSが管理してて、そのOSによるということなのかなあ
しったかしてるから初心者みたいな勘違いしたままなんだよ
>>540 まず「ヒープ」「スタック」「コードセグメント」あたりの
基礎から勉強すべき
C++/CLIってC++と.NET両方の知識がある人向けだから そうでない人はC#でP/Invokeを使った方がいいと思う。
今更だけど、pragma managed も push pop できたと思うよ。
まあヘッダに入れてるしC++勉強始めて3日くらいの知識でC++/CLIとごっちゃで勉強すると 後で困ると思うがなあ
VisualC++の入門書を買って来たらC++/CLIの本だったのは良い思い出・・・
C++/CLI で暗黙のバッキングストア使うとき、get/setで異なるスコープにすることはできますか? C# であれば public Hoge { get; protected set; } のような感じで。 ちなみに今使っているのはVS2008です。
出来るよ。 ref class Clazz { property int XXX { private: void set(int iA); public: int get(); } };
>>551 ありがとー。
本体を書かなければ自動生成されるんですね。いわゆるWeekシンボルってやつかな。
>>550 × public Hoge { get; protected set; }
○ public int Hoge { get; protected set; }
XmlTextReaderでxmlファイルを読み込むとき,ファイルがあるかないかの判別はどうすればいいですか?
msdnにあるFileNotFoundExceptionを使うのでしょうか? 使い方がいまいちわかりません・・・ 恐縮ですができればサンプルコードを書いていただけませんか? XmlTextReader^ reader = gcnew XmlTextReader( "sample.xml" );
XmlTextReaderのコンストラクタを直接触るのは非推奨 try { XmlReader^ reader = XmlReader.Create( "sample.xml" ); } catch (FileNotFoundException^ ex) { Console::WriteLine("ファイルが見つかりません。"); } C++/CLIは君みたいな人が足を踏み入れるようなもんじゃないし 頑張ったところで特にメリットもない 今すぐC#かネイティブのC++へ移行することを強くお勧めする
C#とごっちゃになってた XmlReader::Createの間違い
>>556-557 ご回答ありがとうございます 助かりました
基礎ができていないのは痛感しております・・・
もしおすすめの参考書があれば教えていただけると幸いです・・・
悪いことは言わん どうしてもC++/CLIを使わないといけないのなら、まずはC#を覚えるのが近道だ C#なら入門者向けの書籍やサイトなどもいくらでもあるし、 C++/CLIの.NETの部分はC#もどきの劣化版にすぎない。
>>559 なるほど・・・
しかし今作っているプログラムを作り直す時間がありませんので
ひと段落してからC#の勉強をしたいと思います・・・
ありがとうございました.
なぁ、実際C++/CLIの利点て具体的にどうなの? C++で作ったライブラリもユニコード使用でないとオーバーヘッドかかるし .NET側にC++クラスのオブジェクトを入れるとポインタ使用になるし。 まぁ、パソコンも進化続けるから、アプリの重さも気にはなくなるだろうけど。
ホスト:アンマネージ、プラグイン:.NETの場合は、C++/CLIなしでやろうとすると COMを経由してCLRをホストしたりとかクソ面倒臭い .NETからC++のクラスを使いたい場合、C++/CLIではなくDllImportを使うとなると いったんC向けのフラットなインターフェイスにラップしてやらないといけなくてクソ面倒臭い どっちにしろC#とアンマネージC++を両方使う場合にのみ役に立つ
質問させて下さい。 visual studio 2005でC++/CLIを用いて開発を行なっています。 ref struct AA { public: int a1; } refクラスの上記のような構造体を定義してそのオブジェクトを2つ作り、 AA a, aa; a = aa; (例なので初期化せずに代入しています) とすると「error C2582; 'operator '=' 関数を 'AA' で使用できません」となってしまいます。 実際にはrefクラスの構造体を引数として渡したかったのですがC2664になってしまいビルドが通りませんでした。 そこで一番単純な構造体の代入コードを記述したところ、上記のようなエラーとなりあました。 いろいろ調べてみると、refクラスはコピーインスタンスとコピー代入演算子をデフォルトで自動生成しない ということが原因かと考えたのですが対策が思いつきません。 refクラスの構造体の代入とコピーの方法をご教授いただければ幸いです。よろしくお願い致します。
で、値をコピーしたいの? 参照だけで良いの? value struct AA じゃ駄目? ^は知ってる?
>>564 レスありがとうございます。
私の勉強不足のため、クラスライブラリ側の宣言はref structで宣言しないとダメだと思い込んでいました。
しかも、クラスライブラリ以外のプロジェクトでも同様の結果になるため、勝手に環境の説明を省いてしまいました。
申し訳ありません。
ご指摘の通り、value structにすることで解決できました。ありがとうございました。
PathCombainのstd::string版ってないですかね?
この本って古本で定価の倍でも買う価値あります?
実践C++/CLI 極めるための基礎と実用テクニック
http://www.amazon.co.jp/dp/4797336277/ 最近、DirectXをWPFから呼び出す必要が出てきて……
でも、VS2012と.NET4.0が出たときに
新しい本がいろいろ出版されるような気もしますよね……
>>567 SlimDXを使うか、読めば足りるんじゃないか。
使いたいDirectXの機能によっても代わるよなぁ
> マイクロソフトから、お客様のアプリケーションがたくさんの人々の目に触れ、 > 試用および購入されるのをサポートする、新しい特典をお知らせいたします。 > MSDN サブスクライバーであるお客様は、1 回のご購入で 12 か月有効な > Windows ストアおよび Windows Phone の開発者アカウントを取得すること > ができます。 AzureはVLで買っても契約期間分使えるのに(厳密にいうと少し違うが)、 これはVL(2or3年)で買ってると悲しいな。
VS2010でフォームアプリの勉強をしています。
unmanagedクラスで別スレッドにて不定期で呼ばれる関数から、
managedなフォームの内容を変更したいと考えています。
下記のようにコーディングしましたが、stackoverflow(InvokeRequiredがずっとtrueのため)
で動きません。。どなたか適切な方法を教えていただけないですか?
1.managedなformメソッドとしてform編集メソッド作成
2.スレッドセーフにするためInvokeでラップ
参考:
http://blogs.yahoo.co.jp/fireis_myblood/25643271.html 3.delegate->Marshal::GetFunctionPointerForDelegate()でポインタ化
4.unmanagedの不定期呼び出され関数に2の関数ポインタを設定
5.実行
Marshal::GetFunctionPointerForDelegate の返り値を CreateThread の第四引数に渡して別スレッドから呼んでみたけど、 別スレッドからの呼び出しでは InvokeRequired は true になって、そこで Invoke した先では false になったよ。
たぶんやりたいのはこうだと思うんだけど、違うかな。 DWORD WINAPI proc(LPVOID param) { typedef void (*fp_t)(void); fp_t fp = reinterpret_cast<fp_t>(param); for(int i = 0; i < 10; ++i) { ::Sleep(1000); fp(); } return 0; } public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); IntPtr fp = Marshal::GetFunctionPointerForDelegate(gcnew MethodInvoker(this, &CppCli575::Form1::addText)); ::CreateThread(NULL, 8192, proc, static_cast<LPVOID>(fp), 0, NULL); } void addText() { if (textBox1->InvokeRequired) { textBox1->Invoke(gcnew MethodInvoker(this, &CppCli575::Form1::addText)); return; } textBox1->Text += "A"; }
>>577 MethodInvoker^はメンバ変数に置いとかないと
日本人は マスコミ電波で動く ロボット人間
日本人は、先進諸国で飛び抜けてマスコミ報道を鵜呑みに
信じやすいことがこの動画で実証されています。
いわばマスコミ報道の「鵜呑度」を国際比較すると、
日本人は、先進国中ダントツに「鵜呑度」が高く70%、
最も低い国民は英国で14%です。
その他の主要欧米諸国(ロシアを含め)は20−35%です。
日本に近い国は、ナイジェリア、中国など、途上国と新興国となります。
別の言い方をすれば、日本人の70%は、
自分の頭で考えず(思考停止)、
テレビ、新聞、週刊誌などのマスコミの情報を鵜呑みにしていることを意味します。
青山は以前からこれを「観客民主主義」と言っています。
観客民主主義は、マスコ ミの情報操作による世論誘導に最も陥りやすく、
独裁にも呼応しやすい特性を持っています。
マスコミ報道「鵜呑度」
日本人70%、英国人14% You Tube
VIDEO http://www.asyura2.com/12/senkyo132/msg/578.html >578 たしかにGCされるとだめですね。フォローどうも。
>> 576-577 ありがとうございます。 実装してみたところ、確かに望みの動作をしました!! なぜ自分のコードが動かないか突き止めるために 教えていただいたコードを変更していますが、別の問題にもつまづきました。。 申し訳ないですがもう少し教えてください。 <当面の問題:うまくコンパイルできない> 関数procを、クラス内のstaticメソッドに変更しようとした(下記)。 #コンパイル時に、未解決のトークン (0A000043) "public: static void (__cdecl* test2ch::Testproc::fp)(void)"とのエラーが発生。 class Testproc { typedef void (*fp_t)(void); static fp_t fp; public: Testproc(LPVOID func) { fp = reinterpret_cast<fp_t>(func); ::CreateThread(NULL, 8192, (LPTHREAD_START_ROUTINE)Testproc::proc1, this, 0, NULL); } DWORD static WINAPI proc1(void) { for (int i = 0; i<10; ++i){ ::Sleep(1000); Testproc::fp(); } return 0; } };
連投すみません。 ちなみに、元の問題の原因究明のために今後確認したいことは (staticメソッドでラッパした)インスタンスメソッドとしてproc1()を定義し、 proc1()内ではstaticではない関数ポインタfpを実行するように変更して スレッドを実行して所望の動作(formが変更できる)かどうかを確認 です。
>>581 C++/CLIじゃなくてただのC++の話だな。
static fp_t fp;
これの実体を定義していないだろ?
>>583 お恥ずかしい限りです・・・
ご指摘ありがとうございました。
581の問題は解決しました。
コンパイルが通りません 教えて下さい ref class Test { bool& Bl; Test(bool& bl) { Bl = bl; } };
>>586 コンパイルが通りました
ありがとうございました
画面周りだけCLI使ってそこから呼び出すのはPUREなC++にしている
最初はそういう使い方してたけど 最近はp/invokeがあるからC#で別段問題ない
>>588 →画面をC#にしたら簡単すぎワロタ→内部もC#にしても速度変わんなかった→もうC#だけでいいや
既存のC++のライブラリがある場合はC#から呼び出しまくると速度ゲロ重
C++/CLIから呼んでもC#から呼んでも速度は変わらんよ C++のライブラリはC#だとラップするのがゲロ面倒だから、その点ではC++/CLIが有利 でも本当に速度を求めるんなら、C++/CLIでもC#でも細かくネイティブコードを呼ばないで 必要なデータをまとめて受け渡しするようにして、 細かいところは全部ネイティブコードで書いてしまうのがいい
>C++/CLIから呼んでもC#から呼んでも速度は変わらんよ
C++ InteropはP/Invokeより高速だよ
http://msdn.microsoft.com/ja-jp/library/ky8kkddw%28VS.80%29.aspx 他のところは同意。まとまった単位でネイティブに切り出さないと高速化の恩恵は薄い。下手するとC#より遅くなる。
変なマーシャリングしないようにすればC#のDllImportでもそんなに遅くはならないよ アプリに即した形でまとめてネイティブコードで処理、を突き詰めると 結局C++(not CLI)とC#でいいんだよなあ
マネージドからアンマネージドの処理を制御するのはいいんだけど アンマネージドからマネージドに通知したい時どうしようか悩む
gcrootで余裕 C#とDllImportだと参照管理がかなり面倒
C++/CXもここでいいの? βでもあったし環境依存みたいだが、VS2012 for Windows8で ターゲットwin32の時に出るコンパイルエラー対策を自分用にメモっとく インクルードディレクトリに追加 ;$(WindowsSDK_IncludePath); ライブラリディレクトリに追加 ;$(WindowsSDK_LibraryPath_X86);
>C++/CXもここでいいの? 全然別ものなので違います
/CXも/CLIと同様に、GUI作るのに使おうとする勘違い君がたくさん出てくるんだろうな このスレに溢れるC++/CLIに対するネガティブな意見はほとんど/CXにも当てはまる
そう? ストア用アプリ開発をC++でやりたいって人に 思い留まらせるような要素は、C++/CXの環境には無いと思うけど
説明するだけ無駄な気はするけど、 WinMDのおかげでDllImportの手間が消えて、呼び出しコストが減って、C++製のネイティブコードを対象にしたリフレクションすら使えるようになった。 これだけ扱いやすくなってくれると高速化のために部分的に利用するってのも十分いける。 C++ AMPとか面白げな物もあるしね。 (C++やC#製のライブラリがJavaScriptからも簡単に呼び出せるので、UIをHTML5とJSで作る人が増えそう) C++を使いこなせるならC#覚えるのは簡単。 C++が使えてもWinRT部分は全部0から覚えなおし GUI作るのに何倍も時間がかかるわりには、同じライブラリ使っているため体感速度に差がない。 それならC#覚えて、重い処理のとこだけC++でやればいい。(HTML5+JSでもいいけど) この辺の事情からC++/CXもC++/CLIと同様にGUIを作るためのものではないと断言する。 これだけ言われてもC++/CXだけでやりたいって言うなら止めないけど、どこまで行っても茨の道だぞ
GUIはともかくDirectX使う場合はC++/CXになりそうだがXNAないし
>>604 うーん、説明されても無駄だったなあ
C++/CXのデメリットの部分が抽象的でピンとこないや
WinMDちゅーても既存のネイティブライブラリをC#アプリにマージしようとしたら
結局ラッパークラス書かなきゃならないわけで
C++/CLI時代なら、ラッパークラスの作業量が多くなり過ぎるくらいなら
インターフェイスの粒度を洗いなおしてもうDllImportにしちまえよってことになるけど
C++/CXはそのまま全部に使うっ選択肢もありだとおもうけどね
>>605 DirectXはCX拡張使わずに普通のC++で使えるからC++/CX関係ない
設定画面などで少しだけOSネイティブのUIを使いたいときだけほんのちょっとCX使うくらいだろ
>>604 考え方が逆だと思う
これまでの.NETでは、C#からDllImportでC++を呼び出すのは簡単でもその逆は難しい
だからそこを補助するのにC++/CLIは有効
WinRTでは、C++からCXを使ってC#やWinJSで書かれたコンポーネントを呼び出す
ということが簡単に行えるから、既存のC++コードを他言語から
呼び出すためのラッパーなんて書かなくていいの
新規に作ったC#やJSのコンポーネントをC++から呼び出せばいい
まぁ、どっちの使い方も出来るんだから好きなようにやりゃいいさ
むしろC++/CXで呼び出せるデスクトップ用GUIライブラリが欲しかった… C++/CLIはcli上にネイティブ用マーシャリングコードの生成だったけど C++/CXはネイティブ上にCOM/WinRT用マーシャリングコードの生成なんんだよね確か つまりObjCのパk(ry
問題はMSが途中で放り投げないのはどれかということだよ
C++資産の活用という目的があるから/CLIも/CXも無くなることはないだろうけど /CXも/CLIみたいにIDEサポートがなおざりになっていく可能性が高いな /CLIも誕生当初は.NET開発の本命とか言われてたんだし
MSって実験的な技術でも最初から気合入れてしっかり使えるものを出してくるから厄介なんだよね 新技術出してすぐ放り投げるのはGoogleのほうがよっぽど酷いけど あっちは一目見て「ああこれダメだわ」とわかるからな
hackとproductの文化的な違いでしょ MSのは、OSSのフリーライダーに仕方なく合わせてきた感がタップリ 過去の因縁からしてMSの製品は使わないといった派閥は今日でも現存する
OSSと共産主義が関連あるのは本当?FSFじゃなくて?
>>617 共産主義の定義による、スターリン以前か以後かどっち?
C++で作られた.LIBなファイルをC++/CLIから呼び出すには何か注意点ありまか? いま、ビルドはできるけどランタイムの初期化?で落ちてしまいます
visual studio でc++ やってるけど #include "stdafx.h" #include "stdio.h" #using <System.Dll> #using <System.Data.Dll> #using <System.Xml.Dll> #include <string> using namespace System; using namespace System::Data; using namespace System::Xml; using namespace System::Collections; using namespace System::Data::SqlClient; int main(void) { String^ str; String^ str200; char* comp[100] ; SqlConnection^ Conn = gcnew SqlConnection("Password=apple;User ID=sa;Initial Catalog=master200;Data Source=.\\sql2031"); Conn->Open(); int t; str = "Select * FROM Customers"; SqlCommand^ sqlCmd = gcnew SqlCommand(str,Conn);// SqlDataReader^ dr= sqlCmd->ExecuteReader (); while( dr->Read() ) { str200=dr["CompanyName"]->ToString(); comp[t] = (char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str200).ToPointer(); こっから 表示ができない。 printf("<TD><input type='text' name='comp' size='30' value='"+comp[t]+"' ></TD>" );
システム ストリング から苦労して char* 変換できたけど どうやってstringf できるか教えてほしい。
あっさりできました。 printfやめたるだけだった。 Console::Write("<TD><input type='text' name='comp' size='30' style='background: #fafad2; font-weight: bold ;' value='"+dr["CompanyName"]+"' ></TD>" ); ストリング変換とかキャラ変換とか一切不要でした。
>>623 なんでそういうこというんですか?
私はあなたが、ガソリンをかぶって、
火をつけて焼身自殺することを望みます。
2ちゃんねる ニュース板+で
焼身自殺した人のニュースみたら、凄い悲しみます。
でも後悔はしないです。
内閣府は24日、「外交に関する世論調査」結果を発表した。
中国に「親しみを感じない」と答えた人の割合は2011年の前回調査比9・2ポイント増の80・6%で、
1975年の調査開始以降で最高となった。
韓国に「親しみを感じない」という人も23・7ポイント増の59%と急増し、過去2番目に高い数字となった。
外務省は「尖閣諸島(沖縄県)や竹島(島根県)をめぐる対立が、中国や韓国に対する国民感情の悪化につながった」と分析している。
調査は9月27日〜10月7日にかけ、全国の成人男女3000人を対象に行い、1838人(61・3%)が回答した。
日中関係が「良好だと思わない」との回答は16・5ポイント増の92・8%、
日韓関係が「良好だと思わない」も42・8ポイント増の78・8%に達し、ともに過去最高となった。
中国との関係では、今年9月の尖閣諸島国有化をきっかけに中国各地で反日デモが相次ぎ、
現地の日系企業が焼き打ちや略奪に遭ったことなどが影響したとみられる。
「韓流ブーム」などを通じ近年は良好だった韓国との関係についても、
今年8月の韓国の李明博(イミョンバク)大統領による竹島上陸が「冷や水」を浴びせた格好だ。
http://www.yomiuri.co.jp/national/news/20121124-OYT1T00811.htm?from=ylist C++/CLIのクラスライブラリのプロジェクトが2つ(AとB)あります。 BはAを使うので、Bのプロジェクトの設定でAを参照するようにしています。 Aのビルドは問題なくできますが、Bをビルドすると LNK2020: 未解決のトークン (06000022) <Aにあるクラスの静的メソッド名> と言われます。 何か他に設定が必要でしょうか。教えてください。
http://msdn.microsoft.com/ja-jp/library/b57tw91b (v=vs.80).aspx
このエラーを解決するには、次のどちらかの操作を実行します。
欠けている関数またはデータを定義します。
欠けている関数またはデータが既に定義されているオブジェクト ファイルあるいはライブラリを取り込みます。
C++でのオブザーバーパターンの実装例を教えていただけますでしょうか 色々検索したのですが見つかりませんでした
C++/CLIならそんなもん要らん。言語に組み込まれている。 イベントを使え。
オブザーバーパターンの実装が分からんとか さすがにC++/CLIを使う資格がないと言わざるを得ない C#かC++からやれ
2012で..netのウィンドウがある普通のアプリが 作れなくなったのだったか?
プロジェクトテンプレートが無くなっただけで、WinFormsの項目テンプレートはある MSとしてはフェードアウトさせたいんだろうな
C++/CLI勉強中なんですけど、なんでpropertyで2回以上も型を書かせるのはなんで? property System::Collections::Generic::IEnumerable<System::String^>^ Kuso { System::Collections::Generic::IEnumerable<System::String^>^ get(); void set(System::Collections::Generic::IEnumerable<System::String^>^ value); } と書くのは気が狂うんですけど。それぞれの型が異なることってあるの?↓でいいじゃん。 property System::Collections::Generic::IEnumerable<System::String^>^ Kuso { auto get(); void set(auto value); } てかこのスレ2ヶ月間も書き込みがないってどういうことなの。あっ…(察し
便利に普通に使う言語じゃねえからなこれ たかが.NETとネイティブコードを橋渡しする非標準拡張のために 必要以上に言語に手を入れたくなかったんだろ
printf("%x", data); すると 出力が ffffff93 や ffffff94 などになるdataという名前の変数に対して演算をして 結果をdata2に格納し、 printf("%x", data2); の出力が必ず ffffff90 になるようにしたい (16進数表示した時の下一桁以外は変えず、下一桁だけを必ず0にしたい)のですが、 dataに対してどのような演算を行えばよいでしょうか。
>636 typedefという便利な機能があってのう…(しかし名前空間が汚染される)
C++、C#どっちもできて、C++でGUIを簡単に作りたいっていうのには向いてるよね SDKがC++でもC#どちらでも使えるし、守備範囲が広い ただその為に変数の型変換とかちょっとめんどくさいこと調べないといけないけど
酷い釣りだ…C++に見えてその実全く違う言語じゃねぇか。
顧客が本当に望んでいたもの: デスクトップ向けC++/CX
>>643 いや両方とも使える
逆に言うと2つの言語を覚えてる気分になるかもしれん
//homepage3.nifty.com/ishidate/vcpp10_g8/vcpp10_g8.html このHPを見て勉強しているんですが 「グローバルに下記を設定しておく。」の範囲ってどこからどこまででしょうか?
>>647 あ、すいませんhtmでした
//homepage3.nifty.com/ishidate/vcpp10_g8/vcpp10_g8.htmです
staticなんだし適当にやってみりゃよかろう WIDTHとHEIGHTはどこでもいいしarray部分はclass Form1に入れたら とりあえず動いたぞ、面白いなこれw
>>649 自分やると動かないんですけど・・・
何で動かないんだ?
うまくいかないのは実行時なのかコンパイル時なのか うまくいかないと判断したのはどこ?
初心者なので…すいません 実行するとエラー100いくつとかはくんですよね 範囲設定間違ってるのか、何が原因なのかわかんないです。。。
100いくつって数かよ もしそうならコンパイル時だろうし 全角スペース入ったままなんだろ 置換で半角に変えとけ
全角→半角やってもダメみたいです… もし成功した方いたらそのプロジェクトファイルうpしていただけませんか? どなたかお願いしますううう
ダメみたいとか、自分の状況を隠し続ける人に言えることは何もない
等高線グラフを表示させたいのですが、 手段が見つかりません。 3D点(x,y,z)の点(データ)×数万個を線で結びつけて、色付けしたものです。 チャートコントロール(mschar)では等高線をサポートしておらず、実現できません。 System::Windows::Forms::DataVisualization::Charting::Chart どなたかご教授くださいませ! [環境] visual c++ 2008 express vs2012へ更新検討中
そういうのは可視化ツール使えよ ParaViewとか
Gnuplotでも使えば一瞬 自分でそういうの書くのは手段が目的化してるバカ
ちょっと教えてください 自分は独学でC/C++,C#と、まぁC系の勉強をして、ソフトも作れるようにもなりました。 で、就職活動してたんですが、年齢のせいで、資格か業務経験が無いとって感じで、どの企業にもスルーされてきました。 で、今、職業訓練学校でJAVA及びAndroidアプリの作製っていうコースにかよってて さすがに、まぁ、昔、独習JAVAって本でさらっとJAVAを勉強してた部分もあったりでJAVA自体は 勉強するというより(現在は、まだAndroid開発の講義じゃなくてJAVAの講義)今の、講師からも言われたんですが 「〜(自分)さんは、もうJAVAの部分は解かってるだろうから、色々と予習していったら良いですよ。」と言われてる状態です。 さて、ここからが本題ですが、JAVAのソースを見てるとnativeっていう修飾子があって文字通りnativeで作られた メソッドがあったんです。で、JAVAのVMもどうやらCで書かれてるようなのがソース見てわかりました。 そしてCLIですが、C++で組んだアンマナージドなクラスライブラリ等をC#で使う時ってなんかしらの修飾子 ってあるんですか?一度実験でアンマネージドなC++のクラス作ってマネージド(CLI)なクラスの中にほりこんだら [そりゃ無理じゃ、ポインタとして宣言しろ!このカスが!]って嘘だけど、まぁ、こんな感じのエラーがでたんです。 C#側でwin32apiを使いったかったらdllのアトリビュート文を書けば良いんですけど クラスはどうしたら良いんでしょうか。 どなたかこうすれば良いという方法があればご教示ください。
文章にイラン部分が多すぎ。人生相談の板は別にあるぞ 質問は的確に
>>663 そやね、確かに質問がまとまってなかったは。
要は、普通にC++でクラスを作ります(例えばTestっていうクラス)。
それをC#内で使おうと思っても、無理になります。
で、その仲介役としてCLIを使うとします。
その時にCLIで作ったマネージドなクラス内でTestクラスのインスタンスを生成するには
どうしたら良いですか。という質問です。
>>664 C++のクラスをCOMコンポーネントにする
これで直接C#内で使えるだろ
gcnew じゃなくて new してポインタを受けるだけじゃうまくいかなかったのか? ちなみにマネージドとアンマネージドの世界の行ったり来たりはオーバーヘッドすごいから 小さなメソッドをちまちま呼び出すような処理はやめておけ。
>>665 あ、そっか、たしかにCOMコンポーネントは呼べるね。
でも、C#で以前(何年前かは忘れた)Excel呼び出して
C#側で、Excel終了さしたのにプロセス見たら
残ってて、こりゃあかんと思ってExcel呼び出すのは
やめたんだけど、今のVSは、そこらへんもちゃんとしょりしてるのかな
俺がもってるVSって2005なんでね
>>667 ぼろいPCならアプリ終了しても暫くプロセス残ってるなんて普通にあると思うが
>>664 C++/CLIのマネージドクラス内でインスタンスを生成して
「フィールドに保持したい」ということでいいのか
フィールドをポインタにしてnewして持てばいい
こんなかんじかな、Disposableにしてるから deleteのタイミングが重要なときはDisposeすればよい ref class M2 { N1 *n; public: M2() { n = new N1; } ~M2() { delete n; } !M2() { delete n; } };
>>667 多少スレ違いだけど、それの解決方法はほぼ確立してるんだ。
結局のところ外部プロセスサーバーが終了する前に
Execl.Appicationを何度も生成からそうなるわけで、
はじめからExecl.Appicationをひとつだけ生成しておくか、
WeakReferenceにExecl.Appicationの参照をもって、
参照が消えてれば生成するというロジックにすれば万事解決する。
連続して使うときはExcelのインスタンスが毎回立ち上がらずに
パフォーマンスがいい。
>>667 似たような経験があるけど、そのときは、単に参照を破棄してもGCされるまでは
オブジェクトが解放されないからCOMサーバーに伝わらんだけだった。
そういうことじゃなくて?
俺も経験ある GCされるまで開放されないんだよねあれ
ReleaseComObjectは現実的な対処法ではないだろう。 ある程度の規模のコードで、例外時も含めて漏れなく書くとなると コード量が膨らみすぎる。
.Net Framework 2.0のUdpClientクラスって、recvfromに該当するものってないのかな? 相手のIPアドレスが知りたいんだけども。 同じポートに複数のスレッドがブロードキャストしてて、片側のパケットだけを対象にしたい のよね。
自己解決した。 ひとまず、EndRecieveの引数にIPEndPoint仕掛けてやればいいっぽ。 そしたらStringで判定できる。
>>679 recvfrom の仕様は分からないけど、送信元のアドレスは UdpClient.Receive
の引数で取れるよ。
非同期なら UdpClient.EndReceive の第2引数。
見当違いだったらごめん。
わかってるから優しくフォローしたように見えるけど。 世の中難しいね!
配列初期化時に値も設定したのですが、gcnew array<int>(3){1,2,3}; って書かないとコンパイラさんにはじかれます。 gcnew array<int>(){1,2,3}; みたいな、配列サイズを指定しない初期化方法は無いでしょうか。
本当だ!!<>のあとに{}を書くっていう発想がなかったです。 ありがとうございました。
C++/CLIで使えるロギングライブラリってどういうのがあるんでしょう? .netで用意されているのか、あるいはlog4cppなんかのC++用の ライブラリを使ったりしているんでしょうか。
なるほど、見落としていました。 log4netは名前を見たことはあったんですが、「C#で使うもの」と 刷り込まれて、すっかり頭から抜けていました。
listBox1->Items->Add("A"); これがOKで std::string a = "A"; listBox1->Items->Add(a.c_str()); これだと'const char *' から 'System::Object ^' に変換できないって出るんだけどどういうこと? 最近CLIさわりはじめたんだけどわからん・・・
リテラルの文字列は文脈によってString^として扱えるってだけ char*やwchar_t*とString^は別物 char*からならgcnew Stringしたりとか
>>679 これ自分も試してるんだがうまくいかん。
EndReceivedの第二引数の中みても"255.255.255.255"で見分けがつかない。
後でコード載せますん。
コードっす(1/2)。"192.168.3.128"からのUDPブロードキャストのみを対象にしたいっす。 -------- #pragma endregion private: System::Void btnUdpRecv_Click(System::Object^ sender, System::EventArgs^ e) { String^ FilterIPAddress = L"255.255.255.255"; // Receive a message and write it to the console. int portID = 3000; IPEndPoint^ ipep = gcnew IPEndPoint(IPAddress::Any, portID); UdpClient^ udpcli = gcnew UdpClient(ipep); UdpState^ udpst = gcnew UdpState(); udpst->e = ipep; udpst->u = udpcli; udpst->u->Connect(FilterIPAddress, portID); this->btnUdpRecv->Enabled = false; Console::WriteLine("listening to RT"); udpcli->BeginReceive(gcnew AsyncCallback(this, &UDP_RECVTEST::Form1::ReceiveCallback), udpst); // Do some work while we wait for a Packet. For this example, // we'll just sleep while (!messageReceived) { System::Threading::Thread::Sleep(100); } this->btnUdpRecv->Enabled = true; }
続きっす(2/2)。 -------- //Call back function for the read packet data System::Void UDP_RECVTEST::Form1::ReceiveCallback(IAsyncResult^ ar) { String^ FilterIPAddress = "192.168.3.128"; UdpState^ state = (UdpState^)ar->AsyncState; UdpClient^ udpcli = state->u; IPEndPoint^ ipep = state->e; EndPoint^ remoteep = udpcli->Client->RemoteEndPoint; int len = udpcli->Client->EndReceive(ar); String^ recvip = ipep->Address->Broadcast->ToString(); if(ipep->Address->Broadcast->ToString() == FilterIPAddress) { array<unsigned char>^ receiveBytes = udpcli->EndReceive(ar, ipep); //Packet received Console::WriteLine("Received packet length {0}", receiveBytes->Length); messageReceived = true; return; } Console::WriteLine("listening to RT"); udpcli->BeginReceive(gcnew AsyncCallback(this, &UDP_RECVTEST::Form1::ReceiveCallback), state); }
以下、簡単に説明。 プロジェクトはWindowsフォームアプリケーションです。フォームにボタンを配置して クリックしたら"btnUdpRecv_Click"がうごくという簡単なもの。 あと、UDPブロードキャスト送信側は、inet_addr("255.255.255.255")で送信しております です。 なにかヒントでもありましたらご教示くださいませ。
EndReceiveの第二引数かいてないのはいろいろ試してそれでもだめだったんで 一回もと(というか、チャレンジする前)に戻したためです。ご了承くだ。
そう!すいませんアホなことしてましたアンド紛らわしい変数名つけてたんで違うほうみてた… お騒がせしますた!
スレッドを立てたいんだけど、 HANDLE ThreadHandle = (HANDLE)_beginthreadex(NULL, 0, ReadThread, NULL, 0, NULL); unsigned __stdcall ReadThread(void *p){} こうすると関数呼び出しには引数リストが無いからメンバーへのポインタを作成するために &Namespace::ReadThreadって感じで指定しろって言われたからそうしたら今度は delegate インスタンスを作成する場合以外に&Namespace::ReadThreadのアドレスを指定できないとか言われて八方塞なんだけどどうしたらええの・・・
_biginthread ってなんで必要なんだ? CreateThread で十分用がたりるのだが? というか cygwin/gcc-3 なんでこれしか選択肢がない
_beginthreadも結局は内部でCreateThreadを呼び出しているのではあるが そのほかにランタイムが使う内部変数の初期化なども行っている よっていきなりCreateThreadを呼び出すと 出所不明のメモリリークに悩まされたりすることになる 逆に言えばMSVCRTを使わないのであればCreateThreadをつかえば良い
テンプレ類は覚えること少なくする目的で簡単にしようという理念からはじまり、 いろいろ隠ぺいすることで逆にめんどくさいものになってるよね
>>703 warning C4441無視してね?
Managed Threadは使わんの?.NETなんだし
array<String^>^ txts = gcnew array<String^>{"りんご", "ごりら", "らっぱ"}; int index = 0; String^ msg = txts[index ++] + txts[index ++] + txts[index ++]; とやった時にmsg = "りんごりんごりんご"になるのですが msg = "りんごごりららっぱ"となるようなインクリメントの方法はないでしょうか
3行にわければ? sehermitage.web.fc2.com/program/c_lang.html > インクリメント演算子++とデクリメント演算子--は,変数の値を変化させるが, > その変数が同じ式の中で再び参照された場合,動作は未定義となり値は保証されない
>>711 情報どうもです!式を分けるしかないですね。
32bitのネイティブのDLLを呼び出す.netのDLLがあります。 それを呼び出す.netのアプリの設定で、共通言語ランタイムサポートを/clr:safeでコンパイルすると、64bitOSで動かなくります。 共通言語ランタイムサポートを/clrにすると動きます。/clr:safeのままで動かすにはどうしたら良いでしょう。
>>713 safeだとanycpu指定で作ったアセンブリとなるので、
64bitのWindowsだと64bitモードで動作する
手元にあるVS2010では適当なコンパイルオプションが見つからないので、
CorFlagsで32bitフラグをONにするとかかな
>>714 corflagsでいけました。ありがとうございます。
MFCアプリを移行しようと/clrでビルドしたところ、LNK4248が大量に発生しました。 原因は使用しているdllで使う構造体の定義本体がなく事前宣言しかないための ようですが、これは無視しても問題ないものでしょうか? 当然、この構造体のメンバにアクセスすることはなく、これまでは問題ありませんでした。 また、この警告の出力を抑制する方法はないでしょうか?環境はVS2008です。
数が少ないなら struct nantoka { }; みたいなのを定義するとか。 あるいは大量にあって全部無視して安全だと分かっているなら link.exe にオプション /ignore:4248 をつけるとか。 (こっちは試したことないので動くかどうかはしらん)
前者の方法でうまくいきました。ありがとうございました。
PropertyGridで説明つけるとき C#は、 [Description("説明領域に書き込めます。")] VBは、 <Description("説明領域に書き込めます。")> _ とあるのですが CLIではどのように記述すればよろしいのでしょうか?
そんなのはMSDN見ろよ C++/CLIは今はまだサンプル表示できる言語に残ってるぜ
サンプル見てもCLIのPropertyGridのDescription見つからなかったのです。 で、解決しました。 Formと同じusing namespace書いたら C#と同じ書式でいけました。
bulletを使いたいのですが 整列データ型はサポートされてないって言われ 通りません。 BT_MANAGED_CODE定義以外何か必要なのでしょうか? 教えてください
Imageクラスって各イメージファイル形式のフォーマット知らんでも勝手に保管してくれるんだっけ? たとえば jpeg の 0xFFD9とか
あー、ごめん。 例えばBITMAP形式のファイルを読み込んでSaveメソッドでjpeg指定するだけで変換できるのかと。
というか、まぁ出来たは出来たんだけどね。 ただ、.Netのバージョンによって挙動が変わるっぽいね。 0xFFFEの部分が無視されちゃったりされなかったり。
visual studio 2012は、新しい項目の追加で継承されたフォームが 出てこないんですか? 継承されたフォームを作成するにはどうすればいいのか教えてください。
for(int i=0;i<Hoge->Split(array<String^>{L"\r\n"},StringSplitOptions::None)->Length;i++){ ... } と array<String^ >^Hoge_Split = Hoge->Split(array<String^>{L"\r\n"},StringSplitOptions::None); for(int i=0;i<Hoge_Split->Length;i++){ ... } と int i=0; for each(String^ Hoge_Line in Hoge->Split(array<String^>{L"\r\n"},StringSplitOptions::None)){ ... i++; } のどれが処理が速いの? 「...」の部分が十分に長く要素の番号を参照することがあるとして
フォームアプリケーションでの質問だけど、 テキストボックス(名前:textBox1とする)を配置すると、 textBox1->Text でString型の文字列がとれるんだけど、これをatoiしたいがためにchar型に変換しようとして、 atoi(textBox1->Text->c_str()); って書くと、「c_strはSystem::Stringのメンバではありません」って表示される。 c_strってメンバじゃないの?
じゃないよ System::Stringとstd::stringは別物
C++/CLIでWPFをやろうとしていますが、XamlReader::Load()で自作クラスのインスタンス化に失敗します。 フレームワークに含まれるSystem.Windows.Applicationなら<Application>でのインスタンス化に成功するが、 その派生クラスMyApp.Appをインスタンス化しようとして<Application x:Class="MyApp.App" >としても、 クラス名を間違えたときと同じように下のような例外が出てしまいます。。 指定されたクラス名 'MyApp.App' は、実際のルート インスタンス型 'System.Windows.Application' と一致しません。 クラスを見つけられていないんだと思いますが、これはどこかで設定する必要があるんでしょうか? プロジェクトの設定は「空のCLRプロジェクト」のサブシステムをWINDOWSにして、WPFに必要な PresentationCore.dllなどの参照を追加した程度です。
Applicationを継承しろ っていうか素直にC#を併用しろ時間の無駄だ
C#でデザイナ使ったときはXamlってコンパイル時に処理されるからなあ clr-namespaceとか指定してみたら
<my:App x:Class="MyApp.App" xmlns:my="clr-namespace:MyApp">としてみると 不明な型 '{clr-namespace:MyApp}App' を作成できません。 というエラーになりますね。やっぱり何か認識できていないのかな。
ApplicationのXAMLいらなくね? 普通にコードからgcnew AppしてRunしてMainWIndowすればいいじゃん アプリケーションリソース使うならリソースディクショナリをLoadXamlすればいいし デザイナがないのにわざわざデザイナ向けの面倒な方法をとる意味がわからん
App.xamlに限れば省略する手もあるでしょうが、現象としてはMainWindow.xamlも同じなので。 クラスをインスタンス化するという意味においてはApp.xamlもMainWindow.xamlも違いは ありませんので、例としてApp.xamlを挙げたに過ぎません。
>>733 やりたいなら、Convert::ToInt32(textBo1x->Text)
だな
C#のfixedとC++/CLIのpin_ptrって同じものですか? C#で配列をfixedして処理するより,C++/CLIにマネージ配列で渡した後,C++/CLI内でpin_ptrして処理する方が速いのでしょうか? 初歩的な質問で申し訳ないです.
ネイティブコードに渡さないときはinterior_ptrで書くんじゃない。 パフォーマンスは大差ないかと…。
そもそも普通にマネージコードで処理するんならC#で普通にインデックス使って回せば最適化されるから十分速い ヘタにポインタ使った方が遅くなることもある
パフォーマンス的には対して変わらない,下手な書き方をすればかえって遅くなるということでしょうか? やりたかったのは,C#からBitmapとint配列を渡して,C++/CLI内でヒストグラムを作るとかそんなところです. C#側からは, MakeBrightnessHistogram(Bitmap^ bmp, array<int>^ histogram) を呼び出して,この関数の内部でFormat32bppRgbのBitmapDataを取得し,histogramをpin_ptrで固定した後, MakeBrightnessHistogram_Unmanaged(int* data, int size, int* p_histogram) を呼び出すというような形になっています.(dataはBitmapData->Scan0をint*にキャストしたもの,sizeはbmpの画素数) ちなみに,MakeBrightnessHistogram_Unmanaged内で,RGBの値をBrightnessに変換する変換テーブル(ネイティブ配列)にアクセスしています. 画像データやヒストグラム,変換テーブルといった配列にアクセスする命令が多いので,C++/CLIを使えば速くなるのかと思ってプログラムしてみたのですが, こういった処理は,わざわざC++/CLIを使わなくても,C#で高速にできるものなのでしょうか? 最初から素直にこれを質問すれば良かったですね...
そういうコード書くならCかC++でDLL作って それを呼び出すようにした方が手っ取り早い気がするのよ
C#で書いて問題になるほど遅かったら移植すればいいでしょ 実際そんなに変わらないけどな パフォーマンスの心配は9割無駄だからくだらないこと気にしてないでまずは動かせ 先入観でパフォーマンスを考えるほど無意味なことはない
とりあえずC#で書いてみて,処理速度がDLLを呼び出す方法と対して変わらないようであれば, DLL使わずにC#だけで書くようにしたいと思います. ありがとうございました.
BitmapDataと言ってるからLockBitsは使ってるんでしょ
>748 アルゴリズムをunmanagedで書くなら、たしかにSSE2 intrinsicとか使えば圧倒的なスピードが出る。 でも、それならP/Invokeでいいのでは感がある。
byte[,] bmp = new byte[640,480]; とかやってたりしてw
>>756 それ自体別に何もおかしくないぞ
必要ならポインタでアクセスすることもできる
>>757 C#が遅いとか言ってる奴いるけど、C#で多次元配列をこう書くと遅くなるんよ
ジャグ配列を使うか一次元配列で処理すれば、C++とほぼ同じ速度で処理出来るが
だからポインタでアクセスできると言ってるでしょ ポインタ使えば多次元配列でも1次元配列をforループで回して最適化が効いた時と同程度には速くなるよ
あれ?遅いのはジャグ配列じゃなかったか? 最近別言語の案件やってるんで忘れてしまったわ
bmp[y][x]をx方向に処理する場合は1次元配列の連続アクセスと同じなので速い y方向だと無茶苦茶効率悪いから多次元配列のほうが有利
bmp[x + y * bmp.width] で、ええやん
スマホで眺めるのによいライブラリリファレンスサイト教えてください
ある外部staticライブラリをつかうプロジェクトをVS2008で作ったんですが それをデバッグリンクすると実行時にランタイムでヒープが壊れてるとか アサートだします。 出すところは外部ライブラリで static std::map<>; してグローバルにmapを作ってるところです。 clrなしのプロジェクトを作ってやってみると問題ないんですがなにが悪いんでしょう? ランタイムライブラリはどちらも/MDdで外部ライブラリと同じです。
OnPaintBackgroundさせないようにするため Panel継承したMyPanelを作り、 今までgcnew Panelされてた部分をMyPanelに置き換えたら、 デザイン編集する画面がエラーになりました。 継承したコントロールをデザインで使う方法か Panelコントロールの再描画を継承しないですむ方法ありますか?
System::String^はそうだな ネイティブ側は好きなのにしる
VC6以来のWinアプリの仕事何だけど 最近は.net使えばグラフ表示とか簡単にできるようになったの? それともGDI使うやり方健在?
市販のかexcel使ったほうが早いという状況は変わらん
エクセル最強すぎる。 C++でエクセル出力したい。 CSV無しで
オシロの画面みたいなのを1秒あたり10フレームくらい表示させたいのですが,,,
C#でも余裕だな 3日もあればそれなりの物作れるし
今のPCなら10fpsは全くもって問題無い 俺は初めて自力描画したが、25ms間隔でUSB送信+描画が全く問題無かった
C++プロジェクトとC#プロジェクトからなるソリューションを 作る場合は、DllImport を使うのが正統的なやり方ですか?
C++/CLIを使うのも別に不当ではないぞ 好きにしろ
でもさ、C++/CLIって今はWindowsフォームアプリ作れなくなったというか、非推奨でしょ? ヒッジョーに残念なんだけど、俺はクソなC++Builder使ってる
>>782 ,783,784
最近C++始めました。今まで作ったC#の自作ライブラリをC++化しようとしています。
CLRクラスプロジェクトでクラスライブラリを作ってC#アプリから使う場合は、普通に
参照設定して使えましたが、でもそれだと、クラスライブラリの中身がReflectorなどで
見えてしまうので、それで/clr無しでビルドしてDllImportの方法でC#から使えたのですが、
これが正しいやり方かどうか知りたかったのです。要するに、逆コンパイルできない
(あるいは難しい)クラスライブラリを作りたいのですが。
>>786 それも考えたのですが、C#のDLLを難読化するくらいなら、C++でDLL
作るほうが手間がかからないかなと思ったのですが。
皆さん、こういう用途には、VS2013付属の難読化ソフトで十分ですか?
ILMergeはC++/CLIでも使えますか?試したら出来ませんでした。
mixed moeだとだめかもしれんね。/clr:safeや/clr:pureは試した?
> clr:safeや/clr:pure これ使うならC++/CLI使う理由が消えないか? 難読化がC++/CLI使う目的ならなんか違う気がする 業務か趣味かでも違うし
VS2013に難読化のソフト付属するようになったのか
わざわざネイティブコードがちょろっとついてたら、まっさきにそこ覗くけどね まあしっかり考えて。
確かに、覗いてみたくなるな Dependency Walkerに放り込むだけでもそれなりに見えてくるしな
確かにすげー怪しいもんなw むしろ、木を隠すなら森の中じゃないかな。
ILが解析しやすいのはディスコンパイルできることよりも、 型名やメソッド名などのメタ情報がそのまま残ってることだから、 その辺改善したほうがましだな。 簡単な難読化ツールのやってることもその程度だし
>>784 俺は顧客の強い要望でVS2013 expressのVC++でWindows formアプリを作ってる。
非推奨だけど、作ろうと思えば一応作れるのね。
C++でのデザイナ機能も一応残してるんだよね っていうか、Expressでも出来るんだ
ATL/MFCもexpressでやらせてくれたらいいのに あったらあったでそれなりに便利
ATL/MFC無しでもCStringくらい標準にしてくれるといいのにね System::Stringからの変換がスマートにできるのに
ATL/MFCまで入れちゃったら有償版と変わらないのでは?
ウィザードやリソースエディタなんかがないとまともに開発には使えないだろうけど、 MFCのコードをビルドだけできるようヘッダとライブラリを公開して欲しいとは思う。
C++/CLIとC#を相互運用するとき、IDisposableの扱いについて参考になるWebページがあれば教えてください。
初歩的な質問ですみません。 ^ がついた関数と ^ がついていない関数の間でやりとりをしたいのですが、 やりかたが分かりません 例えば時間を再設定するときに、 DateTime^ dth = gcnew DateTime(2014, 3, 20, 0, 0) と DateTime dt = DateTime(2014, 3, 20, 0, 10) を作ったとして、 dth = dth->AddSeconds(10) とかではなく、 dth = dt.(なにかの変換演算子) で時間を再設定してみたいのですが、 なにか方法はありませんか?
dth = dt; dth = %dt; // 丁寧に書いた場合
C++/CLIでは値型とクラスの場合で書き方が変わったりするから要注意だな
C++/CLIで作っているフォームの表示が気づいたらXP仕様になってしまいました 過去につくった物はWin8仕様の表示になっているのですがどこの設定で変更できるのでしょうか 環境はWindows8.1でVS2012です
>> 808-809 ありがとうございます。さっそく参考にしていろいろ調べてみますv
807です。質問の時に代入する方向が逆でしたが、もらったヒントで 無事解決できました m(_ _)m dth = %dt; // DateTime^ = DateTime dt = static_cast<DateTime>(dth); // DateTime = DateTime^
2段目のはこれでいけるな。 dt = *dth -> が *. なのもCの文法と同じ。 dth->AddSencond(...) (*dth).AddSencond(...)
>>813 一文字で決まるおまじない教えてくれてありがとうですv
質問失礼します クラスaの配列をメンバ変数に持つクラスbを作りたいのですが、クラスaの配列の初期化がうまく行きません。(コンパイル自体はできます) これは初期化の方法が間違っているのでしょうか? それともそのような設計(クラス配列を持つクラス)自体がよろしく無いものなんでしょうか? ref class a { int x; public: a(int num){x = num;} }; ref class b { array<a^>^ array_a; public: b(){ array_a = gcnew array<a^>(10); for (int i = 0; i < array_a->Length; i++) { array_a[i] = gcnew a(i); } } };
問題なさそうだけど どう「うまく行きません」なの?
実体がない(?)と言いますか、array_aに何かしようとすると、その関数のそれ以降の処理をすっ飛ばすようになります。 例えばクラスaにint GetX(){return x;}、 クラスbにint GetArrayA(int num){return array[num]->GetX();}みたいな関数を追加して、 ウィンドウズFormの方でLabelを一つ用意します。 private: System::Void MyForm_Load(System::Object^ sender, System::EventArgs^ e) { b^ test; test->GetArrayA(0); Label1->Text = "だいじょうぶ"; } これだと、Label1->Textは「だいじょうぶ」に変わらずLabel1のままです。 しかし >test->GetArrayA(0); の部分をコメントアウトにするとLabel1->Textは「だいじょうぶ」になります。
>>818 817もコンパイルは通ります
あと、今試してみたんですが出来上がったexeファイルを起動してみると
「アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。(中略)
オブジェクト参照がオブジェクトインスタンスに設定されていません」
と出ますね……
こちらもまたtest->GetArrayA(0);の部分をコメントアウトすると問題なく起動します
>>820 あっ……「だいじょうぶ」になりました。
ありがとうございました!
デバッガ使えない環境なのかな、、、 例外起きた時は出力ウィンドウに出るぜ
c#のdynamic型に相当するものを c++/cliで何と書けば良いですか?
c++/cli勉強したいと思っています。 >>array<a^>^ array_a; の<a^>^ってどいういう意味ですか? 顔文字に見えます。ググりたいのですが^>^でググっても ヒットしません。キーワードを教えてけろ。
>>826 ありがとうございます。さっそくググってみます。
ジェネリックメソッドの継承がうまく行きません。 generic<typename T> ref struct B; ref struct A abstract { generic<typename U> virtual A ^f(B<U> ^u) = 0; }; //C4570 明示的に抽象として宣言せずに抽象関数を含んでいます generic<typename T> ref struct B : A { //C4490 オーバーライド指定子が不適切 generic<typename U> virtual A ^f(B<U> ^u) override { return u; } }; 同じ戻り値と引数でも、同じ関数だと認識されないようなのですが、どのようにすれば良いですか?
C#でdelegateに設定されたメソッドを調べるのにGetInvocationListを参照していたのですが、
C++/CLIで同じようなことをするとコンパイルエラーが発生してしまいます。
どのようにコーディングすればよいでしょうか?
// C#
http://ideone.com/O4j7TX // C++/CLI
http://ideone.com/Lazyxs ※実際は23行目のauto mcd = (MulticastDelegate^)hoge->Piyo;で
error C3918: 使用するには、'Delegate::Hoge::Piyo' がデータ メンバーでなければなりません
といったエラーが発生してしまいます。
>>833 あーeventキーワード取っ払ったら通りました。ありがとうございます。
そこでコンパイルエラーにしてくれたらいいのに…。
event自体は正当で使う側が問題なのに、eventの方でコンパイルエラー言われても
すいません
>>832 です。
禿しく勘違いしてました。C#のeventはシンタックスシュガーなんですね。
event EventHandler^ Piyo
{
void add(EventHandler^ value) { mPiyo += value; }
void remove(EventHandler^ value) { mPiyo -= value; }
void raise(Object^ sender, EventArgs^ e) { mPiyo(sender, e); }
}
EventHandler^ mPiyo;
などとしたら上手くいきました。
c++/cli初めて作成しています。 c++プロジェクトでライブラリを作成して void func1(const char *p){ cout << p << endl; } を定義して、 c++/cliプロジェクトでこの関数を呼び出すと、 func1("Hello World"); //呼び出し成功 func1("Hello" + "World"); //型 "System::String ^" の引数は型 "const char *" のパラメーターと互換性がありません となったので、エラー解決のために少しググって、よくわからないまま char* pStr = (char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi("Hello" + "World").ToPointer(); のようにして、 func1(pStr); //呼び出し成功 しました。 この場合、 func1("Hello" + "World"); を実行可能に出来るようにc++ライブラリ側で、この引数を受けられるfunc1関数を定義することは可能でしょうか?
>>839 そうですか無理ですか。
出来れば、出来ない理由を教えてください。
System::String^はネイティブでは直接扱えないから
c#で書かれたdllを呼び出すc++/cliのラッパー static libを作り、それを呼び出すc++のコードを 書けば、c++でc#のdllを呼び出す事が出来ますか?
出来るよ。リンク時に/MDオプションを使う必要はあったと思うけど。
>>844 コメントありがとうございます。
c#からc++を呼び出す例はググるとたくさんあるの
ですが、c++からc#を呼び出す良い例、どこかに
ないでしょうか?
std::regexで"["や"]"などの文字を扱うにはどう書けばいいですか? たとえばテキスト中に"[43]"などの[]で囲まれた数字があるかどうか知りたいのですが。
こんどCLI+API+STLで久々に開発するぜ まともにWindowsアプリ作るの15年ぶりだぜ
WebBrowser::ActiveXInstanceのようなCOMポインターをObject^で返したいんですが どう書いたらいいんでしょうか Object^ get() { IUnknown* pU; //これを返したい ... } C#だと全部属性でやってて生ポインタをどう処理するかの参考にならないです。
それを返した先でどうするのさ 例えばIntPtrを返しても一応Object^にはなるけど多分そういう事じゃないよね?
Object^o=Marshal::GetTypedObjectForIUnknown(IntPtr(pU),Object::typeid); とりあえずこうしました addref,releaseが同じにならないといやだけど
C++/CLI超楽しい .Net、WinAPI、STL、Boost混在できて使いたい放題だし 何でみんな毛嫌いするの?
最初から別言語だと思っとけばいいじゃん。 俺もC++/CLIは面白いと思うが、先がなさそうなのが残念だな。 WPFが使えるようになったらMFCのアプリを移行したいと思っていたんだが。
やりたい放題というのは1人でやってるだけなら楽しいが 足を引っ張る仲間がいると地獄巡り満腹コースになる
マネージ関数の中でlambda使えないとか、最近は混ざる利点みたいなものが少なく…。
genericとtemplate混ぜたら楽しいと思ってたけど、 あんまり混ざらないようにできてる・・
variadic template使って型パラメータの数が違うgeneric classを使えるかと思ったら、なんかエラーになるしね。
genericクラスの中にtemplateは作れないし
その逆もできない。
できるのは、genericクラスをtemplateで
継承するくらい。
>>861 variadic genericあったらいいなぁ
C++/CLIに直接関わる質問ではないのですが 適切なスレが見当たらなかったのでここで質問させてください。 ネイティブのnative.dllをマネージのmanage.dllが参照しているとき native.dllにパスが通っていない状態でmanage.dllを使用すると FileNotFoundExceptionが発生してしまいますが、 その例外の値からはnative.dllが見つからないことが原因であることを 判断することができません。 そこでmanage.dllが参照しているdllの一覧のようなものを取得したいのですが そのようなAPIは用意されていますでしょうか? とりあえずdumpbin.exe /dependentsで出力される結果を用いる実装にしてみたのですが やはり外部の実行ファイルに頼るのは微妙ですし、何より処理が重いです。 Win32APIでも構いませんので何か方法がありましたらご教示ください。
開発フェーズなら Dependency Walkerというツールがある
FileNotFoundが発生したら LoadLibrary("native.dll"); GetLastError()してみるってのはどうだろう?
>>863 です。亀ですいませんが解決しました。
APIとしてはImageHelpライブラリ辺りが使えそうだったのですが途中で詰まったので断念。
結局ファイルを直接読んでIMAGE_DOS_HEADER構造体からたどって
インポートデータを解析することで対応できました。
質問です。 MyCapsuleというクラスを作り、GetValue(参照渡しの引数)という仮想関数を 定義しておいて、このクラスから派生したクラスにおいてGetValueの実装を するにあたり、与えられた引数がある特定の型に合致する場合にはその 引数に値を代入する、という動作を実現したいです。 例えばMyCapsuleIntという派生クラスでは、与えられた引数がint型だった 場合に、その引数に(何かしらメンバ変数などの)値を代入する、というもの です。 こういう場合アンマネージドだと引数としてvoid*を使った実装になるかと 思うんですが、マネージドだとかわりにObject^%とかを使うのでしょうか? ハンドルと追跡参照について未だによくわかっていないので、どうするのが 一般的な作法なのか見当がつきません。 よろしくお願いします。
アンマネージからマネージの関数を呼んで マネージドの中で作ったString^からchar*でアンマネージドに戻したいんです。 調べたところ (char*)Marshal::StringToHGlobalAnsi("").ToPointer()ってのがあるのはわかったのです。 けど、これで戻してもアンマネージドからMarshal::FreeHGlobalが呼べないのでだめです。 一度StringToHGlobalAnsiで得たchar*を別のcharのバッファにコピーしてから戻す方法になるのでしょうか。
Marshal::StringToHGlobal...で確保したのはLocalFreeすればいいけど 普通は呼び出し元がバッファ用意するなり、std::stringとかで返すなりするもんじゃね?
なるほどLocalFreeで解放できるんですね。 >普通は呼び出し元がバッファ用意するなり 固定長になるからどうしようかなとおもって。 >std::string StringToHGlobalAnsiで領域を確保したのに stringでまた確保されるのがあれかなとか。 気にしすぎといわれればそうです・・・。
C#みたいにCodeProviderで動的な文字列をコンパイルして 実行したいんですが、もしかしたらC++/CLIにはCodeProviderが ないですか?
すいません、抜けてました。 CodeDomProviderを継承したCodeProviderです
まあ混合型使えないからそれならC#でいいじゃんってことになるよね
C++のDLLをC#で使いたいのですがC++/CLIで吸収したほうがいいのかな? C++の構造体のポインタとかあってわけわからん
>>875 の件ですがC#でなんとかがんばることにしました
お騒がせしました
C++/cli からC++のプロジェクトに定義している関数を呼び出したいんです。 C++プロジェクトのlibファイルを参照し、includeファイルをC++/cli側に 持ってきて#include すると、物凄い数のエラーがでます。 (C2011:C2079:C2504:C3395:C3699) [1] C++/cliで参照できるよう、ビルドエラーを直すしかない [2] 別の方法でC++の関数をビルドエラー無しに参照できる。 ちなみに、C++の関数を参照しないで自作・・・という回答は無しでお願いします。
物凄い数のエラーじゃなくてエラーの内容をチェックしろよ。 出力ログのエラーの行をダブルクリックすると問題の箇所に飛ぶから 何で再定義だとか定義がないと言われてるか考えろ。 何でその程度のレベルでC++/CLIとかやってんの。
1.C++から呼び出す 2.C#に移植する C++/CLIでなきゃいけない理由なんてあるん?
すみません、初心者なりにエラーの原因を調べてきました。 a.h class A : public B {} b.h class B {} この時に Class B で再定義のエラーが発生していました。 a.h が先にincludeされているのが問題で、b.h を先にinclude するよう ソース修正すれば良い・・・・・ということでしょうか??
各ヘッダの先頭に#pragma onceと書く a.hでb.hのクラスを使っているなら a.h内でb.hをinludeしろ cpp側でincludeの順を気にしなきゃならないのは糞
質問です。 任意の型のマネージド配列(cli::array)を、任意の個数、引数として受け取って それらの配列としての長さの最小値を返す関数を書きたいと思っています。 イメージとしては、 array<String^> arrStr = gcnew array<String^>(6); array<double> arrDob = gcnew array<double>(8); array<int> arrInt = gcnew array<int>(3); に対して、 Function(arrStr, arrDob) = 6 Function(arrStr, arrDob, arrInt) = 3 となるような関数Functionを書きたいと思っています。 しかし、この場合の引数リストの書き方がよくわかりません。 単純に可変長の引数リストだとFunction(... array<Object^>^ args)みたいな 書き方になると思うんですが、これをマネージド配列の配列だからといって 真似てFunction(... array<array<Object^>^>^ arrays)みたいな書き方をしても、 呼び出し側(例えばFunction(arrStr, arrDob)とか)で引数リストが一致しない旨 怒られます。このような場合の適切な引数リストの書き方ってありますか? あるいは回避策として、引数はFunction(... array<Object^>^ args)としておき この関数の中でfor each (Object^ arg in args) { argが配列かどうか }という コードもありえますが、肝心の、「argが配列かどうか」チェックするコードが わかりません。 上記いずれか一方で構いませんので、解決策をご教授いただけないでしょうか?
... System::Array^ args arg->GetLength ... System::Collections::IList^ args arg->Count
>>884 試してみましたが、いずれの場合もコンパイルエラーC3132が発生します。 そもそもargの型を何に指定すべきなのか、というのがよくわかっていません。 例えば int Function(... array<Object^>^ args) { int MinLength = -1; for each(array<Object^>^ arg in args) { if ( (MinLength < 0) || (arg->Length < MinLength) ) { MinLength = arg->Length; } } return MinLength; } みたいなコードだと、Function(arrStr, arrInt)を実行したとき、それら引数を System.Object[]にキャストできない旨を怒られます。 ごめんちょっとぼけてた ... array<System::Array^>^ args for each (auto arg in args) { int len = arg->GetLength(0); ... array<System::Collections::IList^>^ args for each (auto arg in args) { int len = arg->Count;
>>886 うまくいきました! 動作版のコードは以下の通りです。 int Function(... array<System::Array^>^ args) { int MinLength = -1; for each(auto arg in args) { if ( (MinLength < 0) || (arg->Length < MinLength) ) { MinLength = arg->Length; } } return MinLength; } ありがとうございました。 String^ selectedEmployee = (String^)(ComboBox1->SelectedItem); ^ってどういう意味?
既存の native C++ のプログラムからC#で作ったdllを呼び出す必要が出てきたんで /clrを使おうと思うんだが、.NETを使う部分以外のソースを全部 #pragma unmanaged しておけば既存のnativeのプログラムと変わらないと考えていいのかな? スタートアップに時間がかかったりするかもしれないけど。 それ以外になにか、純粋なnativeアプリと比べてのデメリットとかあるだろうか?
拡張する度にpragma追加するのが面倒くさいからCOM exportのがいいよ
COMはregistryやGACに登録しないとならないのが。それがなければ使いたいんだけど。 pragamはまぁ、stdafx.hに仕込んどけばいいだけなんで。 で、試してみて一応ビルドは通って、DependencyWalkerで見てもほとんど同じに見えたけど、 起動時に例外が出てうまく立ち上がらなかった。 どちらにしても、ビルドに時間がかかるんで普通にwrapperだけC++/CLIで作った方が楽そう。
ほー、Interopでも登録なしで使えたのか。知らんかった。
http://peace.2ch.net/test/read.cgi/tech/1420379468/279 から誘導されてきました。
質問です。
実行時にフォームをイベントごとコピーしたいのですが、
元のイベント関数のハンドラが取れず、上手く行きません。
解決策があれば教えてください。
やりたいこと:
チェックボックス等のフォームをデザイナで指定し、イベント関数もデザイナで指定します。
プログラムでこのチェックボックス等を10個ほどにコピーし、並べます。
このときにプロパティ等はコピーできますが、イベント関数がコピーできません。
理由:
位置決めが楽なので、デザイナ側で頭のFormは指定したいのです。
そして管理上分かりやすいので、イベントもそこに書いて、これをコピーしようとしています。
ところがEventInfo::GetRaiseMethodではnullが返ってきてしまいます。
ハンドラさえ取れれば以下と組み合わせて上手く行くと思うのですが。
https://msdn.microsoft.com/ja-jp/library/ms228976%28v=vs.110%29.aspx 状況:
なおC#だと以下で上手く行きます。
http://stackoverflow.com/questions/6055038/how-to-clone-control-event-handlers-at-run-time ただしC++だと、GetField("events")がnullptrを返してくるので駄目です。
キーワードは色々試してみましたが、当たりませんでした。
前から困っている点で、とらいえずいちいち書いて対応していますが、
見ていて汚いので書き直したいと思っています。
気長に待っていますので、どなたか対策をご存じの方はレスよろしくお願いします。
auto f = (Component::typeid)->GetField("events", BindingFlags::NonPublic | BindingFlags::Instance); auto v = f->GetValue(checkBox1); f->SetValue(checkBox2, v); でふるまいが同一になるけど。
>>898 お早い回答ありがとうございます。
こちらで確認した結果、確かに動きました。
(Component::typeid) のところを私は Component::GetType() にしていたのが敗因のようです。
見よう見まねでやっているため、実はここら辺のところがいまいち分かっていません。
お手数をおかけ致しました。また、ありがとうございました。
Component::GetType() は Form の中でなら GetType() と同じ。 C++で親クラスのメソッド呼ぶときの文法よ。
>>900 了解です。ありがとうございます。
FormがComponentを継承しているのを関知していませんでした。
>>898 これ、少なくとも numericUpDown の ValueChanged イベントはコピーできないことが分かりました。
その他は不明です。
元々このやり方はどのドキュメントにも書いていないらしいので、文句は言えないのですが、
どなたか解決策をご存じであれば教えてください。
なお、Button の Click イベントについては、また別の解を見つけました。
似たようなものですが、keyが必要なようです。
http://stackoverflow.com/questions/293007/is-it-possible-to-steal-an-event-handler-from-one-control-and-give-it-to-anoth ただ、Button Click 自体はこちらで試す限り、
>>898 でコピーできています。
マネージクラスのポインタを取得(pin_ptr)し、ネイティブクラスのポインタにキャストする方法を探しています。 class NativeClass { int Hoge; }; [StructLayout(LayoutKind::Sequential)] public ref class ManagedClass { private: int mHoge; public: property Int32 Hoge { Int32 get() { return this->mHoge; } } }; mHogeがinternalの場合は下記でできますが、privateの場合はどう書けば良いのでしょうか? ManagedClass^ managedClass = gcnew ManagedClass(); pin_ptr<int> pManagedClass = &managedClass->mHoge; NativeClass* pNativeClass = (NativeClass*)pManagedClass;
property const Int32% Hoge { const Int32% get() { return this->mHoge; } } にすれば、&managedClass->Hoge が interior_ptr<const int> になるから後は適当にキャストすればいいんでは。
>>904 返信ありがとうございます。
トラッキング参照のプロパティはC#側で扱えなくなってしまうので避けたいです。
フィールドを参照しないと無理みたいなので、mHogeを公開するようにしようと思います。
ありがとうございました。
知ってるかもだけど、ManagedClass が value class, value struct なら pin_ptr<ManagedClass> を reinterpret_cast<NativeClass *> するのは安全だったはず…
MessageBoxを親の中央に表示する簡単な方法はないですか? 自分でフォームを作ってしまえばいいんでしょうか? 最近までVC++6.0でMFCしか触ったことない自宅へぼプログラマです
フックでメッセージボックスのハンドルを取得して移動するだけ
うちのPCだと4.5.2が入らないんだけども
>>910 そうそう、起動時なんか構成に失敗しましたとかでて毎回復帰がかかっている
休日プログラマです。 環境:Visual Studio 2012 express SQLサーバ:SQL Server 2012 express ODBCドライバを用いて、フォームから検索ワードを取得し、 C++/CLIでのプリペアドステートメントを発行して結果を取得したいのですが、 それを用いたlikeなど部分検索SQLの結果取得でハマったまま先に進めません。 SQLCHAR search[255]; std string sql = "select hoge, strhoge from hogetbl where strhoge like \%?\%"; SQLPrepare(hstmt, (SQLTCHAR *) sql.c_str(), ,SQL_NTS); SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,sizeof(search),0,search,NULL); SQLExecute(... のように書いているのですが、プログラム上では何をやってもSQL_NO_DATAが返ります あたりまえですがSQLそのものはServerのクエリで確認したところ通っています //?の所を'(任意文字列)'にした結果 また、SQL構文をLIKEの代わりにSQLのCHARINDEXを用い項目を増やして使ってみたのですが、同じようにダメでした。 // case when charindex(?,strhoge) > 0 then 1 else 0 end as searchflg .... // where searchflg = 1 のように ここには書き戻しできないのですが、escape句も試用したことがありますが、無理でした。 で、このLIKE以外は問題なく動きます。 また、他の機能はほとんどODBCで書いちゃったのでADOはやりたくないです。 何かいい方法ありませんでしょうか。よろしくお願いします。
普通 '%' + ? + '%' とか書くんじゃないの。
ああ、言い忘れていてすみません。 それもやりましたが、ダメでした
コマンドには like ? と書いて、パラメータに%を指定するのはどう?
うーん、それもやってみます。 あと、他の方はこうした事でハマったりは特にありませんでしたでしょうか。 書いてるのが一人でやってるのもあって、本当にプリペアドでの部分検索が可能かどうかが少し不安です もちろん、突き詰めればなんでも可能なのでしょうけれども……
SQLTCHAR* 型に std::string のポインタ渡してるのは、問題ないの?
912です。
>>917 さんの意見も含め、別の観点からもみてみたところ
・・・非常にお恥ずかしいオチになったのですが、解決しました。
問題はコードではなく、BindParameter時のCHAR検索する箇所(SQL_CHAR)が
DB側でいつの間にかvarcharになっていたのが原因でした。合わせてやると簡単に使えるように…
みなさん、お騒がせして申し訳ありません。
>>918 ×CHAR検索する箇所(SQL_CHAR)がDB側でいつの間にかvarcharになっていた
○CHAR検索(SQL_CHAR)としていたのに、対象のDB側の項目の型がvarcharになっていた
質問です。 上手いことsscanfを.NETで実装する方法ってありますか? ポインタが上手く渡せず困っています。 なお、正式に習ったわけではなく、見よう見まねでやっているため、 単純なところで勘違いがあるかもしれませんが、その時も指摘して頂けたら助かります。
【これまでの経緯】
プログラムが間延びしてきたため、
これまで個別にちまちま書いていたファイル読み出し部分をsscanfで纏めて整理しようとしています。
ググッたところ、.NETにはsscanfそのものはなく、どうやら皆さん苦労しているようでした。
http://stackoverflow.com/questions/4223917/c-sharp-equivalent-of-c-sscanf http://stackoverflow.com/questions/492262/is-there-an-equivalent-to-sscanf-in-net http://www.blackbeltcoder.com/Articles/strings/a-sscanf-replacement-for-net ただ自分の場合はcsvの読み出しで順番と対象だけ指定できればいいので、
以下のように組んでみました。(ただしまだ動かしていないので動かないかもしれません)
private: int sscanf_csv(String^ str, String^ format, array<void**>^ pointers){
array<String^>^ strs = str->Split(',');
array<String^>^ fmts = format->Split(',');
int i=0;
while (i<strs->Length && i<fmts->Length) {
if (fmts[i]=="int") {
if (!Int32::TryParse(strs[i],(int%)pointers[i])) break;
} else if (fmts[i]=="double") {
if (!Double::TryParse(strs[i],(double%)pointers[i])) break;
} else if (fmts[i]=="float") {
if (!Single::TryParse(strs[i],(float%)pointers[i])) break;
} else if (fmts[i]=="string") {
*(interior_ptr<String^>)pointers[i] = strs[i];
}
i++;
}
return i;
}
Stringのところは怪しいですが、intとdoubleとfloatはネイティブなら問題ないと思っています。
【問題点】 ・マネージドのクラスではメンバにネイティブ配列が使えないため、 書き込み対象にどうしてもマネージド配列の要素を指定することが必要となりますが、 interior_ptrをvoid**にキャストできません。 仕様上、interior_ptr → pin_ptr → int → void** にはキャストできる(っぽい)のですが、 ・interior_ptrは配列に出来ない(array<interior_ptr<int>> も interior_ptr<int> hoge[] もエラー) ・pin_ptrも同様に配列に出来ない。さらにローカル変数として宣言しないと駄目っぽい。 ため、これらを回避するためにはベタにコードする必要があり、余計に見にくくなります。 ・そもそも void** にしているのは可変長引数がいまいちだったからなのですが、 上記のように interior_ptr が配列に取れないから多分可変長も無理です。 ・自分の場合は1行につきせいぜい10個程度の代入なので最悪べた書きでラップしてもいいのですが、 interior_ptr<Type>は型指定があり、型の順番は変更したいのでこれも厳しいです。 【出来ればいいなと思っている記述】 array<int> ary_int = gcnew array<int>(10); array<double> ary_double = gcnew array<double>(10); sscanf_csv(line0, "int,double", gcnew array<void**>(2){&ary_int[0], &ary_double[0]}); sscanf_csv(line1, "double,int", gcnew array<void**>(2){&ary_double[1], &ary_int[1]}); という感じです。良い案があればお願い致します。
>922
https://gist.github.com/anonymous/db1149cb0a1afbd1f6d8 書いてて思ったけど、変に凝るよりも↓みたいな奴の方が読む人にやさしい…
auto x = gcnew CSV(line1);
ary_int[0] = x->read_int(0);
ary_double[0] = x->read_double(1);
>>923 おお、ありがとうございます。
template<typename ... Ts>でTsはバラバラでもいけるんですね。知りませんでした。
あと、再帰で一つずつ剥がすのも思いついていませんでした。ググルと定番のようですがorz
> 書いてて思ったけど、変に凝るよりも↓みたいな奴の方が読む人にやさしい…
ちなみにその記述は今の状態です。
ただ、これだと抽象度が低いため記述量が増え、ちょっと保守性に問題を生じ始めています。
結局のところ、同じフォーマットの行を大量に処理して配列に突っ込むだけなので、
最終的には「ファイル名」「フォーマット」「対象配列」でよく、最上位からは(型情報ありなら)
parse_csv(filename, &ary0, &ary1, ...);
の1行にしたいのです。その下のファイル→行のところでコメント等をはがし、
delegateでparse_lineを呼ぶ算段でしたが、ポインタが渡せずに困っていました。
大変助かりました。ありがとうございました。
と思ったのですが、parameter pack はC++11の機能で、VS2013以降からのようです、、、
VS2015でそちらのコードが動作するのを確認しました。
自分が使っているのはVC++2008なので、この機会に移行を考えますorz
当面はせいぜい10個なのでunpackしたものを自分で書きますが、、、
すいません、やや話が前後しているので念のため一部訂正します。 元々 delegate から parse_line を呼ぶつもりでしたが、 最終的には可能なら parse_csv に纏めようとしています。 ただ parameter pack が使えないとやっぱキツいですね、、、
行によってフォーマットが違わない(ファイルによっては違うのかな)のなら、 行をパースした結果の型を定義しちゃったほうが保守性は上がると思うけど、縦方向の配列が必要なんだろうなぁ。
>>926 はい、ファイルによってフォーマットは違い、行では変わりません。
演算ソースを読み込むのに使うので、速度は遅くても構いません。
ただ一部、各行の先頭数値によって行のフォーマットを変えている部分があるため、
元々はメンバ関数内で parse_file を呼び、フォーマット毎の parse_line を delegate で渡すつもりでした。
ただこれはソースファイルが増えるのが面倒なので一部にパッチを当てたからであり、
きちんと修正すれば parse_file に一本化できるので、この方向で検討中です。
実は縦方向の配列は不要で、各行での構造体化も検討中です。
すいません、また細かいところで間違えました。一応念のため訂正しておきます。 × 元々はメンバ関数内で parse_file を呼び、フォーマット毎の parse_line を delegate で渡すつもりでした。 ○ 元々は上位で parse_file を呼び、対象オブジェクトのメンバ関数を delegate で渡し、 メンバ関数内で先頭数値を見てフォーマットを区別し、そこから parse_line を呼ぶつもりでした。(現時点で動作中) 今は上位で メンバ関数 Hoge.init(filename) を呼び、init内で全部済ませる方向です。 これまで全くオブジェクト指向をしておらず、それでも大して問題なかったのですが、 いい加減無理になってきたので、今更ながら粗結合化をやろうかというところです。
「System.Collections.Generic.List<T>型」を「LPARAM型」に変換する方法、 またその逆の変換をする方法、を教えて下さい。 List<T>型をLPARAM型に変換する必要があり、 その後で、List<T>型をLPARAM型から再取得する必要があるのです。
「その後で」がスコープを抜けた後を意味するなら、そのような方法はありません。
marshal_as を実装すればいいと思うよ。 LPARAM って実体は void** じゃなかったっけ
>>931 言語はC++ cli です。
msclr::interop::marshal_context mct;
LPARAM lParam = mct.marshal_as<LPARAM>(this->child_window_list);
↑で実装すると↓のコンパイルエラーとなります。
error C4996: 'msclr::interop::error_reporting_helper
<_To_Type,_From_Type>::marshal_as':
This conversion is not supported by the library or the header file needed for this conversion is not included. Please refer to the documentation on 'How to: Extend the Marshaling Library' for adding your own marshaling method.
またList<T>型をLPARAM型に再変換する方法が分かりません。
経緯を見ずに 子ウィンドウリストの扱いとして妥当とは思えないが
LPARAMの使い道がEnumWindowsの第二引数とかだったらやりようがあるけど、そういうコードではない?
解決しました。 c++の世界で一時変数を設けて、ポインタを渡し、reinterpret_castで復元する、という方法です。
質問です。 += で追加したフォームのイベント順を入れ替えたいのですが、やり方はありますか? 条件 1. デザイナは使いたい(既に大量に使っている) 2. 格好悪い書き方で全く問題ないが、全体的に書き直すのはNG 状況 numericUpDown->Changed 等に対してデザイナ上から再描画関数を割り当てています。(A) (波形を表示する時のボリュームのような使い方です) デザイナではフォームはデフォでは static でないため、 内部の別クラスからは numericUpDown->Value 等にはアクセスできません。 (自分でstaticと書いてコンパイルを通すことは出来ますが、デザイナで変更するたびに戻されます) そこでイベントに別関数も割り当て、そこで内部 static struct に Value 等を書かせ、(B) 別クラスからはこの static struct を参照しています。 このとき、AとBの経路が完全に分離しているうちはよかったのですが、 統合していくうちにA内部から別クラスを呼ぶことが発生し、 static struct が未更新なのでバグっています。 イベントは追加順に呼ばれるようです。 デザイナで指定したイベント関数はフォーム生成時に指定される為、必ず A->B の順で呼ばれることになります。 これを B->A の順に入れ替えたいのですが、方法はありますか?
プログラムイメージ Form^ someForm; // デザイナで作成したため、static ではない someForm->Changed += 再描画関数; // (A) someForm->Changed += struct更新関数; // (B) static ref struct FormData { Decimal someForm_value; } formData; function struct更新関数(){ // (B) formDataを更新 } function 再描画関数(){ // (A) formDataを使う別クラスを使用 // formDataは未更新なのでバグる } やってみたこと numericUpDown->Changed = Delegate::Combine(struct更新関数, 再描画関数); // 上書き再設定しようとしたが = は使えない どうやら +=(add) と -=(remove) しかないので、(中身を参照できない) 一つずつ array<Delegate^> に吸い出して += で希望順にちまちま再設定も出来そうにありません。 全部の(A)の頭に(B)を追加してイベント経路を一本化すればいいのは分かりますが、 これは大量に書き換えが必要となります。 今現在(B)は後付で全てのフォームを列挙して追加しています。 この部分だけの変更に留められるのならそうしたいのです。 リフレクションも試しましたが、以下でeventInfoは取れますがその先に進めません。 System::Reflection::EventInfo^ eventInfo = (NumericUpDown::typeid)->GetEvent("ValueChanged"); 以上、よろしくお願い致します。
> デザイナではフォームはデフォでは static でないため、 > 内部の別クラスからは numericUpDown->Value 等にはアクセスできません。 ここで結果と原因の理解が食い違ってるので設計が悪くなってるのでは。 FormDataはstaticにせずForm1のメンバにして、その中身が変化したときのイベント (ここに再描画関数を += して、EventArgsでパラメータを渡す)を足すのが良いのでは。
>>939 回答ありがとうございます。
それでも解決しますが、それは全面改訂になります。
既に(B)を全ての(A)の頭に入れるという解決策はあり、それの方がデグレードの危険が少ないです。
ただ、リフレクション等で(B)と(A)の順を入れ替えられると、数行の変更で済み、デグレードは発生しません。
だからそれを探しています。
Form1と別クラスCを追加して再度説明します。
全てはForm1の内部クラスです。継承はしていません。
【今】 ref class Form1{ Form^ someForm; // デザイナで作成したため、static ではない someForm->Changed += 再描画関数; // (A) someForm->Changed += struct更新関数; // (B) static ref struct FormData { Decimal someForm_value; } formData; function struct更新関数(){ // (B) formDataを更新 } function 再描画関数(){ // (A) // struct更新関数() // (B)を += せずにここに入れれば解決する、ただし変更箇所多数 formDataを使う別クラスCを使用 // formDataは未更新なのでバグる } ref class 他のクラスC { 描画用データ作成 // ここで someForm->Value を使いたいが直接には出来ないので仕方なく static formData を確認 } }; 問題点: クラスCから someForm->Value が取れないので static struct FormData で誤魔化す。 ただしこれだとイベント順が「描画(A)」→「データ更新(B)」となり、描画内容が1イベント分ずれる。 このため、(B)と(A)の処理順を入れ替えたいが、方法が見あたらない。
【
>>939 の提案】
ref class Form1{
Form^ someForm; // デザイナで作成したため、static ではない
someForm->Changed += struct更新関数; // (B)
ref struct FormData { // static ではない
Decimal someForm_value;
} formData;
formData->someForm_value->Changed += 再描画関数; // (A) // 自作クラスFormDataにChangedイベント追加
function struct更新関数(){ // (B)
formDataを更新
}
function 再描画関数(){ // (A)
formDataを使う別クラスCを使用 // formDataは常に更新済み、formDataを呼び出し時に渡す
}
ref class 他のクラスC {
描画用データ作成 // formData を参照
}
};
問題点:
イベント処理順は「データ更新」→「描画」と正しく固定される。
ただし全面改訂になる。
> ここで結果と原因の理解が食い違ってるので設計が悪くなってるのでは。 結果: 描画に使われるデータが1イベント分ずれる 原因: イベント順が「描画」→「データ更新」だから 何か間違いはありますか? データ構造としては本来は class Form1 : FormData となるべきため、 static で使うことも問題ないと思います。 既に記述されて動いているプログラムがあり、それを変更しようとしています。 データ更新→描画にプログラム上で固定するのはスクラッチからなら当然ですが、その場合にも結局 「どのデータが更新されたか→どの部分を再描画する必要があるか」を記述する必要があります。 この部分は今既にデザイナ上にあり、動いているので、それをそのまま利用する方法を探しています。
リンク先のコードでイベント順を入れ替えることが出来ました。 ありがとうございました。 プログラム構造については色々意見はあるとは思いますが、 最初から固まっている仕様に対して一度作って終わりなら誰も苦労しませんよ。 複数有る解決策のうち、今現在見える範囲での最適解をその都度選んでいくしかありません。 A. イベント順を入れ替えても B. 各イベントハンドラの頭にデータ更新を挿入しても C. 他クラスに対していちいちForm1オブジェクトを渡してstaticではなくしても 制御フローは同じです。(切り出し面が異なるだけ) 今後FormDataクラスや「他のクラスC」はForm1外でも使う可能性があるのと、 デグレードに対するデバッグの困難さを考えて、今回はAを選んでいるだけです。 まあいずれにしても、解決しました。 ありがとうございました。 なおリンク先、最後に小言が書いてありますが、完全に同意ですよ。 本来はイベントテーブルを参照できるメソッドが有ればいいだけです。
本来はまともな設計をすればいいだけだよ += した順番に呼ばれるのもたまたまそういう実装になってるだけでしょ
イベントの実行順はaddされた順だと仕様化されてる
質問失礼します。 'abc.exe': 'C:\Visual Studio 2008\Projects\xyz.dll' を読み込みました。Cannot find or open the PDB file 'abc.exe': 'C:\Visual Studio 2008\Projects\xyz.dll' をアンロード このアンロードはどうやって止めるのでしょうか? 実行した際に、dll内のメソッドを参照できないようで、以下のエラーとなります。 ハンドルされていない例外: System.IO.FileNotFoundException: ファイルまたはアセン ブリ 'hoge.dll'、またはその依存関係の 1 つが読み込めませんでした。 指定されたモジュールが見つかりません。 場所 hoge.hogeclass..ctor() 場所 main(Int32 argc, SByte** argv) 場所 _mainCRTStartup() コンパイルはできています。 よろしくお願いします。 (なんか急にできなくなった気がします。前は、問題無だったはずなのになぁ) 追記 他にも、以下のような、謎のメッセージも出ています。 'abc.exe': 'ImageAtBase0x10000000' を読み込みました。含める/除外する設定により、読み込みは無効になっています。 'abc.exe': 'ImageAtBase0x10000000' をアンロード よろしくおねがいします。
「cannot find or open the pdb file c++」で検索!
アンロードは気にするな dllの場所をあちこちコピーして試してみ
思い出しました。
ildasm,ilasmをつかって、その該当のdllのPCBを作りました。
(dllの中まで、デバッガで追いかけるためです)
あたらしくコンパイルしたDLLへ、前のPCBがなかったものから、リンクを張り替えました。
そしたらエラーが出るようになった気がします。
(あくまで、気がするだけです。なんら、確かな関連はわかりません)
しかし、現在は、以前のオリジナルのDLLをリンクしています。
その状態でエラーが出ています。
>>950 回答ありがとうございます。
/LIBPATH の場所
exeと同じフォルダ
program filesフォルダのvisualSTUDIOフォルダ
それらに置き直しました。が、駄目でした。
xyz.dllが依存している何かのDLLが見つからないんじゃないの dependency walkerとかcygwinのlddとかで確認してみたら
参照設定に入れてるんじゃないの? 一旦外して参照設定しなおしてみては
'newxyz.exe': 'C:\Documents and Settings\company\My Documents\Visual Studio 2010\Projects\newxyz\Debug\newxyz.exe' を読み込みました。シンボルが読み込まれました。 'newxyz.exe': 'C:\WINDOWS\system32\ntdll.dll' を読み込みました。シンボルは読み込まれました (ソース情報は取り除かれました)。 -----------------------------------------省略 'newxyz.exe': 'C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Culture.dll' を読み込みました。シンボルは読み込まれました (ソース情報は取り除かれました)。 'newxyz.exe': 'C:\WINDOWS\assembly\NativeImages_v4.0.30319_32\mscorlib\cece9d0256e18427b64587ba690605d4\mscorlib.ni.dll' を読み込みました。シンボル ファイルにネイティブ シンボルがありません。 'newxyz.exe' (マネージ (v4.0.30319)): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll が読み込まれました。シンボルが読み込まれました。 ー---------------省略 'newxyz.exe' (マネージ (v4.0.30319)): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll が読み込まれました。シンボルが読み込まれました。 'newxyz.exe': 'ImageAtBase0x10000000' を読み込みました。含める/除外する設定により、読み込みは無効になっています。 'newxyz.exe': 'ImageAtBase0x10000000' をアンロード 'newxyz.exe' (マネージ (v4.0.30319)): 'C:\Documents and Settings\company\My Documents\Visual Studio 2010\Projects\newxyz\Debug\xyz.dll' が読み込まれました 'newxyz.exe': 'ImageAtBase0x10000000' を読み込みました。含める/除外する設定により、読み込みは無効になっています。 'newxyz.exe': 'ImageAtBase0x10000000' をアンロード ----------------続きがあります ----------------続きがあります
'newxyz.exe': 'C:\Documents and Settings\company\My Documents\Visual Studio 2010\Projects\newxyz\Debug\netClient.dll' を読み込みました。Cannot find or open the PDB file 'newxyz.exe': 'C:\Documents and Settings\company\My Documents\Visual Studio 2010\Projects\newxyz\Debug\netClient.dll' をアンロード newxyz.exe の 0x7c812aeb (kernel32.dll) で初回の例外が発生しました: Microsoft C++ の例外: EEFileLoadException (メモリの場所 0x0012d0e8)。 ----------省略 'System.IO.FileNotFoundException' の初回例外が newxyz.exe で発生しました。 'newxyz.exe': 'C:\WINDOWS\system32\version.dll' を読み込みました。シンボルは読み込まれました (ソース情報は取り除かれました)。 'System.IO.FileNotFoundException' のハンドルされていない例外が newxyz.exe で発生しました。 追加情報: ファイルまたはアセンブリ 'netClient.dll'、またはその依存関係の 1 つが読み込めませんでした。指定されたモジュールが見つかりません。 'newxyz.exe' (マネージ (v4.0.30319)): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_ja_b77a5c561934e089\mscorlib.resources.dll' が読み込まれました スレッド 'メイン スレッド' (0xe48) はコード 0 (0x0) で終了しました。 スレッド 'Thread::intermediateThreadProc' (0xec8) はコード 0 (0x0) で終了しました。 スレッド 'HelperCanary::ThreadProc' (0xec4) はコード 0 (0x0) で終了しました。 プログラム '[3652] newxyz.exe: ネイティブ' はコード 0 (0x0) で終了しました。 プログラム '[3652] newxyz.exe: マネージ (v4.0.30319)' はコード 0 (0x0) で終了しました。
>>952 >>953 みなさん、ありがとうございます。
952さんのおっしゃる方法でいけました。
dependency walkerで、不足していたDLLが発見できました。
VSで、もし不足DLLがあるなら、教えてくれるはずだ」という、
思い込みが駄目でした。
3日*5時間=15時間
ぐぐたり、最インストして、時間をつぶしました。
(エラーコードを貼り付けたけど、無駄になっちゃた)
匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、
BitTorrentがオープンソースで開発されています
言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか?
Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします
https://twitter.com/Lyrise_al ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできないアスペルガーw
The Covenant Project
概要
Covenantは、純粋P2Pのファイル共有ソフトです
目的
インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します
特徴
Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW)
接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です
DHTにはKademlia + コネクションプールを使用します
UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります)
検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません
1w
大分人が居ないみたいだけど、質問させてください archlinux(x86_64)+gtkmm3(3.22.0)+epoxy(1.3.1)+glsl上のOpenGLで隠面消去をしたいのですが glEnable(GL_DEPTH_TEST)しても上手く行きません。fragment shaderの部分で書くのでしょうか? もしサンプルなど有りましたらURLを教えて頂ければ幸いです。 OpenGL、GLSL周りの情報は何処を見て何処を出せば良いのか分からず不明ですが宜しくお願いします 少し問題の発端を・・・ 以前はgtkmm3+glewで某ホームページで点にテクスチャを貼って大きさを変える方法を利用してました (1) gtkのアップデート → context周りが上手く機能せず (2) GLAreaクラス使用する → オプションとか無効なものが発生、描画命令が上手く動かない (3) GLSLを使うようにする → アルファテストは何とか解決、隠面消去が実装方法が分からず ※オンボード(core i7 4771)のグラフィックを使っているせいかGLSLのバージョンも1.3以上にできないみたいです
わかったぁぁぁぁ!!! glEnable( GL_DEPTH_TEST ); ではなく set_has_depth_buffer(); でデプスバッファを有効にするみたいだ こんな所まで変える必要はないだろうに・・・
いや誘導されてきたしw 普通のくだすれ落ちてるし スレ立てるまでもないスレの方が良かったのかな?
「くだすれ行け」って言われてこのスレに誘導されたと思ったんなら頭悪すぎるわ。
まあ /CLI の文字はわからない人には見えないからな
C#で言うオブジェクト初期化子に相当する機能ってC++/CLIに用意されているんですかね? getアクセッサしかないプロパティをコンストラクト時に初期化して使うようになっている ライブラリがあったんですけど、もしかしてそういうクラスはC++/CLIから使えない?
{ hoge : 774, fuga : 37564 } { .hoge = 774, .fuga = 37564 } みたいなやつ? 俺も2015で以前に探したけど見つからなかったな どうなんだろうね、あるのかな
それです。 VBには追加されているみたいだけど、C++/CLIは見捨てられているなぁ。
VSの作りからして、それはないんじゃないかな MFCでリボンじゃない方のドッキングのプロジェクト作るとわかるけど、 あれがものの見事にVSのドッキングだからね かつデザイナは当然ユーザが生成する(した)フォームは(特にユーザコンポーネント) .NETでビルドされたものをデザインタイム用に直接呼び出してる (デザイナでエラーが出るだのインテリセンスが良く落ちるだの言ってるのは VSの作りを”なんとなく”ですら理解できてない証拠) MSとしてはVSで次のVSを作ったりする為にもC++/CLI作りこみたいけど 非常に言語体系が複雑かつ莫大な工数が必要で追いついてないんじゃないかなと妄想 既に市場のソフトウェアの価格破壊はとっくに完了 後はストアかUbuntuOnLinuxでサーバ市場か開発シェアで食い込むしかなさそうだし
亀レスだが何となく妄想が閃いた MS主導とはいえ、C++/CLIってなんかの国際的な規格みたいなので規定された れっきとした規格だからおいそれと追加できないんだ んで、C#もC++も構造体(クラス)の初期化子持ってるから昔みたいな適当に 「MS独自の拡張でーす」とかやっちまうと収拾つかなくなりそう とはいえ { 0, ,1 2 } は後からメンバ追加したとき修正忘れとかトラブルの元だし 構造体宣言→ZeroMemory→b=1; c=2;はエイリアス切らないとconst修飾できねーし (エイリアスはヒューマンエラーの元、constじゃないと最適化掛からないケースあり) さっさと対応して欲しいとこではある
混在アセンブリが作れるのはC++/CLIだけだし非常にもったいないと思うんだが、 MS自身も既にグルー用途以外での新規採用を推奨してなかったんじゃないかな。 もうちょっと力入れてくれてたらMFCなんか捨てられたのに。
https://support.microsoft.com/ja-jp/kb/3001686 これかな
そのわりにはVSには使ってんだよな
MFCしながらマネージコードをデザインタイムで呼び出してフォーム表示しなきゃならんから
仕方ないのかも知れんけど
さりげなくVS2015でMFC進化してたし、MFCのダイアログでスプリッタとか (無理やり空のCFrameWnd貼り付けるとタブ移動できない) ステータスバーとか(.NETみたいにツールバーもどきとしても使える) .NETでしか使えないコントロールが軒並みMFCにきてくれたりするだけでもいいんだけど これから先C++/CLIのサポートどうなるんだろ 多少見てくれやUIが前時代的でもMFCの方が安定かなぁ
MSはCLI推奨せずにC#やVB推奨してっけど、将来のOffice系何で作るんだろな 難読化してもその内ソースのオプティマイザ出てきてイタチごっこになりかねんし暫くはMFCかね
C++/WinRT なんてものまで出てきて、C++/CX も先が短そう WTL の再来っぽくていい感じだけど
どれか一本に絞ってくれんと安心して規模がでかいモノに使えんのだよな
C++/WinRT をちょっと使ってみたけど、これいいね 標準C++で WinRT の COM 定義をインクルードして普通に使えるのはいい 癖さえつかめば、あとはWinRTのお作法だけってかんじだわ
UWPとか限定せずに、C++/CLIのまま突っ走って欲しかったんだがなぁ
フォームアプリ用のプロジェクトのテンプレどっか落ちて無い? 毎回手動で設定するの面倒臭い。
アンマネージ側でvector<>に格納されたデータをマネージ側に返すには gcnewで別にメモリ確保してコピーしてから返す方法になるんですか? (一時的に倍メモリ使うのが気になります)
俺はあまり詳しくないけど、「返す」ってのが普通は要らないと思う。 マネージドからアンマネージドは直叩き出来るし、普通はそうする気が。 切り替えのオーバーヘッドがーみたいな記述もどこかにあったけど、 俺がやっている限りでは無駄命令は出ずに直叩きしてた。 逆にアンマネージドからマネージドも一応は直叩き出来るけど、 pin_ptrにしなければいけないし、可変長は多分無理。 STL/CLRにもvectorはあるけど、こちらだとアンマネージド側のソース変更が必要になる。 (*を^に変更) だから一番楽なのは上記の「マネージドからアンマネージドを直叩き」だと思う。 なおコピーするのならそりゃ一時的には倍メモリ使うしかないでしょ。
collection_adapterの出番だ!って思ったら逆方向だったでござる
visual c++ express edition (2010)で、 numericUpDown1 に、小数を入力(DecimalPlaces は、 1)できるようにしています。 コードから、 float suu; (numericUpDown1 -> Value) = (float)suu; が、エラー出ます。 suu と、numericUpDown1 を、整数にしておけば、エラー出ません。 小数で、入力するには、どうすればよいのですか? m(__)m
カッコとかキャストとかわけわからずにやってんのか System::Decimalにキャストしてみて
C++ って初期値を0にするって仕様化されていたっけ?
int a {};とすれば0初期化される仕様だったような?
>>991 ++は0にするんじゃなかったかな
コンパイルオプションでも変えられそうだけど
>>803 言葉遊びじゃなく君が人の書き込を妄想で勘違いしてドヤ顔で噛み付いてきた挙句論点の違う馬鹿な屁理屈こねたってのが現実だよね?
それで負け惜しみか知らんが「こ、言葉あそびしたいだけだな(震え声」って言われてもね?
違うというなら
「多コア最適化が進めば必然的にryzanにも恩恵がある」
っていう書き込みのどこが思い込みなのかはっきり言えばいいじゃない
論点ズラす馬鹿な屁理屈こねたり負け惜しみ言ってないでさ?
>>809 また屁理屈ですか?
差が埋まるとか埋まらないとかの言い訳はいいからさ?
恩恵あるんだよね?じゃあそれは思い込みじゃないよね?
なんで君は思い込みどうこうとか言い出して噛み付いてきたの?
>何を言われても理解できない子なんだなあ
完全にブーメランで君の額に刺さってるよね
それでもまだ苦しい言い訳や屁理屈や負け惜しみ書き込むの?真性?
それはお前の思い込みだ!!って思い込みで叩く まさにアスペの症状そのままです そして大概アスペ本人は自分が間違ってると認識すらないから 自分の非を認められず延々に論点ズラしや屁理屈こねてだから相手が間違ってると言い続ける こういうのは相手にしないのが吉 >8700Kで走らせれば確実に2コア余るわけで[ おいおい ゲームは今4コアメインだからって6コアCPUを使ったら2コア余るなんて馬鹿な事ほざく奴が なんで自作板にいるんだ?まじで?釣りじゃなく本気で言ってんの? 本気なら真性じゃん
>>815 >そうだねそれと同時にryzenの時代になっていくって事だよね ↓ >多コア最適化が進めば必然的にryzanにも恩恵があるという これのどこに矛盾があるの? 「マルチ最適化が進めば必然的にryzenに恩恵がある=ryzen(もっと分かりやすくいえばマルチコア)の時代になっていく」 何の矛盾もないし言い換えですらない言ってる本質は同じなんだから それを言葉遊びって自分が理解できない馬鹿ってだけだろ? 現時点でマルチ処理では7700Kより明らかにryzenは上で6コアの8700kだってまず勝てないだろうね 馬鹿がなぜか持ちだした4コアなら勝てるかもだけどさ 7700Kと比較するのに同価格帯じゃなく4コアryzen持ちだして何したいの? つかそこまで論点拡大しなきゃ言い訳すらできない時点で馬鹿丸出しで相手にすらする価値ないよね? 勝手に人の書き込みを思い込みで「ryzenの時代=AMDがゲームでも勝つ」みたいに勘違いして脊椎反射で噛み付いたんだろうが それこそアホ(淫厨)の極みだね 何度も言うが完全にブーメランで何を言われても理解できない子なんだなあ君 現段階ではゲームでは7700k最強で安定
マルチではryzenが最強で安定
これにコーヒー(8700k)がどこまで食い込めるかって単純な話しなのにね
ゲームでは定格が低くかつ今のゲームは4コア最適化だから7700k相手だと厳しい
TBは一時的なものだしOCするにしてもそれは7700kでもできる事で元の定格高い分7700kが負担少なく有利
マルチではryzenにはまず勝てないだろう(アホの理論で4コア持ち出せば別だけどw)
ゲームで7700kを上回るために6コア(マルチコア)最適化をするというなら
それはryzenにも恩恵がある事で元々マルチで勝ってるryzenがますます使えるようになって行く
中途半端になりそうなコーヒーってどうなるんだろうね?って簡単な話に淫厨が発狂して噛み付いてきて大変だわ
>>855 逆に言うとマルチ用途ならryzen一択だけどな
そもそもゲーム用途で8700k一択にならずに7700kと二択になってる時点で
8700kって中途半端感あるってまだ気が付かない馬鹿?
ここにいる人はゲームメインで8700kが7700kといい勝負レベルだったら
7700k買って差額をグラボに使うぜ?ここにいる人は
マルチメインでほしいならryzen一択なんだしな
>>862 出たw淫厨用語の「絶対性能」w
それxが出た時に散々聞いた気がするわwww
なるほど絶対性能持ち出さないとダメになったかw
>>867 淫厨が絶対性能持ち出すってのは
小学生が口喧嘩で言い返せなくなって涙目で何言われても「バーカバーカ」って連呼しだすようなもん
何言っても無駄よ?
>>884 >畑違いだから想像で適当に言ってるし、間違ってても気にしないけどな
俺が代わりに言ってやる
頭悪いなお前www
まぁ真性の馬鹿って自分が馬鹿って気がついてないって言うからな
多分周りから散々頭悪いって言われてても気づいてないだけだろうな
なにせ想像で適当に言って間違ってても気にしないレベルの頭だからなw
>>891 何かあれば絶対性能連呼しだすお前も同じようなもんだからな
馬鹿の一つ覚えってやつでな
それに気が付かないでそんなレス返してる時点で・・・・・・かわいそうに・・・・・・
句読点もそうだが
一つの書き込みでアンカー二つ入れてる書き込みもそうだよ
2chでアンカー二つ以上入れて書き込みするなんてよほどのかまってちゃんか荒らしか自演位だわ
アフィ男と馬鹿にする書き込みにだけ過剰なレス返してるし
もうバレバレなんだよね・・・・・・・・・
>>922 アフィ男乙
いい加減指摘どころかアフィ男批判の書き込みあると必ず沸いてくるだろ?お前w
自作とゲームと趣味の日々のブログは捏造と嘘しかないブログなんだともう周知されたからあきらめろ
あんなの見て参考にする情弱のジサカーなんてもういないからw
DELL男の主張聞いて「そうなのか!!6400スバラシイ!!」って言うような馬鹿はいないのと同じでな
>>929 4亀すら故障を心配すると書かざる終えないレベルの爆熱CPUについて
それを批判する書き込みしてる奴は荒らしとか
マジで信者脳だろお前
必死にインテル上げしてたアフィ男と同じメンタリティーだな
多くの誰もが評価するものを叩いてたなら荒らしだろうが
評価もされてないものを叩いてるやつも信者視点では荒らし認定とか
信者っておっそろしいもんだな・・・・・・
read.cgi ver 07.7.25 2025/07/21 Walang Kapalit ★ | Donguri System Team 5ちゃんねる
lud20251109152648caID:9mz6Ds+Pのレス一覧: >>875 の件ですがC#でなんとかがんばることにしました
お騒がせしました
C++/cli からC++のプロジェクトに定義している関数を呼び出したいんです。 C++プロジェクトのlibファイルを参照し、includeファイルをC++/cli側に 持ってきて#include すると、物凄い数のエラーがでます。 (C2011:C2079:C2504:C3395:C3699) [1] C++/cliで参照できるよう、ビルドエラーを直すしかない [2] 別の方法でC++の関数をビルドエラー無しに参照できる。 ちなみに、C++の関数を参照しないで自作・・・という回答は無しでお願いします。
物凄い数のエラーじゃなくてエラーの内容をチェックしろよ。 出力ログのエラーの行をダブルクリックすると問題の箇所に飛ぶから 何で再定義だとか定義がないと言われてるか考えろ。 何でその程度のレベルでC++/CLIとかやってんの。
1.C++から呼び出す 2.C#に移植する C++/CLIでなきゃいけない理由なんてあるん?
すみません、初心者なりにエラーの原因を調べてきました。 a.h class A : public B {} b.h class B {} この時に Class B で再定義のエラーが発生していました。 a.h が先にincludeされているのが問題で、b.h を先にinclude するよう ソース修正すれば良い・・・・・ということでしょうか??
各ヘッダの先頭に#pragma onceと書く a.hでb.hのクラスを使っているなら a.h内でb.hをinludeしろ cpp側でincludeの順を気にしなきゃならないのは糞
質問です。 任意の型のマネージド配列(cli::array)を、任意の個数、引数として受け取って それらの配列としての長さの最小値を返す関数を書きたいと思っています。 イメージとしては、 array<String^> arrStr = gcnew array<String^>(6); array<double> arrDob = gcnew array<double>(8); array<int> arrInt = gcnew array<int>(3); に対して、 Function(arrStr, arrDob) = 6 Function(arrStr, arrDob, arrInt) = 3 となるような関数Functionを書きたいと思っています。 しかし、この場合の引数リストの書き方がよくわかりません。 単純に可変長の引数リストだとFunction(... array<Object^>^ args)みたいな 書き方になると思うんですが、これをマネージド配列の配列だからといって 真似てFunction(... array<array<Object^>^>^ arrays)みたいな書き方をしても、 呼び出し側(例えばFunction(arrStr, arrDob)とか)で引数リストが一致しない旨 怒られます。このような場合の適切な引数リストの書き方ってありますか? あるいは回避策として、引数はFunction(... array<Object^>^ args)としておき この関数の中でfor each (Object^ arg in args) { argが配列かどうか }という コードもありえますが、肝心の、「argが配列かどうか」チェックするコードが わかりません。 上記いずれか一方で構いませんので、解決策をご教授いただけないでしょうか?
... System::Array^ args arg->GetLength ... System::Collections::IList^ args arg->Count
>>884 試してみましたが、いずれの場合もコンパイルエラーC3132が発生します。 そもそもargの型を何に指定すべきなのか、というのがよくわかっていません。 例えば int Function(... array<Object^>^ args) { int MinLength = -1; for each(array<Object^>^ arg in args) { if ( (MinLength < 0) || (arg->Length < MinLength) ) { MinLength = arg->Length; } } return MinLength; } みたいなコードだと、Function(arrStr, arrInt)を実行したとき、それら引数を System.Object[]にキャストできない旨を怒られます。 レス:1-200 201-400 401-600 601-800 801-1000 ALL
このスレへの固定リンク: http://5chb.net/r/tech/1268613679/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像 ↓「くだすれC++/CLI(初心者用)part2YouTube動画>1本 ->画像>4枚 」 を見た人も見ています:・くだすれDelphi(超初心者用)その16 ・くだすれC++Builder(超初心者用)その5 ・くだすれFORTRAN(超初心者用)その7 ・くだすれPython(超初心者用) その47【Ruby禁止】 ・くだすれjavascript(超ウルトラ初心者用) その1 ・【まず1嫁】くだすれPython(超初心者用) その60 ・くだすれPython(超初心者用) その51【まず1嫁】 ・【まず1嫁】くだすれPython(超初心者用) その54 ・くだすれDelphi(超初心者用)その60【Embarcadero】 ・くだすれDelphi(超初心者用)その59【Embarcadero】 ・くだすれDelphi(超初心者用)その57 ・くだすれDelphi(超初心者用)その55 ・くだすれPython(超初心者用) その33 ・くだすれjavascript(超初心者用) その1 ・くだすれPython(超初心者用) その32 ・くだすれPython(超初心者用) その40 ・くだすれDelphi(超初心者用)その54 ・くだすれPython(超初心者用) その52【まず1嫁】 ・■初心者用リモートデスクトップ専用すれっど■ ・初心者用◆鬼の練習成果をうpするスレ ・【🏡】とうすこ初心者用スレ🔰part1023 ・J初心者です色んなことを教えてください ・スクスト初心者です 教えてください ・投資初心者ですがおすすめの株など教えてください ・スト6初心者です。アドバイスください。 ・自分の悪いところを教えてください(初心者です) ・初心者なんですが、オススメのレンズ教えてください ・初心者です。教えてください。 ・自作初心者です助けてください ・初心者なんだけど、おすすめ教えてください ・ゲーミングチェア初心者ですおすすめください ・14歳ワイ写真初心者なんだかどうすればいい ・天文・気象板 初心者質問すれ。PART XXXXIV ・スケールモデル初心者総合すれっど ・野球観戦初心者俺、どうすればいいの? ・天文・気象板 初心者質問すれ。PART XLVI ・初心者がAA職人目指すにはどうすればいいの? ・初心者だけど,どの言語から勉強すればいい? ・一人ぼっちの将棋初心者なんだがどうすればいい? ・ネット初心者必見ですばい!! ・女(初心者)だけど、耳コピします ・盆栽初心者が恥をしのんで質問するスレ(パート16) ・PC初心者(俺)がみんなに質問するスレ ・盆栽初心者が恥をしのんで質問するスレ(パート17) ・福祉の相談援助職(初心者)に相談するスレ ・盆栽初心者が恥をしのんで質問するスレ(パート15) ・初心者が藝大油画受けます ・ロード初心者質問スレ part475 ・TPPについて詳しい人初心者にわかりやすく教えて ・40代女子の初心者におすすめのクラブ教えて下さい ・初心者が入院生活について質問するスレ5 ・焼酎初心者の僕におすすめを教えるスレ ・バー初心者にも分かる注文するカクテル ・筋トレ内容見て欲しいです。初心者です ・【初心者ok】構成と見積りを厳しく評価するスレ170 ・FX初心者が少額でスキャルのトレードをするスレ23 ・【初心者ok】構成と見積りを厳しく評価するスレ183 ・麻雀初心者なんだけどすげー納得いかない ・大金をかけたのに糞音出してる初心者を救済するスレ ・アメコミ初心者におすすめの作品は Part.2 ・【初心者ok】構成と見積りを厳しく評価するスレ179 ・ポケゴ初心者が育てやすい強いポケモン ・プロを目指すための相談3 Q初心者 Aプロ ・初心者ですがウエイトトレすると妙にムラムラする ・【初心者ok】構成と見積りを厳しく評価するスレ158 ・【初心者ok】構成と見積りを厳しく評価するスレ159
15:15:26 up 18 days, 6:37, 4 users, load average: 17.17, 15.39, 15.71
in 0.05727219581604 sec
@[email protected] on 111005