当前位置: 首页 > 面试题库 >

如何使用hinstance确定win32api.ShellExecute是否成功?

郁吉星
2023-03-14
问题内容

我一直在寻找原始问题的答案..如何确定(以编程方式)我的win32api.ShellExecute语句成功执行,并且如果成功执行,则执行os.remove()语句。

经过研究,我发现ShellExecute()调用返回了HINSTANCE。进一步的挖掘发现,如果成功,ShellExecute()将返回HINSTANCE>
32。我现在的问题是,如何使用它来控制程序的其余部分?我尝试使用一条if HINSTANCE> 32:语句来控制下一部分,但是得到了一条NameError: name 'hinstance' is not defined消息。通常,这不会使我感到困惑,因为这意味着我需要在引用变量
hinstance”之前先定义它;但是,因为我认为ShellExecute应该返回HINSTANCE,所以我认为它可以使用吗?

这是我尝试执行此操作的完整代码。请注意,在我的print_file()定义中,我正在将hinstance分配给完整的win32api.ShellExecute()命令,以尝试捕获该hinstance,并在函数末尾将其显式返回。.这也不起作用。

import win32print
import win32api
from os.path import isfile, join
import glob
import os
import time

source_path = "c:\\temp\\source\\"

def main():
    printer_name = win32print.GetDefaultPrinter()
    while True:
        file_queue = [f for f in glob.glob("%s\\*.txt" % source_path) if isfile(f)]
        if len(file_queue) > 0:
            for i in file_queue:
                print_file(i, printer_name)
                if hinstance > 32:
                    time.sleep(.25)
                    delete_file(i)
                print "Filename: %r has printed" % i
                print
                time.sleep(.25)
                print                
        else:
            print "No files to print. Will retry in 15 seconds"
        time.sleep(15)


def print_file(pfile, printer):
    hinstance = win32api.ShellExecute(
        0,
        "print",
        '%s' % pfile,
        '/d:"%s"' % printer,
        ".",
        0
        )
    return hinstance


def delete_file(f):
    os.remove(f)
    print f, "was deleted!"

def alert(email):
    pass

main()

问题答案:

使用ShellExecute,您将永远不会知道何时完成打印,这取决于文件的大小以及打印机驱动程序是否缓冲内容(例如,打印机可能正在等待您填充纸盒)。

根据此SO答案,这似乎subprocess.call()是一个更好的解决方案,因为它等待命令完成,只有在这种情况下,您才需要读取注册表以获得与文件关联的exe。

ShellExecuteEx可从pywin32获得,您可以执行以下操作:

import win32com.shell.shell as shell
param = '/d:"%s"' % printer
shell.ShellExecuteEx(fmask = win32com.shell.shellcon.SEE_MASK_NOASYNC, lpVerb='print', lpFile=pfile, lpParameters=param)

编辑:用于等待ShellExecuteEx()处理的代码

import win32com.shell.shell as shell
import win32event
#fMask = SEE_MASK_NOASYNC(0x00000100) = 256 + SEE_MASK_NOCLOSEPROCESS(0x00000040) = 64
dict = shell.ShellExecuteEx(fMask = 256 + 64, lpFile='Notepad.exe', lpParameters='Notes.txt')
hh = dict['hProcess']
print hh
ret = win32event.WaitForSingleObject(hh, -1)
print ret


 类似资料:
  • 我正在编写一个通用组件,该组件封装了一个生成器并执行常规操作: 按键筛选 转换值 等等 为了尽可能接近地模拟包装生成器,如果生成器使用引用,我想使用引用。 当我尝试使用 构造的情况下迭代生成器对引用完全不起作用:

  • 我正在编写一个通用组件,该组件封装了一个生成器并执行常规操作: 按键筛选 转换值 等等 为了尽可能接近地模拟包装生成器,如果生成器使用引用,我想使用引用。 当我尝试使用 构造的情况下迭代生成器对引用完全不起作用:

  • 问题内容: 我正在使用Java连接到MySQL数据库。我正在尝试向数据库中插入或更新数据。 即使我很确定插入成功,它也会返回false。 根据“执行” API,返回值是“如果第一个结果是ResultSet对象,则为true;如果是更新计数或没有结果,则为false”。 如何确定插入或更新是否成功? 问题答案: 由于您正在使用,因此可以致电- 通过上面的Javadoc( Return )链接,添加了

  • 问题内容: 您如何确定大写锁定是否在使用JavaScript? 需要注意的是:我用google搜索了,找到的最佳解决方案是将事件附加到每个输入,然后每次检查所按字母是否为大写,如果是,则检查是否也按住shift键。如果不是,则必须打开大写锁定。这感觉真的很脏而且只是… 浪费 -当然有比这更好的方法了吗? 问题答案: 您可以尝试一下。添加了一个有效的示例。当焦点位于输入上时,打开大写锁定会使LED变

  • 问题内容: 我有一个需要用户输入密码的应用程序。 我想要做的是从控制台读取密码(如果操作系统支持unix)或显示JOptionPane并要求用户输入密码(如果操作系统支持图形界面(例如Windows))。 有人可能会争辩说,在上述两种情况下控制台始终可用,因此控制台输入就足够了。但是问题是,如果Java应用程序开始使用javaw.exe,则控制台不可用。因此,我需要一种方法来确定我是否可以做任何一

  • 我们使用.Net MySql Connector的v6.9.9使用此连接字符串访问MySql,指定需要SSL。 我们的DBA已经启用了对SSL的支持,但在测试期间,无论我的机器上是否安装了证书,也不管我是否具有“SSL模式=必需”都可以连接到服务器。 然而,当我的DBA禁用SSL时,如果我使用上述连接字符串,我会得到一个错误,即SSL未启用。 因此,我真的不知道我的网络流量是否被加密。如何验证?

  • 问题内容: 用Java实现此的最佳方法是什么?显然,泛型和通配符是为了能够轻松处理此类问题,但我正全神贯注。 如果有一个类似的方法来检查列表是否是相反的顺序,那也很好。 问题答案: Guava 通过其出色的Ordering类提供了此功能。An 是。在这种情况下,如果你具有实现的某种类型的列表,则可以编写: 这适用于任何,而不仅仅是,你可以通过指定s应该在其他任何非元素之前还是之后轻松地处理s :

  • 问题内容: 我正在编写一些Javascript来调整大图像的大小,以适合用户的浏览器窗口。(不幸的是,我没有控制源图像的大小。) 因此,HTML中将包含以下内容: 我是否可以确定 标签中的图像是否已下载? 我需要这样做,因为如果在浏览器加载图像之前执行该命令,就会遇到问题。 并返回占位符的大小(替代文本)。就我而言,这大约是134 x 20。 现在,我只是在检查照片的高度是否小于150,并假设是a