推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
iMath
V2EX  ›  Python

悬赏至少 50 元,求帮忙 C++调用 dll 的方式转成 Python

  •  
  •   iMath · Jul 25, 2018 · 9009 views
    This topic created in 3022 days ago, the information mentioned may be changed or developed.
    主要是想通过 Python 使用 WCaptureX.dll 里面的函数,涉及到的 dll 可以到这个软件的安装目录获取
    https://wordweb.info/free/
    这里提供了 C++调用 dll 的方法
    https://sites.google.com/a/deskperience.com/wordcapturexdoc/deployment/using-native-dlls---no-com
    另外的一些相关文档
    函数文档 https://sites.google.com/a/deskperience.com/wordcapturexdoc/wcapturex/wcapturex-interface/capture-method
    例子 https://sites.google.com/a/deskperience.com/wordcapturexdoc/wcapturex/wcapturex-interface/capture-method/visual-c

    是否有高手愿意帮忙把这个方法转成 Python 的,指导下我如何使用?为了表示诚意,我愿意出至少 50 元,大家先别嫌少,如果确实能搞定,我愿意再加点,谢谢各位!

    我折腾出这种来,貌似也还是不知道怎么用
    from ctypes import *
    # help(cdll.WCaptureX.CreateCOMObject)
    print(cdll.WCaptureX.CreateCOMObject)
    Supplement 1  ·  Jul 25, 2018
    关键是我也还是个学生,没开始工作赚钱,所以给不了太多,并没有贬低技术价值的意思。
    Supplement 2  ·  Jul 25, 2018
    对于这种问题不给点 money 让人家白白帮我,我觉得也是不现实,但是学生党又拿不出多少来……
    Supplement 3  ·  Jul 26, 2018
    谈钱伤感情,我错了,各位!
    70 replies  •  2018-07-31 14:58:55 +08:00
    huclengyue
    huclengyue
    Jul 25, 2018 via Android❤️7
    1
    50 太多了,从没做过这么大的项目。。怎么办。
    RoyLeong
    RoyLeong
    Jul 25, 2018❤️5
    2
    我看成了 50w,抱歉,打扰了
    Antidictator
    Antidictator
    Jul 25, 2018❤️6
    3
    如果是以技术讨论的形式询问不但不会让人反感,而且说请喝星巴克的话不仅成本会降低而且有更多人愿意帮忙。而不是给人这种你的工作量只值 50 块钱的感觉。
    FanWall
    FanWall
    Jul 25, 2018 via Android
    4
    自行检索 python win32com
    keramist
    keramist
    Jul 25, 2018 via Android
    5
    看来技术真的不值钱 所以你自己弄吧
    Eugene1024
    Eugene1024
    Jul 25, 2018
    6
    技术看来真的不值钱了 +1
    ayyll
    ayyll
    Jul 25, 2018 via Android
    7
    曾经有过 mfc 转成 py 的经历。。不难吧 你搜搜 复制粘贴巴拉巴拉就完了
    keysona
    keysona
    Jul 25, 2018
    8
    不好意思,我膨胀了....
    beginor
    beginor
    Jul 25, 2018 via Android
    9
    @RoyLeong 我以为就我一个看成 50 万 🤣
    FanWall
    FanWall
    Jul 25, 2018 via Android❤️5
    10
    @FanWall #4

    因为这是**组件对象模型**而不是 DLL,调用的是接口,你应该也可以通过 win32api 实现,但既然用 Python 了,为简单计,依然推荐 win32com

    这有啥嘲讽的,这也算值钱的技术?建议楼主去网上找点开发互助群加一加,问基础问题这类群里比较友好,v2ex 适合分手了来问情感问题。
    Beebird
    Beebird
    Jul 25, 2018
    11
    哈哈,看评论乐了。不过我正好有个例子不知道楼主用不用得上 @iMath https://gist.github.com/beebird/9c37adf19a8436ccdd264a9beb09a8d1
    realpg
    realpg
    Jul 25, 2018
    12
    50 太多了,怕干不好当不起啊
    iMath
    iMath
    OP
    Jul 25, 2018
    13
    @Antidictator 对于这种问题不给点 money 让人家白白帮我,我觉得也是不现实,但是学生党又拿不出多少来……
    iMath
    iMath
    OP
    Jul 25, 2018
    14
    @FanWall @ayyll
    谢谢指教!
    我主要是看不懂那些 C++代码,所以就是用上 pywin32 也无从下手,更别提调用这个 dll 里面的函数了。能否 show some code ?谢谢
    yangguoshuai
    yangguoshuai
    Jul 25, 2018 via Android
    15
    @iMath 楼主很隐晦的说大家 talk is cheap。。
    iMath
    iMath
    OP
    Jul 25, 2018
    16
    @Beebird 谢谢!
    和你的代码类似的例子之前我也看过几个,但我主要是看不懂那些 C++代码,所以也就无从下手了
    ftdejo
    ftdejo
    Jul 25, 2018
    17
    https://stackoverflow.com/questions/252417/how-can-i-use-a-dll-file-from-python
    善用谷歌和 Stack Overflow,说实话你这个 50 块是在侮辱你自己的信息获取能力··
    FanWall
    FanWall
    Jul 25, 2018 via Android
    18
    @iMath #14

    手头只有爪机,你就只百度 Python win32com 就有例子了

    https://www.cnblogs.com/jasonli-01/articles/6612020.html

    为了更方便,可以先用 regsvr32 注册一下 DLL
    mritd
    mritd
    Jul 25, 2018 via iPhone❤️5
    19
    你知道,这个帖子最大的败笔是什么么?

    如果只是纯技术请教就别谈钱,会的自然告诉你

    如果是外包项目就别扯太多技术,更别提整个 50 块钱的事

    你说会的人告诉你了,这 50 要还是不要?

    要: 打发要饭呢?
    不要: 有偿的操作,当外包干的,还得顶着心里压力,不要就亏了
    sagaxu
    sagaxu
    Jul 25, 2018 via Android
    20
    50 还不够中饭点个外卖
    prolic
    prolic
    Jul 25, 2018 via Android❤️6
    21
    要是标题没悬赏下面回复就是“课后作业自己做”,“知识付费”乱七八糟的了,合着 v2 一群外包接单的
    xuegj1010
    xuegj1010
    Jul 25, 2018
    22
    技术无价,你这 50 块钱是在侮辱各位大佬。。。
    liuminghao233
    liuminghao233
    Jul 25, 2018 via iPhone
    23
    我觉得搞计算机的
    花钱让别人帮忙写自己的 project
    是一种侮辱自己的行为
    yankebupt
    yankebupt
    Jul 25, 2018
    24
    FanWell 正解...
    刚想说为啥那么多 wrapper 不用,看了一眼链接发现 COM 的...
    微软亲自挖坑咱也没啥可说的...
    17 楼那个 stackoverflow 最高票数 ctype 答案有可能不能用,但是楼层里 win32com 那个可能可以用...
    agee
    agee
    Jul 25, 2018 via iPhone
    25
    貌似问题是没错,错在了提钱,还提个 50 块,哈哈
    iMath
    iMath
    OP
    Jul 25, 2018
    26
    @FanWall @yankebupt 谢谢两位!
    我按文档里的注册了 dll
    https://sites.google.com/a/deskperience.com/wordcapturexdoc/wcapturex/register-wcapturex
    我的命令
    C:\Users\i>regsvr32 "C:\Program Files\WordWeb\WCaptureX.dll"
    然后我的代码
    from win32com.client import Dispatch
    zk = Dispatch("WCaptureX")
    估计也不对,出现如下异常
    Traceback (most recent call last):
    File "C:\Users\i\AppData\Local\Programs\Python\Python36-32\lib\site-packages\win32com\client\dynamic.py", line 89, in _GetGoodDispatch
    IDispatch = pythoncom.connect(IDispatch)
    pywintypes.com_error: (-2147221005, '无效的类字符串', None, None)

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File "D:\BaiduYunDownload\编程\Python\Win32COM.py", line 3, in <module>
    zk = Dispatch("WCaptureXLib")
    File "C:\Users\i\AppData\Local\Programs\Python\Python36-32\lib\site-packages\win32com\client\__init__.py", line 95, in Dispatch
    dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx)
    File "C:\Users\i\AppData\Local\Programs\Python\Python36-32\lib\site-packages\win32com\client\dynamic.py", line 114, in _GetGoodDispatchAndUserName
    return (_GetGoodDispatch(IDispatch, clsctx), userName)
    File "C:\Users\i\AppData\Local\Programs\Python\Python36-32\lib\site-packages\win32com\client\dynamic.py", line 91, in _GetGoodDispatch
    IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)
    pywintypes.com_error: (-2147221005, '无效的类字符串', None, None)
    [Finished in 1.2s]
    ysc3839
    ysc3839
    Jul 25, 2018 via Android
    27
    我可以免费帮你试试。
    要自己研究的话,找 C 语言调用 COM 的代码。
    个人理解 COM 接口本质是一个记录函数指针的 struct,取到函数指针后 call 就行了。
    iMath
    iMath
    OP
    Jul 25, 2018
    28
    @ysc3839 多谢相助!在下对 win32 编程基本没什么认识,希望在你的指引下让我这小白上道~
    FanWall
    FanWall
    Jul 25, 2018 via Android
    29
    @iMath #26

    名称参数大概写错了,可以借助你可以跑通的语言或者工具查看一下

    https://technet.microsoft.com/en-us/library/d0kh9f4c(fr-fr).aspx

    你也可以用 win32api 调用 CreateCOMObject,那就是 #27 的方案,第一次写麻烦点,不过对加深理解非常有帮助。
    ysc3839
    ysc3839
    Jul 25, 2018 via Android
    30
    @iMath 另外能否提供一下示例代码?
    ysc3839
    ysc3839
    Jul 25, 2018 via Android
    32
    @iMath 要直接运行就能使用的代码。
    iMath
    iMath
    OP
    Jul 25, 2018
    33
    @ysc3839 谢谢!
    这里有各种语言的 demo
    https://github.com/yanivyhc/WordCaptureSamples
    iMath
    iMath
    OP
    Jul 25, 2018
    34
    通过 oleview.exe 找到了这些内容,接下来怎么做也还要等摸索
    ![
    ]( )
    ysc3839
    ysc3839
    Jul 25, 2018
    35
    @iMath
    IDispatch 是一个提供了动态特性的 COM 接口,可以实现不固定的函数。一般来说一些较高级的语言会封装这个接口,如 VB C# Delphi,#26 的代码也是使用这个接口。
    而 C/C++ 一般不会使用这个接口,因为在没有封装的情况下使用起来较为麻烦。
    ysc3839
    ysc3839
    Jul 26, 2018 via Android
    36
    最终选用了 comtypes https://github.com/enthought/comtypes 这个模块。它同时支持一般的 COM 接口以及 IDispatch,且仅依赖内置的 ctypes 模块。
    Leigg
    Leigg
    Jul 26, 2018 via iPhone
    37
    要么你别提钱。
    iMath
    iMath
    OP
    Jul 26, 2018
    38
    @ysc3839 我误打误撞地似乎找到了可以用的方式,如下
    from win32com.client import Dispatch
    WCaptureX = Dispatch("{8F267988-0CA4-418C-8F94-B4BC5862B390}")
    print(WCaptureX.GetCursorInfo(None) )

    在我的电脑上,CLSID 是{8F267988-0CA4-418C-8F94-B4BC5862B390},不知道在别的机器上 CLSID 会不会变?
    ala2008
    ala2008
    Jul 26, 2018
    39
    或者可以趁此学一下 c++?。。
    iMath
    iMath
    OP
    Jul 26, 2018
    40
    谈钱伤感情,我错了,各位!
    realpg
    realpg
    Jul 26, 2018
    41
    看过程,想起了当年被迫在 linux 下调用 dll 的折腾死人的一周
    ioth
    ioth
    Jul 26, 2018
    42
    给你打个折,48 元。
    AEANWspPmj3FUhDc
    AEANWspPmj3FUhDc
    Jul 26, 2018
    43
    "谈钱伤感情,我错了,各位!"

    这句话我要反驳一下。
    拜托,请问我们有什么感情?不和你谈钱,那谈什么?谈梦想?
    reus
    reus
    Jul 26, 2018
    44
    钱不多,但有为知识付费的意识,这个难得
    FanWall
    FanWall
    Jul 26, 2018 via Android
    45
    @iMath #38

    不会变,是常量,例如 Excel.* 也有对应的 CLSID,也可以互相转换。官方 SDK 里肯定也有定义的。
    iMath
    iMath
    OP
    Jul 26, 2018
    46
    @reus 还是你理解我!理解万岁!
    iMath
    iMath
    OP
    Jul 26, 2018
    47
    @FanWall 谢谢大哥不断的指教!
    我现在写出的代码如下
    from win32com.client import Dispatch
    import win32gui
    import mouse
    import time
    from threading import Timer

    WCaptureX = Dispatch("{8F267988-0CA4-418C-8F94-B4BC5862B390}")
    WInput = Dispatch("{4B484CCE-9120-49B7-A5F2-B8B183BFD808}")



    def onMouseClicked():
    # x,y=mouse.get_position()
    # windowHandle = win32gui.WindowFromPoint((x,y))
    # windowClassName= win32gui.GetClassName(windowHandle)
    # print(win32gui.GetClassName(windowHandle)) WInput.Hwnd=None
    windowHandle,x,y=WCaptureX.GetCursorInfo()
    WInput.Hwnd=windowHandle
    WInput.StartX=x
    WInput.StartY=y
    # WInput.EndX=x+100
    # WInput.EndY=y+100
    WResult=WCaptureX.Capture(WInput)
    print(WResult.TEXT ,WResult.Paragraph )


    mouse.on_click(onMouseClicked) # 实际是 released event
    mouse.wait(button='right', target_types=('double', ))


    我试了下 Word 2016 取词也是没问题,但是 Chrome 和 sumatraPDF 之类的软件就无法取词,估计是我没有找到正确的使用方式吧。
    据我所知,国内的欧路词典也是用这套工具,该软件在 Chrome 和 sumatraPDF 里取词没问题……
    @ysc3839
    lee88688
    lee88688
    Jul 26, 2018 via Android
    48
    我之前用过内置的 ctypes 调用过 dll,感觉还挺好用的你可以去尝试一下
    FanWall
    FanWall
    Jul 26, 2018 via Android❤️1
    49
    @iMath #47

    既然能跑通了那接下来的实现一般就是翻文档的事情了,加油吧
    Mmmmc
    Mmmmc
    Jul 26, 2018
    50
    看得我五味杂陈
    iMath
    iMath
    OP
    Jul 26, 2018
    51
    @lee88688 用 ctypes 我只能走到这一步就不知道下一步怎么走了
    from ctypes import *
    print(cdll.WCaptureX.CreateCOMObject)
    salamanderMH
    salamanderMH
    Jul 26, 2018
    52
    其实吧,我觉得,钱不重要
    IbukiSuika
    IbukiSuika
    Jul 26, 2018
    53
    楼主长个记性吧,以后这种别提钱就好了
    ysc3839
    ysc3839
    Jul 26, 2018 via Android
    55
    @iMath CLSID 是不会变的。如果你会的话那我就不写了。
    cszhiyue
    cszhiyue
    Jul 26, 2018
    56
    “一般人们总认为要让别人做点事情,就应该给他们奖励,不管多少、 不论大小,有总比没有的好,但其实不然”

    “第一种方案纯粹依赖人们的内在动力,第二种则 与经济利益挂钩。那么这两种比较而言,哪种方式起到的效果更好呢? 第一种方案中,无偿献血是一种公益行为,人们愿意在这个时候做点贡 献,会自愿参加献血。而第二种方案因为有物质激励,人们自然而然地 会将献血看成一种经济行为。10 元的补助根本就是杯水车薪,数目实在 太小,起不到激励的作用,没有多少人会愿意为了拿到 10 元去卖血。所 以,没奖要比有小奖更能引导人们做好事,或者做我们希望他们做的事。 当然,如果献血给的钱特别多,比如一万元,那自然有很多人愿意去献 血,但我们比较的不是给一万元和不给钱,比如一万元,那自然有很多人愿意去献 血,但我们比较的不是给一万元和不给钱时人们献血的意愿,而是给 10 元和不给钱时人们献血的意愿。

    同样,当我还在耶鲁大学念书的时候,经常需要找一些学生帮我做 问卷。当时我还是一个穷学生,付不起多少钱。我发现如果我请别人帮 我做问卷然后给他们 1 美元的报酬,大多数人都不愿意帮我做。后来,我 索性就不给钱了,直接请他们帮我做问卷,这样反而有比较多的人愿意 帮忙。”


    摘录来自: 未知作者. “别做正常的傻瓜”。iBooks.
    iMath
    iMath
    OP
    Jul 26, 2018
    57
    @cszhiyue 你的引用道出了我在这篇帖子里的处境,万分感谢!
    阁下能否推荐些你觉得大多数人都值得一看的书来看看?
    agostop
    agostop
    Jul 26, 2018
    58
    其实是干技术的,都接受不了技术不值钱这个事实。
    forkon
    forkon
    Jul 26, 2018
    59
    放了楼主的 50 元吧,他只是出于好意。
    Nostalgiaaaa
    Nostalgiaaaa
    Jul 26, 2018
    60
    这个属于你把工作量化成 50 块钱了。。。一般做程序员的都不会觉得自己好几个小时就值 50,下次直接请教下方向就行了,剩下的自己摸索。
    jianpanxia
    jianpanxia
    Jul 26, 2018
    61
    这...就值 50?
    tjxiter
    tjxiter
    Jul 26, 2018
    62
    悬赏 和 50 元 放一起。 让大家开心了一把。

    楼主不是坏人。

    鉴定完毕。
    njlcazl
    njlcazl
    Jul 26, 2018
    63
    为什么大家都把帖子标题里面的“至少”给忽略了
    mcone
    mcone
    Jul 26, 2018
    64
    @njlcazl 好问题
    HR 发招聘启示的时候 工资都是范围 为什么大家一般只着重看范围的下限呢?
    zhuangzhuang1988
    zhuangzhuang1988
    Jul 26, 2018
    65
    题主搞定没
    没搞定告诉你到哪里抄代码
    https://bitbucket.org/pyglet/pyglet/src/11fcff3d96d71619d55354bea6a9adc07efc8afc/pyglet/com.py?at=default
    pyglet 项目,纯 Python 做 opengl 外部 0 依赖
    涉及到 windows 上的一些肯定的 ctypes 上
    djxf
    djxf
    Jul 26, 2018 via Android
    66
    50 元的讨论。
    iMath
    iMath
    OP
    Jul 26, 2018
    67
    @zhuangzhuang1988 搞定了一部分,见 47 楼
    做这种事情,包括你说的那个项目,感觉都还是要懂些 C 或 C++才能入手,不然的话步履维艰啊
    lee88688
    lee88688
    Jul 26, 2018 via Android
    68
    @iMath ctypes 调用 dll 函数就像是普通 python 函数调用一样,但是参数必须用 ctypes 中基本数据类型进行包裹,我记得官方网站上有相关教程还比较详细的
    iMath
    iMath
    OP
    Jul 27, 2018
    69
    @lee88688 3Q !但是在我现在这个应用场景下用 ctypes 调用 dll 函数似乎难度又上了一个层次,我只能写出这种来就进行不下去了
    from ctypes import *
    print(cdll.WCaptureX.CreateCOMObject)
    lee88688
    lee88688
    Jul 31, 2018 via Android
    70
    @iMath 难度不高,先通过 ctypes 导入 dll 然后准备好参数,通过 ctypes 调用并得到结果,这个流程并没有什么难度,可能只是你不熟悉库,直接百度 google 搜索一些基本教程很快就能上手。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1384 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 108ms · UTC 22:09 · PVG 06:09 · LAX 14:09 · JFK 17:09
    ♥ Do have faith in what you're doing.