您好,
我是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:错误:stray'\ 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:错误:stray'\ 3'在程序中 c:\ Program Files \ Common Files \ System \ ADO \ msado15.dll:1:6:警告:忽略空字符
c:\ Program Files \ Common Files \ System \ ADO \ msado15.dll:1:错误:stray'\ 4'在程序中 ...
等等。
嗯,显然在这个版本的GCC下#import指令不能完成预期的工作(GCC可能不再支持#import),所以最后我的问题:
答案 0 :(得分:1)
#import指令不是标准C ++编程语言的一部分。我不知道它在GCC中做了什么(如果有的话)。使用DLL的常规方法是在代码中包含其头文件,然后链接到其导入库(.LIB文件)。我从来没有在ADO中编程,但在ODBC中你会
#include <sql.h>
以及编译/链接时
g++ mystuff.cpp -lodbc32
获取导入库。
此外,您使用的MinGW编译器的版本非常旧。您可以在http://tdragon.net/recentgcc获得更新的更新信息。
答案 1 :(得分:1)
您尝试以非标准和MSVC特定的方式导入COM对象...
AFAIK COM与MSYS的支持远未开始完善,搜索:“组件对象模型”和google中的gcc。
答案 2 :(得分:0)
GCC和MSVC使用#import进行不同的事情。 在GCC中,#import是#include的Objective-c变体,只包含头文件一次。 在MSVC中,#import触发Microsoft扩展,该扩展从COM类型库构建智能指针实现和头文件。
在GCC中,您将不得不以旧式方式导入COM对象。查找现有的接口定义或使用OleSpy之类的工具从tlb生成定义。