dポイントプレゼントキャンペーン実施中!

WindowsAPIのCreateWindow関数を使う事は出来ますか?
(ネイティブ関連のものを使用するための設定は整っているとします。)

可能な場合、CreateWindow関数の、アプリケーションインスタンスのハンドルを指定する部分には何を設定すればいいのでしょうか?

A 回答 (4件)

# CreateWindow関数を使う必要性がわからないけど


Module^ m = Assembly::GetExecutingAssembly()->GetModules()[0];
HINSTANCE hInst= (HINSTANCE)Marshal::GetHINSTANCE(m).ToPointer();
    • good
    • 0
この回答へのお礼

ありがとうございます!!
一行目に関しては、ある事に関して.NETのクラスライブラリだけでは手詰まり感が出てきたので、という意味です。

後の2行は非常に助かりました。前提となっている名前空間は

System::Reflection;
System::Runtime::InteropServices;

ですね?
初めてWindowsAPIを使ってウインドウを表示させることができました!

気になるのですが、見落としか見方が悪いだけかもしれませんが、MSDNを見てもそれらしい事が見つかりませんでした。

これらを使用するにあたって、何らかの解放処理は必要でしょうか?

お礼日時:2009/01/19 11:28

>これらを使用するにあたって、何らかの解放処理は必要でしょうか?


おそらく何も必要ないです。

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をどこかに保管することはできるでしょう。
まぁ、前述どおり、アセンブリからとれるからまぁやらないでしょうけど。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/01/19 20:43

>int main(array<System::String ^> ^args)


>ってなってます。なので分かりませんでした。

それは変ですね。main関数の引数にアーギュメントが文字列の配列で渡されて来る宣言は、コンソールアプリケーションの場合で、Windowsフォームアプリケーションの場合、WinMainがエントリポイントになる筈です。

なので「プロジェクトのタイプを間違って新規作成した」と思います。作成した実行ファイルは、Windowsアプリケーションではなく、コンソールアプリケーションになっている筈です。

>その前提でも関数以外で取得する方法はありますか?

自身のインスタンスハンドルの取得方法は
http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?p …
の「2008/07/15(火) 15:33:42」のコメントが参考になります。

この他、処理系に依存しますが、あるC言語では、ランタイムライブラリがWinMain関数を呼び出す前に、グローバル変数「Application」のメンバ変数に色々な値をセットしてくれるので
Appilication->Instance
などのように、グローバル変数を参照するだけで済みます。
    • good
    • 0
この回答へのお礼

Windowsフォームアプリケーションのプロジェクトの作成は何度もやっているので少なくとも何かしない限り、下記の内容に間違いはないと思います。

また、少なくともつまり「何か」しない限り「何らか」のアクションは必要になるという事で・・・
環境が変わる事がもしあれば役に立つかもしれません。
ありがとうございます。

お礼日時:2009/01/19 20:42

>アプリケーションインスタンスのハンドルを指定する部分には何を設定すればいいのでしょうか?



WinMainが書かれているソースを見てみよう。

int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {

第一引数に渡されて来ている「HINSTANCE hInstance」とは何でしょう?

GetHINSTANCE()関数で、自分自身のインスタンスハンドルを取得する手もあるが、わざわざ関数で取得する必要は無い。
    • good
    • 0
この回答へのお礼

それが出来れば質問するには至らなかったのでしょうが
MFC使うやつならあるという事を聞いた気がしますしかし
VC++2008のWindowsフォームアプリケーションはC++/CLIで
WinMain関数というものがありません。

int main(array<System::String ^> ^args)

ってなってます。なので分かりませんでした。
出来てしまったので絶対必要ではありませんが
その前提でも関数以外で取得する方法はありますか?

お礼日時:2009/01/19 11:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!