2016-04-18 4 views
0

単純なGDI +プログラムをテストしようとしましたが、初期化できませんでした。 GdiplusStartupは2を返します。これは「無効なパラメータ」を意味します。デバッグモードでは、GdiplusStartupInput startInputが初期化されている(GdiplusVersion = 1 ....など)ことがわかりますので問題ありません。Visual C++ GDI +質問:GdiplusStartupは常に2を返します(無効なパラメーター)

#include <windows.h> 
#include "resource.h" 
#include <iostream> 
#include <string> 
#include <sstream> 
#include <gdiplus.h> 

using namespace Gdiplus; 
#pragma comment (lib,"Gdiplus.lib") 

BOOL CALLBACK DialogProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { 
.... some code here .... 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { 
    GdiplusStartupInput startInput; 
    ULONG_PTR* gdiToken = 0; 

    Gdiplus::Status status = Gdiplus::GdiplusStartup(gdiToken, &startInput, NULL); 
    return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc); 
} 

おかげ

答えて

3

最初の引数が間違っています。 documentationは次のように記述します。

トークンを受け取るULONG_PTRへのポインタ。

しかし、nullポインタを渡しています。次のようにコードを変更してください:

GdiplusStartupInput startInput; // use default constructor to initialize struct 
ULONG_PTR gdiToken; 
Gdiplus::Status status = Gdiplus::GdiplusStartup(&gdiToken, &startInput, NULL); 
+0

「= 0」の削除が機能します!ありがとうございました。 – ngamc

+1

さて、それ以上のことがあります。私の答えのコードをもう一度読んでください。問題のコードのように 'gdiToken'を' ULONG_PTR'ではなく 'ULONG_PTR'と宣言する必要があります。これは非常によくある間違いであり、あなたがそれを理解して、あなたがそれを再確認しないように認識しておく必要があります。もちろん、あなたのコードではない 'startInput'を初期化する必要があります。 –

+0

私が間違っていない場合は、MSDN [link](https://msdn.microsoft.com/en-us/library/windows/desktop/ms534067(v = vs.85).aspx)に従ってGdiplusStartupInputにコンストラクタがあり、それを初期化します。デフォルトでは、GdiplusVersionは1です。 – ngamc