Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法取消并重新启动COM对象中的函数?_Com_Callback_Vb6_Activex - Fatal编程技术网

有没有办法取消并重新启动COM对象中的函数?

有没有办法取消并重新启动COM对象中的函数?,com,callback,vb6,activex,Com,Callback,Vb6,Activex,我的软件现在如何工作: Private Sub txtFind_Change() lvResults.ListItems.Clear m_customer.CancelFind #' Not useful frmMain.appData.Licfile.Find(txtFind.Text, AddressOf FindCallback, ObjPtr(m_customer)) End Sub Public Function CancelFind() If m_b

我的软件现在如何工作:

Private Sub txtFind_Change()
    lvResults.ListItems.Clear
    m_customer.CancelFind #' Not useful
    frmMain.appData.Licfile.Find(txtFind.Text, AddressOf FindCallback, ObjPtr(m_customer))
End Sub

Public Function CancelFind()
    If m_bFindRunning Then: m_bCancelFind = True
End Function

Public Function FindCallback(ByVal foundItem As Boolean, _
                             ByVal finished As Boolean, _
                             ByVal index As Long) As Long
Dim record As zLicFileRecord
Dim resultstr As String
Dim error As Long
    If foundItem Then
        frmMain.appData.Licfile.Read(index, record)
        RaiseEvent SearchResult(index, record)
        DoEvents
    Else
        If Not finished Then
            RaiseEvent SearchProgress(index, frmMain.appData.Licfile.RecordCount)
            DoEvents
        Else
            RaiseEvent SearchFinished
        End If
    End If
    If m_bCancelFind Then
        FindCallback = 1
        m_bCancelFind = False
    End If
End Function


STDMETHODIMP CzLicenseFile::Find(BSTR  find, 
                                 LONG  callbackFunction /* fnFindCallback */,
                                 LONG  context,
                                 LONG* win32Error)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CHECK_PTR(win32Error);

    if (!callbackFunction)
    {
        *win32Error = ERROR_NO_CALLBACK_ACTIVE;
        RETURN_OK;
    }

    fnFindCallback pfnCallback = reinterpret_cast<fnFindCallback>(callbackFunction);

    try 
    {
        DWORD recordCount;
        get_RecordCount(reinterpret_cast<LONG*>(&recordCount));
        if (recordCount == static_cast<DWORD>(-1))
        {
            *win32Error = ERROR_READ_FAULT;
            RETURN_OK;
        }

        QuickMatcher matcher(std::wstring(find, ::SysStringLen(find)));

        for (size_t i = static_cast<size_t>(startIndex); i < recordCount; ++i)
        {
            LicenseFileRecord const& item = m_fileBuf.Get(i);  

            bool match = matcher.match(item);

            if (match)
            {
                if (pfnCallback)
                {
                    LONG result = pfnCallback(VTRUE, VFALSE, i, context);
                    if (result != 0)
                    {
                        break;
                    }
                }
            }
            else if (i % 1000 == 0)
            {
                if (pfnCallback)
                {
                    LONG result = pfnCallback(VFALSE, VFALSE, i, context);
                    if (result != 0)
                    {
                        break;
                    }
                }
            }
        }    
    }
    catch (AutoWinError const& e)
    {
        *win32Error = e.error();
        RETURN_OK;
    }

    if (pfnCallback)
    {
        pfnCallback(VFALSE, VTRUE, -1, context);
    }

    *win32Error = ERROR_SUCCESS;
    RETURN_OK;
}

我有一个C++ ATL对象和一个VB6客户端应用程序。COM对象有一个函数,

Find
,它通过回调函数搜索数据库并报告匹配项。当用户使用其更改事件将文本输入文本框时,我从VB6调用
Find
函数,传递文本和回调函数的地址。回调函数将匹配项输出到列表框,进行
DoEvents
调用,并返回一个值,指示搜索是否应继续

我正在努力实现的目标:

Private Sub txtFind_Change()
    lvResults.ListItems.Clear
    m_customer.CancelFind #' Not useful
    frmMain.appData.Licfile.Find(txtFind.Text, AddressOf FindCallback, ObjPtr(m_customer))
End Sub

Public Function CancelFind()
    If m_bFindRunning Then: m_bCancelFind = True
End Function

Public Function FindCallback(ByVal foundItem As Boolean, _
                             ByVal finished As Boolean, _
                             ByVal index As Long) As Long
Dim record As zLicFileRecord
Dim resultstr As String
Dim error As Long
    If foundItem Then
        frmMain.appData.Licfile.Read(index, record)
        RaiseEvent SearchResult(index, record)
        DoEvents
    Else
        If Not finished Then
            RaiseEvent SearchProgress(index, frmMain.appData.Licfile.RecordCount)
            DoEvents
        Else
            RaiseEvent SearchFinished
        End If
    End If
    If m_bCancelFind Then
        FindCallback = 1
        m_bCancelFind = False
    End If
End Function


STDMETHODIMP CzLicenseFile::Find(BSTR  find, 
                                 LONG  callbackFunction /* fnFindCallback */,
                                 LONG  context,
                                 LONG* win32Error)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CHECK_PTR(win32Error);

    if (!callbackFunction)
    {
        *win32Error = ERROR_NO_CALLBACK_ACTIVE;
        RETURN_OK;
    }

    fnFindCallback pfnCallback = reinterpret_cast<fnFindCallback>(callbackFunction);

    try 
    {
        DWORD recordCount;
        get_RecordCount(reinterpret_cast<LONG*>(&recordCount));
        if (recordCount == static_cast<DWORD>(-1))
        {
            *win32Error = ERROR_READ_FAULT;
            RETURN_OK;
        }

        QuickMatcher matcher(std::wstring(find, ::SysStringLen(find)));

        for (size_t i = static_cast<size_t>(startIndex); i < recordCount; ++i)
        {
            LicenseFileRecord const& item = m_fileBuf.Get(i);  

            bool match = matcher.match(item);

            if (match)
            {
                if (pfnCallback)
                {
                    LONG result = pfnCallback(VTRUE, VFALSE, i, context);
                    if (result != 0)
                    {
                        break;
                    }
                }
            }
            else if (i % 1000 == 0)
            {
                if (pfnCallback)
                {
                    LONG result = pfnCallback(VFALSE, VFALSE, i, context);
                    if (result != 0)
                    {
                        break;
                    }
                }
            }
        }    
    }
    catch (AutoWinError const& e)
    {
        *win32Error = e.error();
        RETURN_OK;
    }

    if (pfnCallback)
    {
        pfnCallback(VFALSE, VTRUE, -1, context);
    }

    *win32Error = ERROR_SUCCESS;
    RETURN_OK;
}
当用户在搜索已在运行时更改搜索字段中的文本时,我希望取消正在运行的搜索,清空列表框,然后用更新的文本启动一个新的列表框

我遇到的问题:

Private Sub txtFind_Change()
    lvResults.ListItems.Clear
    m_customer.CancelFind #' Not useful
    frmMain.appData.Licfile.Find(txtFind.Text, AddressOf FindCallback, ObjPtr(m_customer))
End Sub

Public Function CancelFind()
    If m_bFindRunning Then: m_bCancelFind = True
End Function

Public Function FindCallback(ByVal foundItem As Boolean, _
                             ByVal finished As Boolean, _
                             ByVal index As Long) As Long
Dim record As zLicFileRecord
Dim resultstr As String
Dim error As Long
    If foundItem Then
        frmMain.appData.Licfile.Read(index, record)
        RaiseEvent SearchResult(index, record)
        DoEvents
    Else
        If Not finished Then
            RaiseEvent SearchProgress(index, frmMain.appData.Licfile.RecordCount)
            DoEvents
        Else
            RaiseEvent SearchFinished
        End If
    End If
    If m_bCancelFind Then
        FindCallback = 1
        m_bCancelFind = False
    End If
End Function


STDMETHODIMP CzLicenseFile::Find(BSTR  find, 
                                 LONG  callbackFunction /* fnFindCallback */,
                                 LONG  context,
                                 LONG* win32Error)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CHECK_PTR(win32Error);

    if (!callbackFunction)
    {
        *win32Error = ERROR_NO_CALLBACK_ACTIVE;
        RETURN_OK;
    }

    fnFindCallback pfnCallback = reinterpret_cast<fnFindCallback>(callbackFunction);

    try 
    {
        DWORD recordCount;
        get_RecordCount(reinterpret_cast<LONG*>(&recordCount));
        if (recordCount == static_cast<DWORD>(-1))
        {
            *win32Error = ERROR_READ_FAULT;
            RETURN_OK;
        }

        QuickMatcher matcher(std::wstring(find, ::SysStringLen(find)));

        for (size_t i = static_cast<size_t>(startIndex); i < recordCount; ++i)
        {
            LicenseFileRecord const& item = m_fileBuf.Get(i);  

            bool match = matcher.match(item);

            if (match)
            {
                if (pfnCallback)
                {
                    LONG result = pfnCallback(VTRUE, VFALSE, i, context);
                    if (result != 0)
                    {
                        break;
                    }
                }
            }
            else if (i % 1000 == 0)
            {
                if (pfnCallback)
                {
                    LONG result = pfnCallback(VFALSE, VFALSE, i, context);
                    if (result != 0)
                    {
                        break;
                    }
                }
            }
        }    
    }
    catch (AutoWinError const& e)
    {
        *win32Error = e.error();
        RETURN_OK;
    }

    if (pfnCallback)
    {
        pfnCallback(VFALSE, VTRUE, -1, context);
    }

    *win32Error = ERROR_SUCCESS;
    RETURN_OK;
}
由于文本框的更改事件是在回调函数中的
DoEvents
调用期间触发的,因此在回调返回“cancel”代码之前,新的搜索会堆叠在第一个搜索的顶部。当这个新的搜索有一个匹配项时,它调用回调函数,返回取消代码,然后结束,在这一点上,上一个搜索将恢复

我怎么可能在自动启动新搜索之前取消旧搜索

代码:

Private Sub txtFind_Change()
    lvResults.ListItems.Clear
    m_customer.CancelFind #' Not useful
    frmMain.appData.Licfile.Find(txtFind.Text, AddressOf FindCallback, ObjPtr(m_customer))
End Sub

Public Function CancelFind()
    If m_bFindRunning Then: m_bCancelFind = True
End Function

Public Function FindCallback(ByVal foundItem As Boolean, _
                             ByVal finished As Boolean, _
                             ByVal index As Long) As Long
Dim record As zLicFileRecord
Dim resultstr As String
Dim error As Long
    If foundItem Then
        frmMain.appData.Licfile.Read(index, record)
        RaiseEvent SearchResult(index, record)
        DoEvents
    Else
        If Not finished Then
            RaiseEvent SearchProgress(index, frmMain.appData.Licfile.RecordCount)
            DoEvents
        Else
            RaiseEvent SearchFinished
        End If
    End If
    If m_bCancelFind Then
        FindCallback = 1
        m_bCancelFind = False
    End If
End Function


STDMETHODIMP CzLicenseFile::Find(BSTR  find, 
                                 LONG  callbackFunction /* fnFindCallback */,
                                 LONG  context,
                                 LONG* win32Error)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CHECK_PTR(win32Error);

    if (!callbackFunction)
    {
        *win32Error = ERROR_NO_CALLBACK_ACTIVE;
        RETURN_OK;
    }

    fnFindCallback pfnCallback = reinterpret_cast<fnFindCallback>(callbackFunction);

    try 
    {
        DWORD recordCount;
        get_RecordCount(reinterpret_cast<LONG*>(&recordCount));
        if (recordCount == static_cast<DWORD>(-1))
        {
            *win32Error = ERROR_READ_FAULT;
            RETURN_OK;
        }

        QuickMatcher matcher(std::wstring(find, ::SysStringLen(find)));

        for (size_t i = static_cast<size_t>(startIndex); i < recordCount; ++i)
        {
            LicenseFileRecord const& item = m_fileBuf.Get(i);  

            bool match = matcher.match(item);

            if (match)
            {
                if (pfnCallback)
                {
                    LONG result = pfnCallback(VTRUE, VFALSE, i, context);
                    if (result != 0)
                    {
                        break;
                    }
                }
            }
            else if (i % 1000 == 0)
            {
                if (pfnCallback)
                {
                    LONG result = pfnCallback(VFALSE, VFALSE, i, context);
                    if (result != 0)
                    {
                        break;
                    }
                }
            }
        }    
    }
    catch (AutoWinError const& e)
    {
        *win32Error = e.error();
        RETURN_OK;
    }

    if (pfnCallback)
    {
        pfnCallback(VFALSE, VTRUE, -1, context);
    }

    *win32Error = ERROR_SUCCESS;
    RETURN_OK;
}
Private Sub txtFind_Change()
lvResults.ListItems.Clear
m_customer.CancelFind#没有用
frmMain.appData.Licfile.Find(txtFind.Text,FindCallback的地址,ObjPtr(m_客户))
端接头
公共函数CancelFind()
如果m_bFindRunning,则:m_bCancelFind=True
端函数
公共函数FindCallback(ByVal foundItem为布尔值_
ByVal以布尔形式结束_
ByVal索引为Long)为Long
作为zLicFileRecord的Dim记录
Dim resultstr As字符串
长时变暗误差
如果找到项目,则
frmMain.appData.Licfile.Read(索引,记录)
RaiseEvent搜索结果(索引、记录)
多芬特
其他的
如果没有完成的话
RaiseEvent SearchProgress(索引,frmMain.appData.Licfile.RecordCount)
多芬特
其他的
RaiseEvent搜索已完成
如果结束
如果结束
如果m_bCancelFind那么
FindCallback=1
m_bCancelFind=False
如果结束
端函数
STDMETHODIMP CzLicenseFile::Find(BSTR Find,
长调用函数/*fnFindCallback*/,,
长话短说,
长*Win32错误)
{
AFX_管理_状态(AFXGetStaticModuleEstate());
检查PTR(Win32错误);
if(!callbackFunction)
{
*win32Error=错误\无\回调\活动;
返回_OK;
}
fnFindCallback pfnCallback=重新解释强制转换(callback函数);
尝试
{
德沃德记录计数;
获取录制计数(重新解释播放(&RecordCount));
if(recordCount==static_cast(-1))
{
*win32Error=错误\读取\故障;
返回_OK;
}
快速匹配器匹配器(std::wstring(find,::SysStringLen(find));
对于(大小=静态转换(startIndex);i
我用一个函数和一个
计时器
对象解决了这个问题
txtFind\u Change
现在调用此函数:

Public Sub StartSearch()
Dim error As Long
    lvResults.ListItems.Clear
    If Not m_customer Is Nothing Then
        If Not m_customer.FindRunning Then
            error = frmMain.appData.Licfile.Find(txtFind.Text, AddressOf FindCallback, ObjPtr(m_customer))
        Else
            m_customer.CancelFind
            TimerSearchRestart.Interval = 50
            TimerSearchRestart.enabled = True
        End If
    End If
End Sub

你的文章太宽了,不可能看到代码就不可能回答问题。我已经删除了C++标签,因为如果这里不清楚。请适当标记您的帖子。