我想用printui安装虚拟打印机驱动程序,但是我得到“操作无法完成(错误0x00000002)”(Os是Win7 x64)。这是因为用于签署驱动程序的证书已过期吗?还是有其他原因?如果是,那么如何获得有关错误的更多信息(我不是C程序员)?
以下是安装驱动程序的代码:
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
if (wcsstr(lpCmdLine, L"/chkxps"))
{
if (!PrinterExists(L"Microsoft XPS Document Writer"))
{
DispError(L"A MediSmart ePrinter nem telepíthető, mivel nem található XPS nyomtató a rendszerben");
return -10;
}
return 0;
}
LPWSTR printername = L"MediSmart ePrinter";
LPWSTR printername1 = L"MediSmart ePrinter - HealthFund";
LPWSTR printername2 = L"MediSmart ePrinter - B2B Electronic";
LPWSTR printername3 = L"MediSmart ePrinter - B2B Paper based";
LPWSTR portname = L"NUL:";
bool inst = wcsstr(lpCmdLine, L"/uninst") == NULL;
if (inst)
{
PRINTER_DEFAULTS pdef;
pdef.pDatatype = NULL;
pdef.pDevMode = NULL;
pdef.DesiredAccess = SERVER_ACCESS_ADMINISTER;
DWORD oneed;
DWORD err;
HANDLE hxcv;
if (!OpenPrinter(L",XcvMonitor Local Port", &hxcv, &pdef))
{
DispError(L"A virtuális nyomtató port létrehozása nem sikerült");
return -1;
}
XcvData(hxcv, L"AddPort", (LPBYTE)portname, (wcslen(portname) + 1)*2, NULL, NULL, &oneed, &err);
ClosePrinter(hxcv);
if (err && err != ERROR_ALREADY_EXISTS)
{
DispError(L"A virtuális nyomtató port létrehozása nem sikerült");
return -2;
}
}
//TODO ez nem lesz igy jo, ha majd drivert akarunk frissiteni
if (!inst || !PrinterExists(printername))
{
typedef void (CALLBACK *RunDllEntry)(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow);
HMODULE hmod = LoadLibrary(L"printui.dll");
if (!hmod)
{
DispError(L"A virtuális nyomtatót nem sikerült telepíteni: a printui.dll nem található");
return -3;
}
RunDllEntry entry = (RunDllEntry)GetProcAddress(hmod, "PrintUIEntryW");
if (!entry)
{
FreeLibrary(hmod);
DispError(L"A virtuális nyomtatót nem sikerült telepíteni: hibás printui.dll");
return -3;
}
WCHAR cmd[1000];
if (inst)
{
wsprintf(cmd, L"/if /m \"%s\" /r \"%s\" /f \"%s\\mseprinter.inf\"", printername, portname, lpCmdLine);
entry(NULL, hmod, cmd, SW_SHOW);
wsprintf(cmd, L"/if /m \"%s\" /r \"%s\" /f \"%s\\mseprinter_hf.inf\"", printername1, portname, lpCmdLine);
entry(NULL, hmod, cmd, SW_SHOW);
wsprintf(cmd, L"/if /m \"%s\" /r \"%s\" /f \"%s\\mseprinter_b2bel.inf\"", printername2, portname, lpCmdLine);
entry(NULL, hmod, cmd, SW_SHOW);
wsprintf(cmd, L"/if /m \"%s\" /r \"%s\" /f \"%s\\mseprinter_b2bpb.inf\"", printername3, portname, lpCmdLine);
entry(NULL, hmod, cmd, SW_SHOW);
}
else
{
wsprintf(cmd, L"/dl /n \"%s\"", printername);
entry(NULL, hmod, cmd, SW_SHOW);
wsprintf(cmd, L"/dl /n \"%s\"", printername1);
entry(NULL, hmod, cmd, SW_SHOW);
wsprintf(cmd, L"/dl /n \"%s\"", printername2);
entry(NULL, hmod, cmd, SW_SHOW);
wsprintf(cmd, L"/dl /n \"%s\"", printername3);
entry(NULL, hmod, cmd, SW_SHOW);
}
FreeLibrary(hmod);
}
#ifndef _DEBUG
if (inst)
RemoveDirectoryTree(lpCmdLine);
#endif
return 0;
}
答案 0 :(得分:0)
我找到了答案:我必须使用指定路径的命令参数运行它...