有没有办法取消并重新启动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++标签,因为如果这里不清楚。请适当标记您的帖子。