OLEDB - C++ - ATL 的 OLEDB 提供程序示例崩溃 Excel(来自 msado15.dll 的未捕获异常)
OLEDB - C++ - ATL's OLEDB Provider sample crashes Excel (uncaught exception from msado15.dll)
我编译了来自 运行 和 VS2007 ATL OLEDB Provider wizard 的示例 OleDb 提供程序代码。我在那个博客 post 上提供了更完整的细节。代码崩溃 Excel.
Sub TestOleDbProvider()
On Error GoTo ErrHand
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Open "Provider=FindFiles;Server=foo;Database=bar" '* this works
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = cn '* this works
cmd.CommandText = "*.*" '* this works
Stop
Dim rs As ADODB.Recordset
Set rs = cmd.Execute '* crashes here
Exit Sub
ErrHand:
Debug.Print Err.Description & " (" & Err.Number & ")"
'Stop
End Sub
以上代码在 Set rs = cmd.Execute
行崩溃 Excel。如果我从 VS2017 调试我得到未处理的异常
未捕获异常的 C++ 调用堆栈在这里
msado15.dll!CQuery::SetSQL(unsigned short *) Unknown Non-user code. Symbols loaded.
msado15.dll!CQuery::SetCommandText(long,unsigned long,unsigned char,unsigned char) Unknown Non-user code. Symbols loaded.
msado15.dll!CQuery::Execute(enum ExecuteTypeEnum,char,unsigned long,bool,unsigned long,unsigned long,long,struct tagVARIANT *,unsigned long,void *,long *,struct _ADORecordset * *) Unknown Non-user code. Symbols loaded.
msado15.dll!CCommand::_Execute(enum ExecuteTypeEnum,char,unsigned long,bool,unsigned long,unsigned long,long,long,struct tagVARIANT *,unsigned long,void *,long *,struct _ADORecordset * *) Unknown Non-user code. Symbols loaded.
msado15.dll!CCommand::ExecuteWithModeFlag(struct tagVARIANT *,struct tagVARIANT *,long,struct _ADORecordset * *,int) Unknown Non-user code. Symbols loaded.
msado15.dll!CCommand::Execute(struct tagVARIANT *,struct tagVARIANT *,long,struct _ADORecordset * *) Unknown Non-user code. Symbols loaded.
VBE7.DLL!1e813579() Unknown No symbols loaded.
[Frames below may be incorrect and/or missing, no symbols loaded for VBE7.DLL] Annotated Frame
VBE7.DLL!1e7cff4b() Unknown No symbols loaded.
VBE7.DLL!1e829d13() Unknown No symbols loaded.
VBE7.DLL!1e82fea2() Unknown No symbols loaded.
VBE7.DLL!1e82bcb5() Unknown No symbols loaded.
[External Code] Annotated Frame
调用堆栈清楚地显示了 msado15.dll
内部引发的异常
我想这个用例没有定期测试,但我会对任何建议感兴趣。
请问如何停止崩溃?
ADO,OLEDB 上的 COM 自动化包装器,查询 OLEDB 的 ICommandText 接口。它没有抱怨接口未实现,而是继续使用 NULL 命令文本并崩溃。
我以为这一切都曾经有效,但由于某种原因不再有效(OLEDB 与 ADO 结合使技术相当复杂),支持命令的 ATL 模板实现了接口但在查询时不回答对于.
因此,要解决此问题,只需将 ATL 条目添加到命令对象的服务接口即可:
BEGIN_COM_MAP(CFindFilesCommand)
...
COM_INTERFACE_ENTRY(ICommandText)
...
END_COM_MAP()
我编译了来自 运行 和 VS2007 ATL OLEDB Provider wizard 的示例 OleDb 提供程序代码。我在那个博客 post 上提供了更完整的细节。代码崩溃 Excel.
Sub TestOleDbProvider()
On Error GoTo ErrHand
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Open "Provider=FindFiles;Server=foo;Database=bar" '* this works
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = cn '* this works
cmd.CommandText = "*.*" '* this works
Stop
Dim rs As ADODB.Recordset
Set rs = cmd.Execute '* crashes here
Exit Sub
ErrHand:
Debug.Print Err.Description & " (" & Err.Number & ")"
'Stop
End Sub
以上代码在 Set rs = cmd.Execute
行崩溃 Excel。如果我从 VS2017 调试我得到未处理的异常
未捕获异常的 C++ 调用堆栈在这里
msado15.dll!CQuery::SetSQL(unsigned short *) Unknown Non-user code. Symbols loaded.
msado15.dll!CQuery::SetCommandText(long,unsigned long,unsigned char,unsigned char) Unknown Non-user code. Symbols loaded.
msado15.dll!CQuery::Execute(enum ExecuteTypeEnum,char,unsigned long,bool,unsigned long,unsigned long,long,struct tagVARIANT *,unsigned long,void *,long *,struct _ADORecordset * *) Unknown Non-user code. Symbols loaded.
msado15.dll!CCommand::_Execute(enum ExecuteTypeEnum,char,unsigned long,bool,unsigned long,unsigned long,long,long,struct tagVARIANT *,unsigned long,void *,long *,struct _ADORecordset * *) Unknown Non-user code. Symbols loaded.
msado15.dll!CCommand::ExecuteWithModeFlag(struct tagVARIANT *,struct tagVARIANT *,long,struct _ADORecordset * *,int) Unknown Non-user code. Symbols loaded.
msado15.dll!CCommand::Execute(struct tagVARIANT *,struct tagVARIANT *,long,struct _ADORecordset * *) Unknown Non-user code. Symbols loaded.
VBE7.DLL!1e813579() Unknown No symbols loaded.
[Frames below may be incorrect and/or missing, no symbols loaded for VBE7.DLL] Annotated Frame
VBE7.DLL!1e7cff4b() Unknown No symbols loaded.
VBE7.DLL!1e829d13() Unknown No symbols loaded.
VBE7.DLL!1e82fea2() Unknown No symbols loaded.
VBE7.DLL!1e82bcb5() Unknown No symbols loaded.
[External Code] Annotated Frame
调用堆栈清楚地显示了 msado15.dll
内部引发的异常我想这个用例没有定期测试,但我会对任何建议感兴趣。
请问如何停止崩溃?
ADO,OLEDB 上的 COM 自动化包装器,查询 OLEDB 的 ICommandText 接口。它没有抱怨接口未实现,而是继续使用 NULL 命令文本并崩溃。
我以为这一切都曾经有效,但由于某种原因不再有效(OLEDB 与 ADO 结合使技术相当复杂),支持命令的 ATL 模板实现了接口但在查询时不回答对于.
因此,要解决此问题,只需将 ATL 条目添加到命令对象的服务接口即可:
BEGIN_COM_MAP(CFindFilesCommand)
...
COM_INTERFACE_ENTRY(ICommandText)
...
END_COM_MAP()