DeviceCapabilities生成错误:数据无效
本文关键字:数据 无效 错误 DeviceCapabilities | 更新日期: 2023-09-27 18:21:31
我想获得打印机的纸张来源、纸张大小等列表。我从http://www.pinvoke.net/default.aspx/Enums/DeviceCapabilities.html?diff=y代码有时有效,有时无效。问题是DeviceCapabilities(DeviceName,strPort,DeviceCapabibiliesFlags.DC_BINNAMES,(IntPtr)null,(IntPtr)null)返回-1。最后一个错误是"数据无效"重新启动计算机可能无法解决问题。一旦遇到问题,下次也许可以,也许不可以。
那么这里的问题是什么呢?
ArrayList arrBinName;
string sError = "";
GetBins("''Lindy-PC.MyCpmpany.local'HP LaserJet 4000 Series PCL 5", "LPT1", out arrBinName, out sError);
public static bool GetBins(string DeviceName, string strPort, out ArrayList BinName, out string strError)
{
strError = "";
BinName = new ArrayList();
IntPtr pAddr = default(IntPtr);
int offset = 0;
int nRes = DeviceCapabilities(DeviceName, strPort, DeviceCapabilitiesFlags.DC_BINNAMES, (IntPtr)null, (IntPtr)null); //Returns -1
if (nRes >= 0)
{
try
{
pAddr = Marshal.AllocHGlobal((int)nRes * 24);
nRes = DeviceCapabilities(DeviceName, strPort, DeviceCapabilitiesFlags.DC_BINNAMES, pAddr, (IntPtr)null);
if (nRes < 0)
{
strError = new Win32Exception(Marshal.GetLastWin32Error()).Message + "[" + DeviceName + ": " + strPort + ".DC_BINNAMES]";
return false;
}
offset = pAddr.ToInt32();
for (int i = 0; i < nRes; i++)
{
BinName.Add(Marshal.PtrToStringAnsi(new IntPtr(offset + i * 24)));
}
}
finally
{
Marshal.FreeHGlobal(pAddr);
}
}
else
strError = new Win32Exception(Marshal.GetLastWin32Error()).Message + "[" + DeviceName + ": " + strPort + ".DC_BINNAMES]";
return true;
}
正如aggaton在评论中提到的,DeviceCapabilities
在某些情况下需要两个调用,检索bin名称就是其中之一。您应该首先阅读DeviceCapabilities的文档。
然后返回并查看您使用的示例代码。您遗漏了一个关键步骤:
// BinNames
nRes = DeviceCapabilities(strDeviceName, strPort, DeviceCapabilitiesFlags.DC_BINNAMES, (IntPtr)null, (IntPtr)null);
pAddr = Marshal.AllocHGlobal((int)nRes * 24);
nRes = DeviceCapabilities(strDeviceName, strPort, DeviceCapabilitiesFlags.DC_BINNAMES, pAddr, (IntPtr)null);
if(nRes < 0)
{
strError = new Win32Exception(Marshal.GetLastWin32Error()).Message + "["+ strDeviceName +": "+ strPort +"]";
return false;
}
请注意,在该代码中有三个对DeviceCapabilities
的调用。你需要这三个。(我认为通过让每个调用都有一行单独的代码,代码会更清晰,但这是一个风格问题。)DeviceCapabilities
的文档加上上面的示例代码应该会让你回到正轨。