c# 中调用EnumJobs时出问题,有一个参数值返回不回来,有代码,帮忙看看!

namezhu 2003-08-26 10:16:48
using System;
using System.Data;
using System.Runtime.InteropServices;

namespace EnumPrintjobstest
{
class Class1
{
[DllImport("winspool.drv",CharSet=CharSet.Auto)]
static extern bool OpenPrinter(string name,out IntPtr hPrinter, IntPtr pDefault);


[DllImport("winspool.drv",CharSet=CharSet.Auto)]
static extern bool ClosePrinter(IntPtr hPrinter);

// BOOL EnumJobs(
// HANDLE hPrinter, // handle to printer object
// DWORD FirstJob, // index of first job
// DWORD NoJobs, // number of jobs to enumerate
// DWORD Level, // information level
// LPBYTE pJob, // job information buffer
// DWORD cbBuf, // size of job information buffer
// LPDWORD pcbNeeded, // bytes received or required
// LPDWORD pcReturned // number of jobs received
// );
[DllImport("winspool.drv",CharSet=CharSet.Auto)]
// static extern bool EnumJobs(IntPtr hPrinter,int FirstJob,int NoJobs,int Level,out IntPtr pJob,int cbBuf,out int pcbNeeded,out int pcReturned);
static extern bool EnumJobs(IntPtr hPrinter,int FirstJob,int NoJobs,int Level,out IntPtr pJob,int cbBuf,out IntPtr pcbNeeded,out IntPtr pcReturned);

[STAThread]
static void Main(string[] args)
{
string PrintName="\\"+"\\"+"FRANK"+"\\"+"Epson LQ";
EnumJobs(PrintName);


// Console.Write(PrintName.ToString());
string str=Console.ReadLine();

}

private static void EnumJobs(string StrPrintName)
{
bool bRet;
int cbBuf=0;
IntPtr pPrintHand= IntPtr.Zero;
IntPtr Pdef= IntPtr.Zero;
IntPtr pJob=IntPtr.Zero;
// int dwNeeded,dwReturned;
IntPtr dwNeeded,dwReturned;

bRet = OpenPrinter(StrPrintName, out pPrintHand, Pdef);

Console.Write("PrintName:{0}\n",StrPrintName); //ok
Console.Write("PrintHand:{0}\n",pPrintHand); //ok

if (bRet)
{
if( ! EnumJobs( pPrintHand, 0, 256,1,out pJob , 0, out dwNeeded,out dwReturned ) )
{
Console.Write("dwNeeded {0}",dwNeeded); //ok
Console.Write("dwReturned {0}",dwReturned); //error dwReturned数值返回不了?应该时jobs个数
// ......
}

}
else
{
ClosePrinter(pPrintHand);
Console.Write("PrintName error");
}

ClosePrinter(pPrintHand);

}
}
}
...全文
162 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
feilong215 2003-09-01
  • 打赏
  • 举报
回复
第一次返回dwNeeded
第二次返回dwReturned


if (bRet)
{
try
{
EnumJobs( pPrintHand, 0, 256,1,pJob,0, out dwNeeded0,out dwReturned);


pJob = Marshal.AllocHGlobal(dwNeeded0);
EnumJobs( pPrintHand, 0, 256,1,pJob,dwNeeded0, out dwNeeded0,out dwReturned);
JOB_INFO_1[] jobArray = new JOB_INFO_1[dwReturned];

IntPtr current=pJob;
for (int i=0; i<jobArray.Length; i++)
{
jobArray[i] = (JOB_INFO_1) Marshal.PtrToStructure(current,typeof(JOB_INFO_1));
// current=(IntPtr)((int)current+Marshal.SizeOf(typeof(JOB_INFO_1)));

Console.WriteLine(i+": \n"+"User:"+jobArray[i].pUserName +"\n"+"PrinterName:"+jobArray[i].pPrinterName+"\n"
+"Document:"+jobArray[i].pDocument+"\n"+"Page:"+jobArray[i].TotalPages+"\n"+"MachineName:"+jobArray[i].pMachineName+"\n"+"Type:"+jobArray[i].pDatatype+"\n");
}


}
namezhu 2003-09-01
  • 打赏
  • 举报
回复
謝謝各位,我試出來了,第一次返回dwNeeded
第二次返回dwReturned
csharplove 2003-08-26
  • 打赏
  • 举报
回复
引用的每个API外部函数都应该用属性注明调用吧
[DllImport("winspool.drv",CharSet=CharSet.Auto)]
// static extern bool EnumJobs(IntPtr hPrinter,int FirstJob,int NoJobs,int Level,out IntPtr pJob,int cbBuf,out int pcbNeeded,out int pcReturned);
[DllImport("winspool.drv",CharSet=CharSet.Auto)]
static extern bool EnumJobs(IntPtr hPrinter,int FirstJob,int NoJobs,int Level,out IntPtr pJob,int cbBuf,out IntPtr pcbNeeded,out IntPtr pcReturned);
panyee 2003-08-26
  • 打赏
  • 举报
回复
在这句作个断点

if( ! EnumJobs( pPrintHand, 0, 256,1,out pJob , 0, out dwNeeded,out dwReturned ) )


一看便知
namezhu 2003-08-26
  • 打赏
  • 举报
回复
thankyou ruihuahan(飞不起来的笨鸟)
不过在vc 6,vb 6里都有返回值的啊
ruihuahan 2003-08-26
  • 打赏
  • 举报
回复
问题不在C#,在于EnumJobs这个Windows API,不是所有的返回值都有值。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧