2011-09-12 70 views
1

hereに記載されているGetJob()メソッドを呼び出そうとしています。私は呼び出しと定義の両方のルーチンの構文に問題があると思う。私は最終的に次のものをコンパイルする何かを得ました。プリンタドライバライブラリからGetJob()を呼び出すDllImport構文の問題

[DllImport(
    "winspool.drv", 
    EntryPoint = "GetJob", 
    SetLastError = true, 
    CharSet = CharSet.Ansi, 
    ExactSpelling = true, 
    CallingConvention = CallingConvention.StdCall)] 
private static extern bool GetJob 
    ([InAttribute()] IntPtr hPrinter, 
    [InAttribute()] Int32 JobId, 
    [InAttribute()] Int32 Level, 
    [OutAttribute()] out byte[] pJob, 
    [InAttribute()] Int32 cbBuf, 
    [OutAttribute()] out Int32 pcbNeeded); 

    ... 
    ... 
    ... 
    ... 

const int BUFFER_SIZE = 250; 
int pcbNeeed = 0; 

unsafe 
{ 
    byte[] byteBuffer = new byte[BUFFER_SIZE]; 

    bResult = GetJob(m_PrinterHandle, jobID, 1, out byteBuffer, BUFFER_SIZE, out pcbNeeed); 

} 

ドキュメントhereによれば、私はそれが「blittable型」であるため、特別なマーシャリングコードなし[]バイトを使用することができる必要がありそうです。いずれにしても、実行時例外が発生する:

DLL 'winspool.drv'で 'GetJob'という名前のエントリポイントを見つけることができません。私はちょうどここに間違っているいくつかの構文を持っていると思う

NQBB.Printer.PrintQueueMonitor.PrinterWatcher.GetJob(バイト[] & pJob、のInt32 cbBuf、のInt32 & pcbNeededのIntPtr hPrinter、のInt32のJobId、のInt32レベル)で 。誰もが問題を見ることができますか?

+2

「GetJobW(Unicode)およびGetJobA(ANSI)」のドキュメントにこのセクションを書き留めておきます。 'ExactSpelling = true'を使用すると、dllimportにA.P.Sを追加しないように指示します。もしあなたがそれらを侮辱しなければ、もっと喜んで助けてくれるでしょう。 –

+1

M $という言葉の使用を中止してください。それは本当に面白くないか巧妙ではありません。 –

答えて

1

EntryPointを "GetJobA"に設定してみてください。 GetJobは実際にwinspoolのエクスポートリストにはありません...

+0

うわー、それは本当に私が間違っていたことを理解しようと頭を叩くのにどれくらいの時間を費やしたのですか? >:<<しかし、ありがとうございます。 – Ultratrunks

2

ExactSpellingを使用して停止し、必要に応じてGetJobAまたはGetJobWにリンクします。

+0

これは本当に知っていると良いことですが、私はそれについても考えていませんでした。 – Ultratrunks

関連する問題