ようこそゲストさん

すらりん日記

メッセージ欄

分類 【プログラミング::C++/CLI】 で検索

一覧で表示する

2006/05/20(土) 初めての…

C#じゃなかった、マネージドC++

個人的にはC#も嫌いじゃないんですけど、最高!と思っているのはマネージドC++だったりしてます。昔のコード(C++)使いながらも、新しい.NET Frameworkの機能も使えるって最高じゃないですか。 というわけで、マネージド型やC#はVisualStudio2003からデビューした(つもり)でした。 が! 今最新のVisualStudio2005ではこのあたりものすごく変わっていて、泣きました。 マネージド型で作ろうとするとかなり苦労しました。 今までは、普通にnew出来ていたものが、gcnewを使ったりと。 ネットにある普通のManagedC++のコードがそのまま通らないのもつらいです。 とりあえずファイルを開くダイアログ出すだけでも、
 OpenFileDialog^ dlg = gcnew OpenFileDialog();
 dlg->InitialDirectory = "c:\\";
 System::Windows::Forms::DialogResult result;
 result = dlg->ShowDialog();
こんな感じです。マネージド型には"^"が導入されてます。 なにか気持ち悪いと思うのはオレだけでしょうか?

2009/05/27(水) C++/CLIでの実行時エラー

C++/CLIとC++ネイティブのlibをリンクさせて、Windowsフォームアプリケーションを作ったときに、
よくわからないエラーが発生してしまうことがある。
Expression: _CrtIsValidHeapPointer(pUserData)
どうやらCRT初期化の順序に問題があるのか。
これを解決するには、エントリポイントの修正を行えば解決する模様。
次のエントリポイントに設定させてあげれば問題解決できた。
?mainCRTStartupStrArray@@$$FYMHP$01AP$AAVString@System@@@Z
ずいぶんと前にわかっていて、日記に書いたと思ったのに忘れていたので、
今更ながら追加。

上記の発生条件

どうやらグローバルなコンストラクタが実行されるときに何かがあるらしい。
C++のclassメンバにstaticなデータがある場合に発生する。
また、それが組み込み型(プリミティブ型)ならば問題なく動くが、
自分で作成したクラス型だと実行時エラーの引き金となる。

追記1

コンストラクタやデストラクタを備えるクラスだとアウトっぽい。
そのクラスがプリミティブ型しか保持していないとしても。

追記2

どうやらコンストラクタがあることが問題ではないらしい。
デストラクタがあることが問題のようだ.
デストラクタのあるクラス型で、クラスstaticメンバを持つと、このエラーが発生する。

こういったクラス構造をどこかで持ってしまうと、C++/CLIで実行時エラーとなる.