2011-09-12 1 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 (IntPtr입니다 hPrinter, INT32 작업 ID, INT32 수준, 바이트 [] & pJob, INT32 cbBuf, INT32 & pcbNeeded)

에서 는 난 그냥 잘못 여기에 몇 가지 구문을 가지고 생각합니다. 누구든지 문제를 볼 수 있습니까?

+2

"GetJobW (유니 코드) 및 GetJobA (ANSI)"설명서에서이 절을 참고하십시오. 'ExactSpelling = true'를 사용하면 dllimport가 A.P.S.을 추가하지 않도록 지시합니다. 모욕하지 않으면 사람들이 더 기꺼이 도움을받을 것입니다. –

+1

M $라는 용어 사용을 중단하십시오. 정말 재밌거나 똑똑하지 않습니다. –

답변

1

EntryPoint를 "GetJobA"로 설정해보십시오. GetJob은 실제로 winspool 내보내기 목록에 없습니다 ...

+0

와우, 내가 뭘 잘못했는지 알아 내려고 노력하면서 얼마나 많은 시간을 내 머리에 부딪히는 지 보냈어. > : - <하지만 고맙습니다. – Ultratrunks

2

ExactSpelling을 사용을 중지 한 다음 적절하게 GetJobA 또는 GetJobW에 연결합니다.

+0

이것은 정말 좋은 사실입니다. 나는 그것에 대해서도 생각조차하지 않았습니다. – Ultratrunks

관련 문제