我正在尝试将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)
我想我的语法有些错误。有谁能看到这个问题?
答案 0 :(得分:2)
停止使用ExactSpelling,然后根据需要链接到GetJobA或GetJobW。
答案 1 :(得分:1)
尝试将EntryPoint设置为“GetJobA”。 GetJob实际上并不在winspool导出列表中......