阅读:6785回复:18
自写打印驱动,问题得到初步解决
大家好,我终于找到错误的原因了,在DrvDocumentPropertySheets函数中,当pPSUIInfo参数为空,且
fMode为0时,DrvDocumentPropertySheets函数的返回值必须是定义的DEVMODE的大小,而不是1。 谢谢各位!当我把这个程序写好后,如果有可能(毕竟产权不是我的)我会公布一个比较简单的源码的。 但是使用自己写的驱动打印的黑白图形没有使用windows提供的驱动打印的清晰, 这是什么原因????需要调整什么样的参数???? 上面这里两幅图片,分别是用我写的驱动、windows的Unidrv驱动打印的测试页面, 注意两个图片的windows图标,清晰程度不一样;而且有些字体也能正确的打印出来, 显示的是黑色的方块或者是黑色的长条. 以前发的内容: --------------------------------------------------------------------------------------------- 请写过图形驱动的,帮我看看,我的代码主要的错误再那里.(还没完全完成) 这是一个windows2000,的虚拟打印驱动;很简单的打印驱动,完成黑白打印,分辨率200dpi,A4纸张,可以安装windows2000中,代码没有完全完成。 不过基本的骨架有了;安装windows2000中,查看打印机属性的时候,会显示explorer.exe非法操作,引起explorer.exe进程死了。 查了好久实在是能力有限,不知那里出了问题;请高人帮忙;这个档了我很久了。 拜托!!!!! 附件中是源码(有BUG的源码),请看看。用DDK编译 |
|
最新喜欢:xmuhl |
沙发#
发布于:2005-07-16 08:25
有空再帮你看
|
|
板凳#
发布于:2005-07-18 05:38
ui dll 应该都是 COM接口的 是不是和这个有关系?
|
|
地板#
发布于:2005-07-18 09:35
ui dll是不用COM接口的,它导出的是一些WINAPI(APIENTRY)风格的函数,使用的COM风格的UIDLL是客户对Microsoft提供的UniDriver打印打印驱动的定制。而我这个驱动不是对Microsoft的UniDriver的定制,而是完全由自己实现的。
|
|
地下室#
发布于:2005-07-18 09:39
这里先道歉:好几天没来了,因为公司有点其它事情,所以没时间来;对不起啊!!!!!!!
|
|
5楼#
发布于:2005-07-19 13:55
LONG DrvDevicePropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam)
{ PDEVICEPROPERTYHEADER pDPHdr; PROPSHEETPAGE *pdevPage; PUIDATA pUiData; LONG result; TRACEDDIENTRY("DrvDevicePropertySheets"); if (!pPSUIInfo || !(pDPHdr = (PDEVICEPROPERTYHEADER) pPSUIInfo->lParamInit)) { Assert(FALSE); return -1; } pUiData = (pPSUIInfo->Reason == PROPSHEETUI_REASON_INIT) ? FillUiData(pDPHdr->hPrinter, NULL) : (PUIDATA) pPSUIInfo->UserData; if (! ValidUiData(pUiData)) return -1; switch (pPSUIInfo->Reason) { case PROPSHEETUI_REASON_INIT: pUiData->bPermission = ((pDPHdr->Flags & DPS_NOPERMISSION) == 0); pUiData->pfnComPropSheet = pPSUIInfo->pfnComPropSheet; pUiData->hComPropSheet = pPSUIInfo->hComPropSheet; pdevPage = HEAPALLOC(pUiData->hheap, sizeof(PROPSHEETPAGE)); memset(pdevPage, 0, sizeof(PROPSHEETPAGE)); pdevPage->dwSize = sizeof(PROPSHEETPAGE); pdevPage->dwFlags = PSP_DEFAULT; pdevPage->hInstance = ghInstance; pdevPage->pszTemplate = MAKEINTRESOURCE(IDD_DIALOG_ABOUT); pdevPage->pfnDlgProc = (DLGPROC) DevicePropPageProc; pdevPage->lParam = (DWORD) pUiData; if (pUiData->pfnComPropSheet(pUiData->hComPropSheet, CPSFUNC_ADD_PROPSHEETPAGE, (LPARAM) pdevPage, (LPARAM) 0)) { pPSUIInfo->UserData = (DWORD) pUiData; pPSUIInfo->Result = CPSUI_CANCEL; return 1; } HEAPDESTROY(pUiData->hheap); break; case PROPSHEETUI_REASON_GET_INFO_HEADER: { PPROPSHEETUI_INFO_HEADER pPSUIHdr; pPSUIHdr = (PPROPSHEETUI_INFO_HEADER) lParam; pPSUIHdr->Flags = PSUIHDRF_PROPTITLE | PSUIHDRF_NOAPPLYNOW; pPSUIHdr->pTitle = pDPHdr->pszPrinterName; pPSUIHdr->hInst = ghInstance; //pPSUIHdr->IconID = IDI_CPSUI_POSTSCRIPT; } return 1; case PROPSHEETUI_REASON_SET_RESULT: pPSUIInfo->Result = ((PSETRESULT_INFO) lParam)->Result; return 1; case PROPSHEETUI_REASON_DESTROY: HEAPDESTROY(pUiData->hheap); return 1; } return -1; } 这段代码是我的,你的代码我没怎么看,很可能就是这里有问题 |
|
6楼#
发布于:2005-07-19 17:53
villein : 先谢谢您的代码;我再结合你的代码看看。以后还要多多向您请教呢!!!!!!!
|
|
7楼#
发布于:2005-07-20 10:32
请问各位大侠,Windows的UniDrv驱动需要编写UI和UNI,为什么在打印机上点属性的时候, 驱动既调入UI又调入UNI呢?而且是调用了UNI的EnableDriver和EnablePDEV这两个函数,哪位能解释一下,驱动启动调用的COM函数的顺序并说明原因?在这里先谢了,我的MSN:qynum123@hotmail.com,欢迎大家共同交流.
|
|
8楼#
发布于:2005-07-21 08:51
qynum123:
你为windows的UniDrv驱动编写的COM组件,分别被User Interface DLL(unidrvui.dll)和Graphic DLL(unidrv.dll)调用,COM组件中的方法,多数分别对应于DDK文档中说明的这两个DLL的导出函数。点打印机属性的时候UniDrv。dll中调用的顺序是(EnableDriver、EnablePDEV)就调用这两个函数来查询打印机的属性等,是由EnablePDEV函数的参数返回的 |
|
9楼#
发布于:2005-08-03 10:37
大家好,我终于找到错误的原因了,在DrvDocumentPropertySheets函数中,当pPSUIInfo参数为空,且
fMode为0时,DrvDocumentPropertySheets函数的返回值必须是定义的DEVMODE的大小,而不是1。 谢谢各位!当我把这个程序写好后,如果有可能(毕竟产权不是我的)我会公布一个比较简单的源码的。 |
|
10楼#
发布于:2005-08-05 15:59
是不是要再DrvEnablePDEV返回的参数DEVINFO,GDIINFO结构中的值要改变???
|
|
11楼#
发布于:2007-03-04 17:29
寻设备驱动程序开发高手,
我有一台设备(类似打印机),需要开发驱动程序,要求该程序通过专业打印软件,及专用PCI卡,控制该设备, 能开发的请与联系,限杭州或上海工程师,有意者QQ:43771954 13336106912 占先生联系 |
|
12楼#
发布于:2007-08-09 10:16
源码也给我一份,我的油箱是xky841012@163.com
我请教个问题: 请问在ui或uni中设置自定义纸张的宽度和高度,要在个函数做,怎么做,你知道吗? 我也是正在写unidrv的驱动,我写了一个GPD,然后又看了ui和uni.dll的源码,但是就是不知道自定义纸张要在哪里设置,看样子应该是在DEVMODE结构中设置,但是不知道要在哪个函数中设置,又是怎么设置,如果是在reset函数中设置,但这个函数又没有被执行到。 在devmode函数中设置也不能设置成功,在DocumentPropertySheets或是hrOEMDocumentPropertySheets中设置,好像也是不行,所以我都搞的很晕了。 |
|
13楼#
发布于:2007-08-09 13:16
也给我一份好么?sanfenxiao@hotmail.com
|
|
|
14楼#
发布于:2007-08-15 16:07
难道这里没有高手吗?哦,天下要完了哦。
|
|
15楼#
发布于:2007-08-15 16:08
难道都那么吝啬,不想讲吗?
|
|
16楼#
发布于:2009-10-26 13:32
我看了头疼 但还有人觉得这里没高手 到底高手是什么样的 |
|
17楼#
发布于:2009-11-19 14:44
re
THANKS! |
|
18楼#
发布于:2009-12-24 06:45
也给我一份好么?kingmax5421#gmail.com (@代替#)
|
|