31

StackOverflowとGoogleで少し検索しましたが、わかりませんでした。このタイプのユーザープログラミングでアプリケーションを起動したい:

int main()
{
  Window App("Test", 640, 480);

  while(App.IsOpen())
  {
    // Do the stuff
  }
}

hInstanceただし、 andhPrevInstanceおよびその他のパラメーターを関数に渡す必要があるため、これは不可能WinMainです。実際、ウィンドウの作成を少し簡単にするために設計したWindowクラスがあります。私はSFMLでこの実装を見ましたが、それがどのようにして実現したのかわかりません。

現在、私は通常の方法を使用しています。

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR, int)
{
  Window App(hInst, hPrevInst, "Test", 640, 480);

  while(App.IsOpen())
  {
    // Do the stuff
  }
}

ありがとう。

4

4 に答える 4

46

mainMicrosoftリンカーオプションに以下を追加すると、Microsoftツールを使用する場合でも「Windows」アプリ(つまり、GUIサブシステムのWindowsアプリケーション)で標準を使用できます。

/subsystem:windows /ENTRY:mainCRTStartup

これはGNUツールチェーンには必要ないことに注意してください。

それでもMicrosoftツールの場合は、これをメインファイルに追加することもできます。

#ifdef _MSC_VER
#    pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
#endif

James McNellisが、hInstanceを取得する方法を説明します。

于 2012-08-02T21:02:43.137 に答える
21

GetModuleHandle(NULL)あなたに与えるでしょうhInstancehPrevInstance常にNULLです。

于 2012-08-02T20:28:33.813 に答える
14

まず、実行可能ファイルのモジュールハンドルを提供します。これは、の引数GetModuleHandle(0)と同じです。hInstanceWinMain

GNUツールチェーン(g ++コンパイラ)を使用すると、標準に準拠したコードで問題ありません。

ただし、Microsoftツールチェーンは、コンソールサブシステムの実行可能ファイルに対してデフォルトで標準準拠のコードのみを受け入れます。標準を使用して、この不適合ツールチェーンで実行可能なGUIサブシステムを作成するにmainは、標準を呼び出すMicrosoftランタイムライブラリエントリポイントmain、つまりを指定する必要がありますmainCRTStartup。コマンドライン呼び出しの場合、これは…

cl myApp.cpp /link /entry:mainCRTStartup /subsystem:windows user32.lib

実際問題として、コマンドラインで作業する場合は、LINK環境変数でエントリポイントを指定するだけです。

set LINK=/entry:mainCRTStartup

cl myApp.cpp /link /subsystem:windows user32.lib

一部のVisualStudioプロジェクトタイプ(主にMFC)では、Microsoftの非標準WinMainまたはを使用する必要があるため、VisualStudio用に同様の標準準拠のセットアップを作成することはおそらく望ましくありませんwWinMain

于 2012-08-02T21:04:54.027 に答える
5

hInstanceこれは、「グローバル変数を使用しない」という経験則の1つの例外です。通常、モジュール全体のスコープを持つ変数は実際には論理的にありません。hInstanceただし、定義上、正確にモジュール全体のスコープを持っているため、実際に最も論理的な解決策は、そのグローバル変数を作成し、で初期化することですWinMain

他の人が示唆しているように、を使用することもできますGetModuleHandle(NULL)

于 2012-08-02T21:10:54.113 に答える