• ベストアンサー

VC++2008のWindowsフォームアプリケーションで

WindowsAPIのCreateWindow関数を使う事は出来ますか? (ネイティブ関連のものを使用するための設定は整っているとします。) 可能な場合、CreateWindow関数の、アプリケーションインスタンスのハンドルを指定する部分には何を設定すればいいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

# CreateWindow関数を使う必要性がわからないけど Module^ m = Assembly::GetExecutingAssembly()->GetModules()[0]; HINSTANCE hInst= (HINSTANCE)Marshal::GetHINSTANCE(m).ToPointer();

LongSecret
質問者

お礼

ありがとうございます!! 一行目に関しては、ある事に関して.NETのクラスライブラリだけでは手詰まり感が出てきたので、という意味です。 後の2行は非常に助かりました。前提となっている名前空間は System::Reflection; System::Runtime::InteropServices; ですね? 初めてWindowsAPIを使ってウインドウを表示させることができました! 気になるのですが、見落としか見方が悪いだけかもしれませんが、MSDNを見てもそれらしい事が見つかりませんでした。 これらを使用するにあたって、何らかの解放処理は必要でしょうか?

その他の回答 (3)

回答No.4

>これらを使用するにあたって、何らかの解放処理は必要でしょうか? おそらく何も必要ないです。 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をどこかに保管することはできるでしょう。 まぁ、前述どおり、アセンブリからとれるからまぁやらないでしょうけど。

LongSecret
質問者

お礼

・・・そうですか。 安心しました。 ご丁寧にありがとうございます。

回答No.3

>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 などのように、グローバル変数を参照するだけで済みます。

LongSecret
質問者

お礼

Windowsフォームアプリケーションのプロジェクトの作成は何度もやっているので少なくとも何かしない限り、下記の内容に間違いはないと思います。 また、少なくともつまり「何か」しない限り「何らか」のアクションは必要になるという事で・・・ 環境が変わる事がもしあれば役に立つかもしれません。 ありがとうございます。

回答No.2

>アプリケーションインスタンスのハンドルを指定する部分には何を設定すればいいのでしょうか? WinMainが書かれているソースを見てみよう。 int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { 第一引数に渡されて来ている「HINSTANCE hInstance」とは何でしょう? GetHINSTANCE()関数で、自分自身のインスタンスハンドルを取得する手もあるが、わざわざ関数で取得する必要は無い。

LongSecret
質問者

お礼

それが出来れば質問するには至らなかったのでしょうが MFC使うやつならあるという事を聞いた気がしますしかし VC++2008のWindowsフォームアプリケーションはC++/CLIで WinMain関数というものがありません。 int main(array<System::String ^> ^args) ってなってます。なので分かりませんでした。 出来てしまったので絶対必要ではありませんが その前提でも関数以外で取得する方法はありますか?

関連するQ&A