2016-09-28 61 views
-1

私はwinapiで新しく問題があります。ここに私のコードです:Winapi:PrintUIEntryがエラーコード2を返します

typedef BOOL (WINAPI *pPrintUIEntry)(HWND, HMODULE, wchar_t *, DWORD); 

printuiDll = LoadLibrary("printui.dll"); 

if (printuiDll == NULL) 
{ 
    printf("Error LoadLibrary %d.\n", GetLastError()); 

    return -1; 
} 

PrintUIEntry = (pPrintUIEntry) GetProcAddress(printuiDll, "PrintUIEntryW"); 

if (PrintUIEntry == NULL) 
{ 
    printf("Error GetProcAddress %d.\n", GetLastError()); 

    return -1; 
} 
//cmd is /ia /m "Printer" /f "C:\Program Files x86)\\drivers\Printer\Printer.inf 

if (PrintUIEntry(GetDesktopWindow(), printuiDll, cmd, SW_SHOW)) 
{ 
    printf("Error PrintUIEntry %d.\n", GetLastError()); 

    return -1; 
} 

私の大学の仕事をコードをコピーすることはできません。私が持っている問題は、PrintUIEntryが0を返し、それは私にエラーのコード2を与えるということです。私はこの機能について少し試してみましたが、私は多くを見つけることができました。あなたが手伝ってくれることを願います。ありがとう。

PS
私はチェックしてファイルが存在します。

+0

コマンドプロンプトから、 'rundll32.exe printui.dll PrintUIEntry'と入力して、期待される追加情報を確認します。それらの詳細のどれもなく直接呼び出すことができますか?あなたが渡すパラメータのドキュメントはどこにありますか?それで、なぜ地球上で、あなたはそれがすでにそれらのパラメータの1つとしてロードされているDLLのHMODULEを探していると思いますか? –

+0

私たちはあなたに何を伝えたいと思いますか?エラーはファイルが見つかりません。しかし、あなたがそれを見たので、あなたはそれを知っていました。それは関係がありますか?多分。 cmdの価値は何ですか?あなただけが知っている。 –

+0

プロセスが遠隔起動されています。私はcmdの値をチェックできません。残念です。詳細を追加します。 – Rasty

答えて

1

あなたはドキュメントを読んでいる場合:

INFO: Windows Rundll and Rundll32 Interface

Rundll32 printui.dll,PrintUIEntry

あなたはPrintUIEntryW関数ポインタのあなたの宣言が間違っていることがわかります。最も重要なことは、rundll32によって呼び出されるように設計された関数は戻り値を持たず、PrintUIEntryはエラー報告のためにSetLastError()を使用していると文書化されていません。

このような状況では、エラーチェックを行うことはできません。

  1. あなたはランダムな値EAX CPUレジスタPrintUIEntryW終了に格納することを起こるものは何でものためにチェックされることを意味し、存在しないBOOL値、をチェックしています。 PrintUIEntryWには、確認できる戻り値がありません。

  2. SetLastError()によって設定された最後のエラーコードを取得するには、GetLastError()を呼び出しています。それは文書化された動作ではないため、PrintUIEntryWのエラーと関連する場合とそうでない場合があります。たとえば、PrintUIEntryWは他のAPIを内部的に使用している可能性があります。内部的には、SetLastError()/GetLastError()が使用され、PrintUIEntryWによって内部的に処理されます。このようなエラーは、PrintUIEntryWを呼び出すコードによって解釈されるべきではありません。なぜなら、コードにはエラーを解釈するコンテキストがないからです。

この場合、この質問はHow to check the result of PrintUIEntry callの複製になります。

プリンタをインストールしようとしているので、代わりにAddPrinter()またはInstallPrinterDriverFromPackage()を使用してください。

+0

答えにはありがとうございます:) – Rasty

+0

もう1つ質問します。このようなコードを持っていますか?<< Log()<< "Before ->" << GetLastError()<< " 。の\ n "; PrintUIEntry(GetDesktopWindow()、printuiDll、CMD、SW_SHOW); ログ()<< "After ->" <<のGetLastError()<< "\ n"; ' 、それは後に '返します - > 2' – Rasty

+0

私はその答えに答えました。 –

関連する問題