C++ 通过ShellExecute()打印到Dymo LabelWriter Turbo时的随机延迟

C++ 通过ShellExecute()打印到Dymo LabelWriter Turbo时的随机延迟,c++,c++builder,shellexecute,C++,C++builder,Shellexecute,我有一个外部程序,它接受一些参数(PrintLabel),这些参数是使用ShellExecute从我的应用程序调用的。PrintLabel如下所示。有时打印标签可能需要15到20秒。随着时间的推移,情况似乎变得更糟。如果电脑重新启动,打印速度会再次加快,但随着时间的推移,速度会变慢。有时是随机的(即先快后慢)。我使用SW_HIDE是因为我不希望用户每次都看到控制台对话框。我知道它应该像普通打印机一样需要几秒钟,但15-20秒似乎太长了。是Dymo LabelWriter问题还是ShellExec

我有一个外部程序,它接受一些参数(PrintLabel),这些参数是使用ShellExecute从我的应用程序调用的。PrintLabel如下所示。有时打印标签可能需要15到20秒。随着时间的推移,情况似乎变得更糟。如果电脑重新启动,打印速度会再次加快,但随着时间的推移,速度会变慢。有时是随机的(即先快后慢)。我使用SW_HIDE是因为我不希望用户每次都看到控制台对话框。我知道它应该像普通打印机一样需要几秒钟,但15-20秒似乎太长了。是Dymo LabelWriter问题还是ShellExecute问题?ShellExecute在UI线程内调用。有什么线索吗

来自应用程序的ShellExecute语句:

ShellExecute(Application->Handle, "open", "C:\\Program Files\\Application\\PrintLabel", objdata, "C:\\Program Files\\Application", SW_HIDE);
打印标签代码:

以下是CDYMAddin4.h:

// Machine generated IDispatch wrapper class(es) created with Add Class from Typelib Wizard

// CDymoAddIn4 wrapper class

class CDymoAddIn4 : public COleDispatchDriver
{
public:
    CDymoAddIn4(){} // Calls COleDispatchDriver default constructor
    CDymoAddIn4(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
    CDymoAddIn4(const CDymoAddIn4& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}

    // Attributes
public:

    // Operations
public:


    // IDymoAddIn4 methods
public:
    BOOL Open(LPCTSTR FileName)
    {
        BOOL result;
        static BYTE parms[] = VTS_BSTR ;
        InvokeHelper(0x1, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, FileName);
        return result;
    }
    BOOL Save()
    {
        BOOL result;
        InvokeHelper(0x2, DISPATCH_METHOD, VT_BOOL, (void*)&result, NULL);
        return result;
    }
    BOOL SaveAs(LPCTSTR FileName)
    {
        BOOL result;
        static BYTE parms[] = VTS_BSTR ;
        InvokeHelper(0x3, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, FileName);
        return result;
    }
    BOOL Print(long Copies, BOOL bShowDialog)
    {
        BOOL result;
        static BYTE parms[] = VTS_I4 VTS_BOOL ;
        InvokeHelper(0x4, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, Copies, bShowDialog);
        return result;
    }
    void Hide()
    {
        InvokeHelper(0x5, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
    }
    void Show()
    {
        InvokeHelper(0x6, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
    }
    void SysTray(BOOL State)
    {
        static BYTE parms[] = VTS_BOOL ;
        InvokeHelper(0x7, DISPATCH_METHOD, VT_EMPTY, NULL, parms, State);
    }
    void Quit()
    {
        InvokeHelper(0x8, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
    }
    CString get_FileName()
    {
        CString result;
        InvokeHelper(0x9, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
        return result;
    }
    BOOL SelectPrinter(LPCTSTR Printer)
    {
        BOOL result;
        static BYTE parms[] = VTS_BSTR ;
        InvokeHelper(0xa, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, Printer);
        return result;
    }
    CString GetDymoPrinters()
    {
        CString result;
        InvokeHelper(0xb, DISPATCH_METHOD, VT_BSTR, (void*)&result, NULL);
        return result;
    }
    CString GetMRULabelFiles()
    {
        CString result;
        InvokeHelper(0x12d, DISPATCH_METHOD, VT_BSTR, (void*)&result, NULL);
        return result;
    }
    BOOL Open2(LPCTSTR FileName)
    {
        BOOL result;
        static BYTE parms[] = VTS_BSTR ;
        InvokeHelper(0x12e, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, FileName);
        return result;
    }
    long GetMRULabelFileCount()
    {
        long result;
        InvokeHelper(0x12f, DISPATCH_METHOD, VT_I4, (void*)&result, NULL);
        return result;
    }
    CString GetMRULabelFileName(long Index)
    {
        CString result;
        static BYTE parms[] = VTS_I4 ;
        InvokeHelper(0x130, DISPATCH_METHOD, VT_BSTR, (void*)&result, parms, Index);
        return result;
    }
    BOOL OpenMRULabelFile(long Index)
    {
        BOOL result;
        static BYTE parms[] = VTS_I4 ;
        InvokeHelper(0x131, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, Index);
        return result;
    }
    BOOL OpenMRULabelFileByName(LPCTSTR FileName)
    {
        BOOL result;
        static BYTE parms[] = VTS_BSTR ;
        InvokeHelper(0x132, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, FileName);
        return result;
    }
    BOOL Print2(long Copies, BOOL bShowDlg, long Tray)
    {
        BOOL result;
        static BYTE parms[] = VTS_I4 VTS_BOOL VTS_I4 ;
        InvokeHelper(0x191, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, Copies, bShowDlg, Tray);
        return result;
    }
    long GetCurrentPaperTray()
    {
        long result;
        InvokeHelper(0x192, DISPATCH_METHOD, VT_I4, (void*)&result, NULL);
        return result;
    }
    void StartPrintJob()
    {
        InvokeHelper(0xc9, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
    }
    void EndPrintJob()
    {
        InvokeHelper(0xca, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
    }
    BOOL IsTwinTurboPrinter(LPCTSTR PrinterName)
    {
        BOOL result;
        static BYTE parms[] = VTS_BSTR ;
        InvokeHelper(0xcb, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, PrinterName);
        return result;
    }
    CString GetCurrentPrinterName()
    {
        CString result;
        InvokeHelper(0xce, DISPATCH_METHOD, VT_BSTR, (void*)&result, NULL);
        return result;
    }

    // IDymoAddIn4 properties
public:

};

在问题出现之前打印了多少标签?这可能是导致打印速度减慢的内存/句柄泄漏吗?是否正确释放所有COM对象?您是否已使用ProcessExplorer或任务管理器检查了资源使用情况?

添加对StartPrintJob()和EndPrintJob()的调用。有时,当您向系统发送数据时,它会假设您将发送更多数据,而只是缓存数据-您需要一种方式来说“嘿,我完成了,让我们做这件事”

还有一点元建议——确保你一直在尝试——并尝试将你的问题减少到尽可能小的例子中,以消除你的思维混乱,并将注意力集中在一组最小的问题元素上


(关于这个答案的起源,请参见问题的评论)

我不熟悉您使用的所有技术,但是,嘿,我还是要评论一下。看起来您已经发布了大量的样板代码,这些代码几乎不起作用。你所拥有的控制台应用程序的主要部分似乎是m_DymoAddIn.Print2(拷贝、假拷贝、托盘);其中副本和托盘仅为整数。但是您没有向我们展示类CDymoAddIn4的代码,而m_DymoAddIn是它的一个实例。这很重要!就像猜测一样-该类是否有Flush()类型的方法来立即清空内部缓冲区并发送数据?我不记得了-您是否调用StartPrintJob()特别是EndPrintJob()?(也许你可以把旧代码放回原处-如果所有的样板注释都被省略就好了,但实际上这不是什么大问题:-)不,我没有使用开始/结束打印作业可能这是一种尝试-它符合您的症状-有时当您向系统发送数据时,它会假设您将发送更多数据,只是缓存数据-您需要一种方式来说“嘿,我完成了,让我们做这件事”。当然,我只是在猜测。祝你好运我的最后一点元建议是确保你继续进行实验,并尝试将你的问题减少到尽可能小的例子,以消除你头脑中的混乱,专注于一组最小的问题元素。我认为你的建议就是问题所在。。。它不是与ShellExecute()一起使用,而是可能与Dymo接口一起使用。我进一步浏览了Dymo SDK,下面是示例代码中的注释://注意:如果要多次调用Print()或Print2()函数,则此调用非常重要!最好总是将StartPrintJob()和EndPrintJob()包装在对Print()或Print2()函数的调用中。您也可以尝试在C++Builder中启用CodeGuard来检查泄漏。在情况变得更糟之前,它需要大约50个标签,然后才开始下降。
// Machine generated IDispatch wrapper class(es) created with Add Class from Typelib Wizard

// CDymoAddIn4 wrapper class

class CDymoAddIn4 : public COleDispatchDriver
{
public:
    CDymoAddIn4(){} // Calls COleDispatchDriver default constructor
    CDymoAddIn4(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
    CDymoAddIn4(const CDymoAddIn4& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}

    // Attributes
public:

    // Operations
public:


    // IDymoAddIn4 methods
public:
    BOOL Open(LPCTSTR FileName)
    {
        BOOL result;
        static BYTE parms[] = VTS_BSTR ;
        InvokeHelper(0x1, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, FileName);
        return result;
    }
    BOOL Save()
    {
        BOOL result;
        InvokeHelper(0x2, DISPATCH_METHOD, VT_BOOL, (void*)&result, NULL);
        return result;
    }
    BOOL SaveAs(LPCTSTR FileName)
    {
        BOOL result;
        static BYTE parms[] = VTS_BSTR ;
        InvokeHelper(0x3, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, FileName);
        return result;
    }
    BOOL Print(long Copies, BOOL bShowDialog)
    {
        BOOL result;
        static BYTE parms[] = VTS_I4 VTS_BOOL ;
        InvokeHelper(0x4, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, Copies, bShowDialog);
        return result;
    }
    void Hide()
    {
        InvokeHelper(0x5, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
    }
    void Show()
    {
        InvokeHelper(0x6, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
    }
    void SysTray(BOOL State)
    {
        static BYTE parms[] = VTS_BOOL ;
        InvokeHelper(0x7, DISPATCH_METHOD, VT_EMPTY, NULL, parms, State);
    }
    void Quit()
    {
        InvokeHelper(0x8, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
    }
    CString get_FileName()
    {
        CString result;
        InvokeHelper(0x9, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
        return result;
    }
    BOOL SelectPrinter(LPCTSTR Printer)
    {
        BOOL result;
        static BYTE parms[] = VTS_BSTR ;
        InvokeHelper(0xa, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, Printer);
        return result;
    }
    CString GetDymoPrinters()
    {
        CString result;
        InvokeHelper(0xb, DISPATCH_METHOD, VT_BSTR, (void*)&result, NULL);
        return result;
    }
    CString GetMRULabelFiles()
    {
        CString result;
        InvokeHelper(0x12d, DISPATCH_METHOD, VT_BSTR, (void*)&result, NULL);
        return result;
    }
    BOOL Open2(LPCTSTR FileName)
    {
        BOOL result;
        static BYTE parms[] = VTS_BSTR ;
        InvokeHelper(0x12e, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, FileName);
        return result;
    }
    long GetMRULabelFileCount()
    {
        long result;
        InvokeHelper(0x12f, DISPATCH_METHOD, VT_I4, (void*)&result, NULL);
        return result;
    }
    CString GetMRULabelFileName(long Index)
    {
        CString result;
        static BYTE parms[] = VTS_I4 ;
        InvokeHelper(0x130, DISPATCH_METHOD, VT_BSTR, (void*)&result, parms, Index);
        return result;
    }
    BOOL OpenMRULabelFile(long Index)
    {
        BOOL result;
        static BYTE parms[] = VTS_I4 ;
        InvokeHelper(0x131, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, Index);
        return result;
    }
    BOOL OpenMRULabelFileByName(LPCTSTR FileName)
    {
        BOOL result;
        static BYTE parms[] = VTS_BSTR ;
        InvokeHelper(0x132, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, FileName);
        return result;
    }
    BOOL Print2(long Copies, BOOL bShowDlg, long Tray)
    {
        BOOL result;
        static BYTE parms[] = VTS_I4 VTS_BOOL VTS_I4 ;
        InvokeHelper(0x191, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, Copies, bShowDlg, Tray);
        return result;
    }
    long GetCurrentPaperTray()
    {
        long result;
        InvokeHelper(0x192, DISPATCH_METHOD, VT_I4, (void*)&result, NULL);
        return result;
    }
    void StartPrintJob()
    {
        InvokeHelper(0xc9, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
    }
    void EndPrintJob()
    {
        InvokeHelper(0xca, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
    }
    BOOL IsTwinTurboPrinter(LPCTSTR PrinterName)
    {
        BOOL result;
        static BYTE parms[] = VTS_BSTR ;
        InvokeHelper(0xcb, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, PrinterName);
        return result;
    }
    CString GetCurrentPrinterName()
    {
        CString result;
        InvokeHelper(0xce, DISPATCH_METHOD, VT_BSTR, (void*)&result, NULL);
        return result;
    }

    // IDymoAddIn4 properties
public:

};