vc运行时候的配置:
VC编译选项 多线程(/MT)
多线程调试(/MTd)
多线程 DLL (/MD)
多线程调试 DLL (/MDd)
——————————————————————————————————
C 运行时库 库文件
Single thread(static link) ML libc.lib
Debug single thread(static link) MLd libcd.lib
MultiThread(static link) MT libcmt.lib
Debug multiThread(static link) MTd libcmtd.lib
MultiThread(dynamic link) MD msvert.lib
Debug multiThread(dynamic link) MDd msvertd.lib
——————————————————
3. 各种 C 运行时库的区别
( 1 )静态链接的单线程库
静态链接的单线程库只能用于单线程的应用程序, C 运行时库的目标代码最终被编译在应用程序的二进制文件中。通过 /ML 编译选项可以设置 Visual C++ 使用静态链接的单线
程库。
( 2 )静态链接的多线程库
静态链接的多线程库的目标代码也最终被编译在应用程序的二进制文件中,但是它可以在多线程程序中使用。通过 /MT 编译选项可以设置 Visual C++ 使用静态链接的多线程库。
( 3 )动态链接的运行时库
动态链接的运行时库将所有的 C 库函数保存在一个单独的动态链接库 MSVCRTxx.DLL 中, MSVCRTxx.DLL 处理了多线程问题。使用 /MD 编译选项可以设置 Visual C++ 使用动态
链接的运行时库。
/MDd 、 /MLd 或 /MTd 选项使用 Debug runtime library( 调试版本的运行时刻函数库 ) ,与 /MD 、 /ML 或 /MT 分别对应。 Debug 版本的 Runtime Library 包含了调试信息
,并采用了一些保护机制以帮助发现错误,加强了对错误的检测,因此在运行性能方面比不上 Release 版本。
----------------------------------------------------------------------------------
下面是msdn关于Visual C++ 编译器选项的说明:
这些选项选择单线程或多线程运行时例程,指示多线程模块是否为 DLL,并选择运行时库的发布版本或调试版本。
选项 说明
/MD 定义 _MT 和 _DLL 以便同时从标准 .h 文件中选择运行时例程的多线程特定版本和 DLL 特定版本。此选项还使编译器将库名 MSVCRT.lib 放入 .obj 文件中。
用此选项编译的应用程序静态链接到 MSVCRT.lib。该库提供允许链接器解析外部引用的代码层。实际工作代码包含在 MSVCR71.DLL 中,该库必须在运行时对于与 MSVCRT.lib 链
接的应用程序可用。当在定义了 _STATIC_CPPLIB (/D_STATIC_CPPLIB) 的情况下使用/MD 时,它将导致应用程序通过静态多线程标准 C++ 库 (libcpmt.lib) 而非动态版本 (msvcprt.lib) 进行链接,同时仍通过 msvcrt.lib 动态链接到主 CRT。
/MDd 定义 _DEBUG、_MT 和 _DLL,以便从标准 .h 文件中选择运行时例程的调试多线程特定版本和 DLL 特定版本。它还使编译器将库名 MSVCRTD.lib 放入 .obj 文件中。
/ML 使编译器将库名 LIBC.lib 放入 .obj 文件中,以便链接器使用 LIBC.lib 解析外部符号。这是编译器的默认操作。LIBC.lib 不提供多线程支持。
/MLd 定义 _DEBUG 并使编译器将库名 LIBCD.lib 放入 .obj 文件中,以便链接器使用 LIBCD.lib 解析外部符号。LIBCD.lib 不提供多线程支持。
/MT 定义 _MT,以便从标准头 (.h) 文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名 LIBCMT.lib 放入 .obj 文件中,以便链接器使用 LIBCMT.lib 解析
外部符号。创建多线程程序需要 /MT 或 /MD(或它们的调试等效选项 /MTd 或 /MDd)。
/MTd 定义 _DEBUG 和 _MT。定义 _MT 会导致从标准 .h 文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名 LIBCMTD.lib 放入 .obj 文件中,以便链接器使
用 LIBCMTD.lib 解析外部符号。创 建多线程程序需要 /MTd 或 /MDd(或它们的非调试等效选项 /MT 或 MD)。
/LD 创建 DLL。
将 /DLL 选项传递到链接器。链接器查找 DllMain 函数,但并不需要该函数。如果没有编写 DllMain 函数,链接器将插入返回 TRUE 的 DllMain 函数。
链接 DLL 启动代码。
如果命令行上未指定导出 (.exp) 文件,则创建导入库 (.lib);将导入库链接到调用您的 DLL 的应用程序。
将 /Fe 解释为命名 DLL 而不是 .exe 文件;默认程序名成为基名称.dll 而不是基名称.exe。
如果还未显式指定 /M 选项之一,则将默认运行时库支持更改为 /MT。
/LDd 创建调试 DLL。定义 _DEBUG。
警告 不要混合使用运行时库的静态版本和动态版本。在一个进程中有多个运行时库副本会导致问题,因为副本中的静态数据不与其他副本共享。链接器禁止在 .exe 文件内
部既使用静态版本又使用动态版本链接,但您仍可以使用运行时库的两个(或更多)副本。例如,当与用动态 (DLL) 版本的运行时库链接的 .exe 文件一起使用时,用静态(非
DLL)版本的运行时库链接的动态链接库可能导致问题。(还应该避免在一个进程中混合使用这些库的调试版本和非调试版本)。
________________________________
com相关:
BSTR是COM中默认的字符串数据格式,和char* 及std::string等不同,BSTR is a null-terminated, length-prefixed
, unicode string.
下面是一个非常好的对BSTR的解释: A bstr is a pointer to a string of wide char. The
string is not terminated. Instead, the length of the string is stored
as an unsigned long just before the first character of the string.
(这一点和普通的 *char很不同,因为*char 指针指向的是该串的第一个字符,而bstr的指针是指向该字符串的长度) You might
think that you could create a bstr the c++ way, by creating a structure
and then returning a pointer to the second element, cast to bstr, but
you should never do this! the memory pointed to by a bstr is actually
owned by Windows. Becaust a bstr's memory is owned by Windows, you can
safely pass a bstr between processes. Instead, you can use the function
SysAllocString()
to create a bstr, and the function
SysFreeString() to destroy it properly. In fact, you should only use
platform SDK functions (or helper classes that use them internally) to
manipulate bstrs.
缺点: most of the string manipulation functions normaly taken for
granted, such as finding a substring, comparing two strings, and so on,
are missing
. Most significantly, there seems to be no function to copy a bstr.
CComBSTR: 是ATL中的一个类, this class is wrapper for BSTR,
_bstr_t: 是BSTR的封装类,实际上是一个smart pointer,
it encapsulates the BSTR
date type. It manages resource allocation and deallocation through
function calls to SysAllocString / SysFreeString and other BSTR APIs.
_bstr_t 其实相当于一个带有引用计数的智能指针。
_bstr_t: is "native COM support" class. And CComBSTR is the ATL
class. the two classes are very similar. Both will take care of
allocating and deallocating the wrapped bstr in the class constructor
and destructor. They also can be used to take charge of an existing
bstr with the Attach() method, or can be made to abandon the bstr with
Detach() method. The have helpful operators and methods to compare two
string, copy a string, and so on. In many cases, _bstr_t and CComBSTR
instances can be passed as bstr substitues. (
但要注意:有时候不恰当的使用这两个类来代替bstr有可能会造成内存泄露)
CComBSTR和 _bstr_t 都是BSTR的wrapper,但实现机制不同, _bstr_t更通用些,不过如果使用ATL的话,可能 CComBSTR更方便些。
————————————————————————
char, BSTR, _bstr_t, CComBSTR之间的互相转换
char:
To BSTR:
_com_util::ConvertStringToBSTR
CString的AllocSystemString
To _bstr_t:
_bstr_t的构造函数
To CComBSTR:
CComBSTR的构造函数
BSTR:
To char:
_com_util::ConvertBSTRToString
To _bstr_t:
_bstr_t的构造函数
To CComBSTR:
CComBSTR的构造函数
_bstr_t:
To char:
LPCTSTR操作符
To BSTR:
BSTR操作符
To CComBSTR:
先使用BSTR操作符转换成BSTR, 再使用CComBSTR的构造函数
CComBSTR:
To char:
LPCTSTR操作符
To BSTR:
BSTR操作符
To _bstr_t:
先使用BSTR操作符或直接取其m_str成员, 作为_bstr_t的构造函数
由于CComBSTR中的数据成员BSTR m_str公开, 而且重载了&操作符, 适合作为以BSTR作为传出参数的函数, 但要注意内存泄漏问题, 不要将已赋值的CComBSTR作为传出参数
分享到:
相关推荐
标题中的“键盘记录vc 源代码键盘记录器”指的是一个使用Visual C++(简称VC)编写的程序,它的功能是记录键盘输入。这类程序通常被称为键盘钩子(hook)或键盘记录器(keyboard logger),它通过监视系统底层的键盘...
5. **编程接口(API)**:在清理历史记录和缓存的过程中,可能需要调用操作系统提供的API,例如Windows API,来访问和修改系统设置。 6. **文件操作**:源码可能涉及到读取、遍历和删除特定类型的文件,如浏览历史...
7. **示例代码**:`KeybHook_examples`可能包含了一些示例代码,展示了如何在VC++项目中实现键盘记录功能。这些例子可能涵盖了从安装钩子、处理键盘事件到写入日志文件的完整流程,是学习和理解键盘记录技术的好资源...
标题 "键盘记录vc" 暗示我们正在讨论一个使用Visual C++(VC)编写的键盘记录器程序。键盘记录器是一种软件工具,用于捕获并记录用户在计算机上键入的所有字符,通常用于安全监控、数据分析或恶意活动。在这个上下...
本文将详细探讨“VC日志记录类”的实现及其特点,以`LogFile.cpp`和`LogFile.h`两个文件为核心,我们将深入理解如何在多线程环境下有效地管理和维护日志。 首先,`LogFile.h`文件通常会定义一个名为`LogFile`的类,...
标题中的“基于VC的键盘记录”指的是使用Microsoft Visual C++(简称VC)这一集成开发环境,编写出能够监控并记录键盘输入的程序。在计算机安全领域,这种技术有时被用于合法的系统监控,例如企业对员工电脑使用情况...
本文将深入探讨标题"vc键盘记录源码"所涉及的知识点。 首先,我们要理解什么是键盘截获。在Windows环境下,键盘事件的处理是由操作系统内核完成的。开发者可以通过安装钩子(Hook)来拦截这些事件,从而在键盘事件...
### VC编译参数设置详解 #### 一、概述 本文档详细介绍了Visual C++ (VC) 编译器中的各种编译参数及其设置方法。这些参数对于开发人员来说非常重要,因为它们直接影响到编译过程、代码质量以及最终生成的可执行...
标题“VC 设置系统时间2”指的是使用Visual C++(简称VC)编程语言来修改操作系统的当前时间。在Windows操作系统中,程序通常通过调用特定的API(应用程序接口)函数来改变系统时间。这个主题涉及到的知识点包括: ...
当涉及到“中文的键盘记录vc代码”时,我们讨论的是使用Visual C++(VC++)编程语言编写的一种程序,该程序能够捕获并记录用户在中文输入法下的按键行为。 首先,我们要了解键盘事件处理。在Windows操作系统中,...
根据标签,我们可以看到关键词"vc_键盘"、"vc_键盘记录"、"按键_记录"和"按键记录",这些都是与主题相关的关键词,进一步确认了这个项目的核心是关于使用VC++进行键盘输入监控。 尽管没有具体的文件内容,但根据...
自己DIY的键盘记录 1 编译键盘钩子中工程,在其Debug目录下生成hodll.dll 2 编译KeyLoger.dsw,生成键盘记录工具service.exe(为了隐蔽,我们故意生成迷惑性文件) 3 请将1中生成的hodll.dll与service.exe放于同一...
本教程将详细介绍如何在VC6环境下,通过ADO来修改数据库中的记录。首先,我们需要理解ADO的基本概念及其组成部分。 ADO是微软提供的一个数据访问接口,它简化了对数据库的操作,使得程序员无需深入学习底层数据库...
### VC++键盘记录器知识点详解 #### 一、键盘记录器概述 键盘记录器是一种软件程序,用于捕获并记录用户在键盘上输入的所有按键。这类工具最初设计用于辅助功能,如帮助用户追踪其计算机使用习惯,或者在密码遗忘...
本文将深入探讨如何使用Visual C++(VC)来清除这些记录,主要关注的是通过C++编程实现这一功能。我们将分析提供的文件列表,并讲解其中涉及到的关键代码和编程概念。 首先,"HistoryClear"项目看起来是一个小型的...
【VC版键盘记录源代码】是一个关于Windows操作系统下的键盘输入监控程序的开发资源,主要针对的是使用Visual C++(简称VC)编译器的开发者。这个项目提供了键盘记录功能的原始编程代码,允许程序员理解并学习如何在...
这个压缩包文件"visual c++ VC设置屏幕分辨率的代码.zip"包含了实现这一功能的相关源代码文件。下面,我们将详细讨论如何通过VC++来设置屏幕分辨率,并解释压缩包中的每个文件的作用。 首先,我们要理解屏幕分辨率...
在Microsoft Visual C++ 6.0(简称VC6.0)这款经典的开发环境中,开发者们经常需要对界面进行个性化设置,以提高代码编辑的舒适度和应用的视觉效果。本篇将详细介绍如何在VC6.0中修改字体颜色以及对话框的背景颜色,...
1) General:一些总体设置。 • Warning level 用来控制警告信息,其中Level 1是最严重的级别; • Warnings as errors 将警告信息当作错误处理; • Optimizations 代码优化,可以在Category的Optimizations...
在标题中提到的"VC实现的日志记录类",它设计的核心目标是便于日志的记录。为了实现这一目标,我们可以考虑以下关键特性: 1. **多线程支持**:在多线程环境下,确保日志记录的线程安全是非常重要的。这意味着需要...