【问题标题】:Using MSADO15.DLL and C++ with MinGW/GCC on Windows Vista在 Windows Vista 上将 MSADO15.DLL 和 C++ 与 MinGW/GCC 一起使用
【发布时间】:2011-02-12 19:08:49
【问题描述】:

简介

嗨,

我对 C++ 很陌生,这是我的第一句话。

我最初是从 VC++ 2008 Express 开始的,我注意到 GCC 已成为一种标准,因此我试图从一开始就制定正确的步骤。

我已经编写了一段通过 ADO 连接到 MSSQL Server 的代码,在 VC++ 上它通过导入 MSADO15.dll 就像一个魅力:

#import "msado15.dll" no_namespace rename("EOF", "EndOfFile")

因为我要从 VC++ 迁移,所以我一直在寻找替代(最终是多平台)IDE,所以我坚持(这次)使用 Code::Block(我在使用昨晚的构建, SVN 6181)。

作为编译器,我选择在 Vista 下使用 GCC 3.4.5(通过 MinGW 5.1.6 移植)。

我试图用 GCC 编译一个简单的“hello world”应用程序,它使用/导入相同的 msado15.dll (#import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename( "EOF", "EndOfFile")),我很惊讶地看到很多编译时错误。

我预计#import 编译器的指令将从“msado15.dll”生成一个库,以便稍后链接到它(链接编辑时间或其他)。相反,它试图将其作为普通文件读取(如头文件,如果您愿意),因为它试图解释 DLL 中的每一行(具有 MZ 签名):

例子:

编译:main.cpp
E:\MyPath\main.cpp:2:64:警告:#import 指令末尾的额外标记
在 E:\MyPath\main.cpp:2:
中包含的文件中 c:\Program Files\Common Files\System\ADO\msado15.dll:1: 错误:程序中出现错误“\144”
在 E:\MyPath\main.cpp:2 包含的文件中: c:\Program Files\Common Files\System\ADO\msado15.dll:1:4:警告:空字符被忽略
c:\Program Files\Common Files\System\ADO\msado15.dll:1: 错误:程序中出现杂散“\3” c:\Program Files\Common Files\System\ADO\msado15.dll:1:6:警告:空字符被忽略
c:\Program Files\Common Files\System\ADO\msado15.dll:1: 错误:程序中出现杂散“\4” ...
等等。

我的问题

嗯,很明显,在这个版本的 GCC 下,#import 指令没有完成预期的工作(也许 GCC 不再支持 #import),所以最后我的问题是:

  • 如何在使用 GCC (v3.4.5) 编译的 C++ 程序上使用 ADO 访问 MSSQL 数据库?

【问题讨论】:

    标签: c++ gcc ado mingw windows-vista


    【解决方案1】:

    您尝试以非常非标准且特定于 MSVC 的方式导入 COM 对象会发生什么...

    AFAIK 对 COM 与 MSYS 的支持还远远不够完善,在 google 中搜索:“组件对象模型”和 gcc。

    我建议使用FreeTDS 或SOCI 之类的库与MS-SQL 进行通信。也是跨平台的;-)

    【讨论】:

    • MSYS 与它有什么关系?
    • 感谢您这么快的回复。我担心你会这么说,Chris Becke 和 Neil Butterworth(见下面的回复)已经指出了根本问题。谢谢,我将尝试使用 FreeTDS,因为我对以前的一些 PHP“项目”感到满意。
    【解决方案2】:

    #import 指令不是标准 C++ 编程语言的一部分。我不知道它在 GCC 中做了什么(如果有的话)。使用 DLL 的常规方法是在代码中包含它的头文件,然后链接到它的导入库(.LIB 文件)。我从来没有在 ADO 中编程过,但是在 ODBC 中你会

    #include <sql.h>
    

    以及编译/链接时

    g++ mystuff.cpp -lodbc32
    

    获取导入库。

    另外,您使用的 MinGW 编译器版本非常旧。您可以通过http://tdragon.net/recentgcc 获得更新的版本。

    【讨论】:

    • 嗨,我尝试使用(在您发布答案前几分钟)随 gcc 提供的 sql.h 标头。看起来不错,我有点固执地坚持使用 ADO 只是因为我已经有一个小应用程序,它可以用 MSVC++ 编译得很好。我还安装了 cygwin,并尝试从 msado15.dll 文件生成 .a 库。 nm bash 命令刚刚说“msado15.dll 中没有符号”,所以似乎 dll 符号已被剥离。我看到了 TDM-GCC 网页,但我不鼓励使用它,因为它是“非官方的”。我会试试看。非常感谢。
    【解决方案3】:

    GCC 和 MSVC 使用 #import 来处理不同的事情。 在 GCC 中,#import 是 #include 的一个 Objective-c 变体,它只包含一次头文件。 在 MSVC 中,#import 触发 Microsoft 扩展,该扩展从 COM 类型库构建智能指针实现和头文件。

    在 GCC 中,您将不得不以老式方式导入 COM 对象。查找现有接口定义或使用 OleSpy 等工具从 tlb 生成定义。

    【讨论】:

    • 嗨,你说得对,我已经在维基百科的一篇文章中找到了这个解释。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多