gosoft
驱动牛犊
驱动牛犊
  • 注册日期2003-03-02
  • 最后登录2007-07-30
  • 粉丝1
  • 关注0
  • 积分230分
  • 威望25点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
阅读:6785回复:18

自写打印驱动,问题得到初步解决

楼主#
更多 发布于:2005-07-06 14:19
大家好,我终于找到错误的原因了,在DrvDocumentPropertySheets函数中,当pPSUIInfo参数为空,且
fMode为0时,DrvDocumentPropertySheets函数的返回值必须是定义的DEVMODE的大小,而不是1。

谢谢各位!当我把这个程序写好后,如果有可能(毕竟产权不是我的)我会公布一个比较简单的源码的。



但是使用自己写的驱动打印的黑白图形没有使用windows提供的驱动打印的清晰,
这是什么原因????需要调整什么样的参数????

上面这里两幅图片,分别是用我写的驱动、windows的Unidrv驱动打印的测试页面,
注意两个图片的windows图标,清晰程度不一样;而且有些字体也能正确的打印出来,
显示的是黑色的方块或者是黑色的长条.


以前发的内容:
---------------------------------------------------------------------------------------------  
请写过图形驱动的,帮我看看,我的代码主要的错误再那里.(还没完全完成)

这是一个windows2000,的虚拟打印驱动;很简单的打印驱动,完成黑白打印,分辨率200dpi,A4纸张,可以安装windows2000中,代码没有完全完成。

不过基本的骨架有了;安装windows2000中,查看打印机属性的时候,会显示explorer.exe非法操作,引起explorer.exe进程死了。

查了好久实在是能力有限,不知那里出了问题;请高人帮忙;这个档了我很久了。 拜托!!!!!

附件中是源码(有BUG的源码),请看看。用DDK编译

最新喜欢:

xmuhlxmuhl
caesun
驱动小牛
驱动小牛
  • 注册日期2001-12-10
  • 最后登录2006-12-01
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望30点
  • 贡献值393点
  • 好评度21点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-07-16 08:25
有空再帮你看
caesun
驱动小牛
驱动小牛
  • 注册日期2001-12-10
  • 最后登录2006-12-01
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望30点
  • 贡献值393点
  • 好评度21点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-07-18 05:38
ui dll 应该都是 COM接口的  是不是和这个有关系?
gosoft
驱动牛犊
驱动牛犊
  • 注册日期2003-03-02
  • 最后登录2007-07-30
  • 粉丝1
  • 关注0
  • 积分230分
  • 威望25点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-07-18 09:35
ui dll是不用COM接口的,它导出的是一些WINAPI(APIENTRY)风格的函数,使用的COM风格的UIDLL是客户对Microsoft提供的UniDriver打印打印驱动的定制。而我这个驱动不是对Microsoft的UniDriver的定制,而是完全由自己实现的。
gosoft
驱动牛犊
驱动牛犊
  • 注册日期2003-03-02
  • 最后登录2007-07-30
  • 粉丝1
  • 关注0
  • 积分230分
  • 威望25点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-07-18 09:39
这里先道歉:好几天没来了,因为公司有点其它事情,所以没时间来;对不起啊!!!!!!!
villein
驱动牛犊
驱动牛犊
  • 注册日期2002-08-04
  • 最后登录2010-12-05
  • 粉丝2
  • 关注1
  • 积分63分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
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;

}

这段代码是我的,你的代码我没怎么看,很可能就是这里有问题
gosoft
驱动牛犊
驱动牛犊
  • 注册日期2003-03-02
  • 最后登录2007-07-30
  • 粉丝1
  • 关注0
  • 积分230分
  • 威望25点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-07-19 17:53
villein : 先谢谢您的代码;我再结合你的代码看看。以后还要多多向您请教呢!!!!!!!
qynum123
驱动牛犊
驱动牛犊
  • 注册日期2005-06-23
  • 最后登录2005-07-26
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-07-20 10:32
请问各位大侠,Windows的UniDrv驱动需要编写UI和UNI,为什么在打印机上点属性的时候, 驱动既调入UI又调入UNI呢?而且是调用了UNI的EnableDriver和EnablePDEV这两个函数,哪位能解释一下,驱动启动调用的COM函数的顺序并说明原因?在这里先谢了,我的MSN:qynum123@hotmail.com,欢迎大家共同交流.
gosoft
驱动牛犊
驱动牛犊
  • 注册日期2003-03-02
  • 最后登录2007-07-30
  • 粉丝1
  • 关注0
  • 积分230分
  • 威望25点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
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函数的参数返回的
gosoft
驱动牛犊
驱动牛犊
  • 注册日期2003-03-02
  • 最后登录2007-07-30
  • 粉丝1
  • 关注0
  • 积分230分
  • 威望25点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-08-03 10:37
大家好,我终于找到错误的原因了,在DrvDocumentPropertySheets函数中,当pPSUIInfo参数为空,且
fMode为0时,DrvDocumentPropertySheets函数的返回值必须是定义的DEVMODE的大小,而不是1。

谢谢各位!当我把这个程序写好后,如果有可能(毕竟产权不是我的)我会公布一个比较简单的源码的。
gosoft
驱动牛犊
驱动牛犊
  • 注册日期2003-03-02
  • 最后登录2007-07-30
  • 粉丝1
  • 关注0
  • 积分230分
  • 威望25点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-08-05 15:59
是不是要再DrvEnablePDEV返回的参数DEVINFO,GDIINFO结构中的值要改变???
dlzzl
驱动牛犊
驱动牛犊
  • 注册日期2007-03-04
  • 最后登录2007-03-05
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望6点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-03-04 17:29
寻设备驱动程序开发高手,

我有一台设备(类似打印机),需要开发驱动程序,要求该程序通过专业打印软件,及专用PCI卡,控制该设备,
能开发的请与联系,限杭州或上海工程师,有意者QQ:43771954 13336106912 占先生联系
xukaiyang
驱动牛犊
驱动牛犊
  • 注册日期2007-06-18
  • 最后登录2007-08-31
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-08-09 10:16
源码也给我一份,我的油箱是xky841012@163.com
 我请教个问题:
请问在ui或uni中设置自定义纸张的宽度和高度,要在个函数做,怎么做,你知道吗?
我也是正在写unidrv的驱动,我写了一个GPD,然后又看了ui和uni.dll的源码,但是就是不知道自定义纸张要在哪里设置,看样子应该是在DEVMODE结构中设置,但是不知道要在哪个函数中设置,又是怎么设置,如果是在reset函数中设置,但这个函数又没有被执行到。
在devmode函数中设置也不能设置成功,在DocumentPropertySheets或是hrOEMDocumentPropertySheets中设置,好像也是不行,所以我都搞的很晕了。
lijinxi
驱动牛犊
驱动牛犊
  • 注册日期2007-07-29
  • 最后登录2009-04-07
  • 粉丝1
  • 关注0
  • 积分42分
  • 威望67点
  • 贡献值21点
  • 好评度51点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-08-09 13:16
也给我一份好么?sanfenxiao@hotmail.com
技术人,用真名,李金喜向你问好.
xukaiyang
驱动牛犊
驱动牛犊
  • 注册日期2007-06-18
  • 最后登录2007-08-31
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2007-08-15 16:07
难道这里没有高手吗?哦,天下要完了哦。
xukaiyang
驱动牛犊
驱动牛犊
  • 注册日期2007-06-18
  • 最后登录2007-08-31
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2007-08-15 16:08
难道都那么吝啬,不想讲吗?
icboy591
驱动牛犊
驱动牛犊
  • 注册日期2009-05-26
  • 最后登录2010-04-13
  • 粉丝16
  • 关注1
  • 积分64分
  • 威望611点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2009-10-26 13:32

我看了头疼
但还有人觉得这里没高手
到底高手是什么样的
asdf2008
驱动牛犊
驱动牛犊
  • 注册日期2009-11-19
  • 最后登录2013-11-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望31点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2009-11-19 14:44
re

THANKS!
kingmax5421
驱动牛犊
驱动牛犊
  • 注册日期2008-11-13
  • 最后登录2015-06-17
  • 粉丝1
  • 关注0
  • 积分63分
  • 威望502点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2009-12-24 06:45
也给我一份好么?kingmax5421#gmail.com (@代替#)
游客

返回顶部