Проблема с синтаксисом DllImport, вызывающим GetJob () из библиотеки драйвера принтера - PullRequest
1 голос
/ 12 сентября 2011

Я пытаюсь вызвать документированный метод GetJob () здесь . Я думаю, что сейчас у меня проблемы с синтаксисом процедуры, как вызовом, так и определением. Наконец-то у меня есть что скомпилировать.

[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);

}

В соответствии с документацией здесь кажется, что я должен иметь возможность использовать байт [] без какого-либо специального кода маршалинга, потому что он "blittable". В любом случае я получаю исключение во время выполнения, которое говорит:

Невозможно найти точку входа с именем «GetJob» в DLL «winspool.drv». at NQBB.Printer.PrintQueueMonitor.PrinterWatcher.GetJob (IntPtr hPrinter, Int32 JobId, Int32 Level, Byte [] & pJob, Int32 cbBuf, Int32 & pcbNeeded)

Я думаю, что у меня просто неправильный синтаксис здесь. Кто-нибудь может увидеть проблему?

Ответы [ 2 ]

2 голосов
/ 13 сентября 2011

Прекратите использовать ExactSpelling, после чего вы будете ссылаться на GetJobA или GetJobW в зависимости от ситуации.

1 голос
/ 12 сентября 2011

Попробуйте установить EntryPoint для «GetJobA». GetJob фактически отсутствует в списке экспорта winspool ...

...