代码之家  ›  专栏  ›  技术社区  ›  S Meaden

OLIDB-C++ +ATL的OLDB提供程序示例崩溃Excel(来自MSADO15.DLL的UNEUT异常)

  •  1
  • S Meaden  · 技术社区  · 7 年前

    我已经编译了示例OLEDB提供程序代码,该代码来自于运行 vs2007 atl oledb provider wizard 。我已经在那篇博文中给出了更详尽的细节。代码崩溃Excel。

    sub-testoledbprovider()。
    
    出错时转到错误
    
    
    作为ADODB.Connection的Dim CN
    设置cn=new adodb.connection
    
    cn.open“provider=findfiles;server=foo;database=bar”'*这有效
    
    将命令变暗为adodb.command
    set cmd=new adodb.command
    
    set cmd.activeconnection=cn'*这个工作
    
    cmd.commandText=“*.*”'*这是有效的
    
    停止
    将rs变暗为ADodb.记录集
    set rs=cmd.execute'*此处崩溃
    
    出口接头
    错误:
    debug.print err.description(“&err.number&“)”
    '停止
    
    末端接头
    

    上面的代码会使Excel在set rs=cmd.execute>行崩溃。如果我从VS2017调试,我会得到未处理的异常

    < P> C++调用栈的异常例外在这里

    msado15.dll!cquery::setsql(unsigned short*)未知的非用户代码。符号已加载。
    msado15.dll!cquery::setcommandtext(long,unsigned long,unsigned char,unsigned char)未知的非用户代码。符号已加载。
    msado15.dll!cquery::execute(enum executetypeenum,char,unsigned long,bool,unsigned long,unsigned long,long,struct tagvariant*,unsigned long,void*,long*,struct ou adorecordset**)未知的非用户代码。符号已加载。
    msado15.dll!cCommand::_execute(enum executetypenum,char,unsigned long,bool,unsigned long,unsigned long,long,long,struct tagvariant*,unsigned long,void*,long*,struct ou adorecordset**)未知的非用户代码。符号已加载。
    msado15.dll!cCommand::ExecuteWithModeFlag(struct tagvariant*,struct tagvariant*,long,struct AdoreCordset**,int)未知的非用户代码。符号已加载。
    msado15.dll!ccommand::execute(struct tagvariant*,struct tagvariant*,long,struct aredecordset**)未知的非用户代码。符号已加载。
    vbe7.dll!1E813579()未知,未加载符号。
    [下面的帧可能不正确和/或丢失,没有为vbe7.dll加载符号]带批注的帧
    vbe7.dll!1E7CFF4B()未知,未加载符号。
    vbe7.dll!1E829D13()未知,未加载符号。
    vbe7.dll!1E82FEA2()未知,未加载符号。
    vbe7.dll!1E82BCB5()未知,未加载符号。
    [外部代码]带注释的框架
    

    调用堆栈显示在msado15.dll内部引发的异常。

    我可以想象这个用例没有被定期测试,但是我对任何建议都感兴趣。

    请不要撞车了?.我已经在那篇博文中给出了更详尽的细节。代码导致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
    

    上面的代码崩溃excel在线Set rs = cmd.Execute.如果我从VS2017调试,我会得到未处理的异常

    enter image description here

    未调用异常的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内部引发的异常。

    我可以想象这个用例没有被定期测试,但是我会对任何建议感兴趣。

    请不要撞车了?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Simon Mourier    7 年前

    ICommandText

    BEGIN_COM_MAP(CFindFilesCommand)
        ...
        COM_INTERFACE_ENTRY(ICommandText) 
        ...
    END_COM_MAP()
    
    推荐文章