附注:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
1、 用C++编写驱动DLL时的一些注意事项(.c和.cpp联编时注意事项与此同)
一般来讲首先要在声明导出函数的头文件中使用extern “C”{},以确保函数名称的匹配。对于驱动中的导出函数大多由操作系统定义,这一步由OS负责。以2000下打印处理器中的EnumPrintProcessorDatatypesW为例进行说明:
该函数在winspool.h 中的声明为:
BOOL
WINAPI
EnumPrintProcessorDatatypesW(
IN LPWSTR pName,
IN LPWSTR pPrintProcessorName,
IN DWORD Level,
OUT LPBYTE pDatatypes,
IN DWORD cbBuf,
OUT LPDWORD pcbNeeded,
OUT LPDWORD pcReturned
);
而在winspool.h的开始处有:
#ifdef __cplusplus
extern "C" {
#endif
结尾处有:
#ifdef __cplusplus
}
#endif
也就是说:对于EnumPrintProcessorDatatypesW进行编译和联接时按照C规范,参考指定的调用规则来生成文件名,而忽略扩展名是.c还是.cpp。对于上述函数因为采用WINAPI(stdcall)调用规则,对于msvc++,目标文件中生成的函数名为_EnumPrintProcessorDatatypesW@28。如果没有extern “C”,则对于C++文件,按照C++规范进行名字解析,结果可能是? EnumPrintProcessorDatatypesW@@YGHPAU_PRINTPROCESSOR@@K@Z(不一定真是这个名字,举例而已)。所以说要想在c和c++中通用某些函数,一定要用extern “C”。
由于函数命名规范,各种编译器之间并不一样。为了能在各种编译器间共用dll,就必须使用.def文件。.def 文件相当于给编译后的函数名又加了一个别名,但实际上两者仍是指向同一个东西(很象c++里的引用)。比如对2000的打印处理器的.def文件中有:
EXPORTS
EnumPrintProcessorDatatypesW
--------
这样打印处理器实际上就是以EnumPrintProcessorDatatypesW来导出这个函数的。至于导入时,msvc++怎么从截断后的EnumPrintProcessorDatatypesW对应到完整的_EnumPrintProcessorDatatypesW@28,我没找到相关资料。但Jeffrey Richter在Programming Application for Windows中说“Microsoft的联接程序进行了正确的操作。”
对于msvc++,这条规则对于C++程序也是成立的,即ms的连接器可以完成从类似EnumPrintProcessorDatatypesW这样的输出名到那一大砣C++名字的映射。这意味着什么呢?下面的结论属于某些场合可以用,但不大应该用的东西。如果只用ms的东西,可以在
dll中的实现函数,在应用中包含相关的头文件,在.def中指明函数名。什么都不用加(包括extern “C”,__declspec,dllimport,dllexport---)。
就象下面这样:
testdll.cpp ----àtestdll.exe应用程序
#include <windows.h>
#include <iostream>
using std::cout;
int WINAPI add(int i,int j);
int main(int argc, char* argv[])
{
int i=add(6,7);
cout<<i;
return 0;
}
mathadd.cpp -------àmathadddll dll程序
#include <windows.h>
int WINAPI add(int i,int j)
{
return i+j;
}
mathadd.def
LIBRARY MATHADD
EXPORTS
Add
这将运行的非常好。
关于__declspec(dllexport) : 如果不用.def的时候,用此关键字指明输出函数及变量。
关于__declspec(dllimport) : 便于编译器进行优化,可不使用。
2、Prefer C++的 6个部分:
1、类型系统
2、资源管理
3、出错处理
4、细说inline
5、模板及标准库◎
6、运行时多态
7、结构化,OO、GP
所有这些是我读来的,自己准备用到程序中的,也有些是经验。
希望C++的到更广泛的应用。
3.关于在vc++调试发布版本得技巧
首先要明确得是,只要有各种符号信息,发布版本是可调试得。想想Windows所带得Symbols就知道了。
操作步骤如下:
1.project setting->c/c++->debug info(组合框) 此处选Program Database
2. project setting->link 上选中Generate Debug Info
3. project setting->link 上Category 选debug 而后选中Generate mapfile和
Debug Info 和Microsoft format.
ps:
单就语言而论,我认为C++比C好,因为很多改进都是无数绝代高手根据现实中出现的问题,而导入的。也比其他各种语言强大,因为各种语言特性都是因为需要才被加入的。也正因此,所以他才复杂。
分享到:
相关推荐
Therefore, we prefer to minimize includes, particularly includes of header files in other header files. You can significantly minimize the number of header files you need to include in your own ...
1. 让自己习惯c++ accustoming yourself to c++ 条款01:视c++ 为一个语言联邦 view c++ as a federation of languages 条款02:尽量以const, enum, inline替换 #define prefer consts,enums, and inlines to #...
Prefer range member functions to their single-element counterparts...12 Item 6. Be alert for C++'s most vexing parse...................................................20 Item 7. When using containers...
### Effective C++ 关键知识点概览 #### 书籍概述与目的 - **书籍背景**:《Effective C++》由Scott Meyers撰写,侯捷翻译,是C++领域内一部非常著名的指南类书籍。该书旨在帮助程序员更好地理解和运用C++语言,...
### Google C++ Style Guide #### Table of Contents - **C++ Version** - **Header Files** - Self-contained Headers - The #define Guard - Forward Declarations - Inline Functions - Names and Order ...
Sure, there are the obvious answers: Qt's single-source compatibility, its feature richness, its C++ performance, the availability of the source code, its documentation, the high-quality technical ...
C++ 핵심 가이드라인(C++ Core Guidelines)은 C++ 언어의 최신 개발 패턴과 규칙을 제공하는 참고 자료입니다. 이 가이드라인은 Bjarne Stroustrup, 주도하에 Microsoft와 LLVM 프로젝트가 공동으로 제작하였습니다....
LUA is a scripting language, its power lies in the fact that it can be embedded in your C++ programs. Scripts give you the possibility to change the behaviour of your C++ programs without any need to ...
这个文件包含了三本书的详细知识点,想要快速过一下的话可以看这个 Effective C++ 一、让自己习惯C++ (Accustoming Yourself to C++ 11) 1. 视C++ 为一个语言联邦 11(View C++ as a federation of languages 11) ...
再加上我们的时间同步服务端的IP地址或者域名即可,其中prefer选项表示优先使用该时间同步服务器 #server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst #server 2.centos.pool.ntp.org ...
在C++编程语言中,复制构造函数(Copy Constructor)和赋值运算符(Assignment Operator)是两个非常关键的概念,特别是在处理对象的拷贝和赋值时。它们默认由编译器提供,但通常需要根据具体需求进行自定义,以确保正确...
navigational aids and waypoints) and on-screen text and menus (similar to the existing modeless ATC menus), and two new C++ samples have been added to demonstrate the new functions. The functions for...
options.setExecutionPreference(Interpreter.Options.ExecutionPreference.PREFER_NNAPI); interpreter = new Interpreter(modelFile, options); ``` 4. 执行预测:将输入数据传递给模型,获取预测结果。 ```java ...
TASM has full 8088, 8086, 80286, 80386, i486, and Pentium support, as well as interface support for C, C++, Pascal, FORTRAN, and COBOL. A full-screen interactive debugger (Turbo Debugger) is also ...
在某些情况下,比如WebLogic中的`prefer-web-inf-classes`配置项为true时,即使系统或应用类路径中有相同的类,WebLogic也会优先加载Web-INF目录下的类。这使得Web应用可以覆盖系统或应用级别的类定义,提供了更高的...
VCLZip Native Delphi Zip/UnZip Component! (VCLZip Lite: Version 2.23 April 14th, 2002) (VCLZip Pro: Version 3.10 Buid 1 - November 25th, 2007) IMPORTANT: If installing the registered version, ...
然后,我们怀疑是CMake的bug,于是查看了CMake的commit记录,发现了一个相关的commit(Kitware/CMake commit 68285bc8a91),该commit将FindThreads.cmake模块修改为遵从THREADS_PREFER_PTHREAD_FLAG变量的设置。...
Or, if you'd prefer, you can [contribute a small donation][2]. Both are very appreciated. ## Documentation Read the documentation at [http://vld.codeplex.com/documentation]...