DllImport语法从打印机驱动程序库调用GetJob()时出现问题

时间:2011-09-12 19:30:26

标签: c# marshalling dllimport

我正在尝试将GetJob()方法调用为here。我认为我现在遇到了例程的语法问题,包括调用和定义。我终于得到了一些可以编译的东西。

[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,似乎我应该能够使用byte []而没有任何特殊的编组代码,因为它是“blittable”。无论如何,我得到一个运行时异常,说:

  

无法在DLL“winspool.drv”中找到名为“GetJob”的入口点。      在NQBB.Printer.PrintQueueMonitor.PrinterWatcher.GetJob(IntPtr hPrinter,Int32 JobId,Int32 Level,Byte []& pJob,Int32 cbBuf,Int32& pcbNeeded)

我想我的语法有些错误。有谁能看到这个问题?

2 个答案:

答案 0 :(得分:2)

停止使用ExactSpelling,然后根据需要链接到GetJobA或GetJobW。

答案 1 :(得分:1)

尝试将EntryPoint设置为“GetJobA”。 GetJob实际上并不在winspool导出列表中......