- ベストアンサー
VC++2008のWindowsフォームアプリケーションで
WindowsAPIのCreateWindow関数を使う事は出来ますか? (ネイティブ関連のものを使用するための設定は整っているとします。) 可能な場合、CreateWindow関数の、アプリケーションインスタンスのハンドルを指定する部分には何を設定すればいいのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
# CreateWindow関数を使う必要性がわからないけど Module^ m = Assembly::GetExecutingAssembly()->GetModules()[0]; HINSTANCE hInst= (HINSTANCE)Marshal::GetHINSTANCE(m).ToPointer();
その他の回答 (3)
- bluecampus
- ベストアンサー率66% (138/209)
>これらを使用するにあたって、何らかの解放処理は必要でしょうか? おそらく何も必要ないです。 No.3さん >main関数の引数にアーギュメントが文字列の配列で渡されて来る宣言は、コンソールアプリケーションの場合で、Windowsフォームアプリケーションの場合、WinMainがエントリポイントになる筈です。 SUBSYSTEMオプションにWINDOWSが指定されていると、 ENTRYポイントがmainでもよさげです。。。 まぁ、mainだとしてもTCHAR* argv[]がarray<String^>^に変換されているので、 何か中間にあるとは思います。 オプションでエントリポイントを変更することは可能ですので、 プロパティより [構成プロパティ]-[全般]-[共通言語ランタイムサポート] を 共通言語ランタイムサポート(/clr) に [構成プロパティ]-[リンカ]-[詳細]-[エントリポイント] を wWinMainCRTStartup に変更し、main文のあるcppファイルに #include <windows.h> #include <tchar.h> の行を追加し、 int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd) { return main(System::Environment::GetCommandLineArgs()); } と記述すれば、hInstanceをどこかに保管することはできるでしょう。 まぁ、前述どおり、アセンブリからとれるからまぁやらないでしょうけど。
お礼
・・・そうですか。 安心しました。 ご丁寧にありがとうございます。
- chie65536(@chie65535)
- ベストアンサー率44% (8741/19839)
>int main(array<System::String ^> ^args) >ってなってます。なので分かりませんでした。 それは変ですね。main関数の引数にアーギュメントが文字列の配列で渡されて来る宣言は、コンソールアプリケーションの場合で、Windowsフォームアプリケーションの場合、WinMainがエントリポイントになる筈です。 なので「プロジェクトのタイプを間違って新規作成した」と思います。作成した実行ファイルは、Windowsアプリケーションではなく、コンソールアプリケーションになっている筈です。 >その前提でも関数以外で取得する方法はありますか? 自身のインスタンスハンドルの取得方法は http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200807/08070012.txt の「2008/07/15(火) 15:33:42」のコメントが参考になります。 この他、処理系に依存しますが、あるC言語では、ランタイムライブラリがWinMain関数を呼び出す前に、グローバル変数「Application」のメンバ変数に色々な値をセットしてくれるので Appilication->Instance などのように、グローバル変数を参照するだけで済みます。
お礼
Windowsフォームアプリケーションのプロジェクトの作成は何度もやっているので少なくとも何かしない限り、下記の内容に間違いはないと思います。 また、少なくともつまり「何か」しない限り「何らか」のアクションは必要になるという事で・・・ 環境が変わる事がもしあれば役に立つかもしれません。 ありがとうございます。
- chie65536(@chie65535)
- ベストアンサー率44% (8741/19839)
>アプリケーションインスタンスのハンドルを指定する部分には何を設定すればいいのでしょうか? WinMainが書かれているソースを見てみよう。 int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { 第一引数に渡されて来ている「HINSTANCE hInstance」とは何でしょう? GetHINSTANCE()関数で、自分自身のインスタンスハンドルを取得する手もあるが、わざわざ関数で取得する必要は無い。
お礼
それが出来れば質問するには至らなかったのでしょうが MFC使うやつならあるという事を聞いた気がしますしかし VC++2008のWindowsフォームアプリケーションはC++/CLIで WinMain関数というものがありません。 int main(array<System::String ^> ^args) ってなってます。なので分かりませんでした。 出来てしまったので絶対必要ではありませんが その前提でも関数以外で取得する方法はありますか?
お礼
ありがとうございます!! 一行目に関しては、ある事に関して.NETのクラスライブラリだけでは手詰まり感が出てきたので、という意味です。 後の2行は非常に助かりました。前提となっている名前空間は System::Reflection; System::Runtime::InteropServices; ですね? 初めてWindowsAPIを使ってウインドウを表示させることができました! 気になるのですが、見落としか見方が悪いだけかもしれませんが、MSDNを見てもそれらしい事が見つかりませんでした。 これらを使用するにあたって、何らかの解放処理は必要でしょうか?