![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
VC
文章平均质量分 63
slj_win
这个作者很懒,什么都没留下…
展开
-
extern "C" 的用意
前些天,编程序是用到了很久以前写的C程序,想把里面的函数利用起来,连接发现出现了找不到具体函数的错误:以下是假设旧的C程序库C的头文件/*-----------c.h--------------*/#ifndef _C_H_#define _C_H_extern int add(int x, int y);#endifC的源文件/*-----------c.c-----转载 2016-10-08 15:08:04 · 479 阅读 · 0 评论 -
#undef
简介编辑#undef 是在后面取消以前定义的宏定义该指令的形式为#undef 标识符其中,标识符是一个宏名称。如果标识符当前没有被定义成一个宏名称,那么就会忽略该指令。一旦定义预处理器标识符,它将保持已定义状态且在作用域内,直到程序结束或者使用#undef 指令取消定义。2程序实例编辑预处理器在此程序中,我们将取消在先转载 2014-08-05 15:34:04 · 897 阅读 · 0 评论 -
vc下库文件的编写和调用
在网上搜索了一些关于库文件编写和调用的方法。在这里总结一下。一 、使用vc win32 static library的编写1. 打开Visual C++6.0编译软件,File->New;2. 在New对话框里选择"Win32 Static Libray";3. 填写Project name: "Writedll"; ,其中有两个选项,选择第一项,然后"OK"->"Fi转载 2014-06-19 20:48:19 · 678 阅读 · 0 评论 -
extern "C" 与 __stdcall使用
extern "C" __declspec (dllexport) char* __stdcall SQLFetch(const char* fieldname);C語言中extern cc与c++程序连接问题 它们之间的连接问题主要是因为c c++编绎器对函数名译码的方式不能所引起的,考虑下面两个函数 /* c*/ int strlen(char* string) { .转载 2014-06-19 09:33:21 · 1591 阅读 · 0 评论 -
VC2008如何生成及使用DLL(完整版)
Dot net VC2008 DLLDot net生成、使用DLL看起来简单,但做起来才发现还是有一些地方需要注意的。1. 打开VS2008,新建一个VC工程,选择Win32类型,Win32项目: 2. 应用程序类型选择DLL,附加选项选择到处符号,公共头文件不要选择,然后点完成即可。3. 工程生成后需要修改属性,在配置属性的常规转载 2014-06-19 13:27:53 · 1008 阅读 · 0 评论 -
使用Def文件导出Dll文件
本文介绍如何使用Def文件制作DLL。 模块定义 (.def) 文件是包含一个或多个描述 DLL 各种属性的 Module 语句的文本文件。如果不使用 __declspec(dllexport) 关键字导出 DLL 的函数,则 DLL 需要 .def 文件。.def 文件必须至少包含下列模块定义语句:文件中的第一个语句必须是 LIBRARY 语句。此语句将转载 2014-06-19 10:02:28 · 580 阅读 · 0 评论 -
MFC动态链接库和WIN32动态链接库 及区别
(1)DLL的构成 每个应用程序都有一个入口函数WinMain,而每个DLL也有一个入口函数DllMain。DLL跟应用程序一样都含有资源、数据段和代码段。DLL跟应用程序的差别主要是DLL有符号输入表和符号输出表,以方便应用程序调用DLL中的函数。 因为DLL是由应用程序加载的,所以它本身没有虚拟的内存地址空间,它使用的是加载它的应用程序的地址空间。这种加载分转载 2014-06-18 22:02:55 · 2290 阅读 · 0 评论 -
extern "C" __stdcall对函数的使用声明
extern "C" __stdcall对函数的使用声明如下:1 extern "C":在当调用别人写的库时,注意库是使用何种编译器,若是C的,则你在用VC中的C++编译器调用时就得加#if defined(__cplusplus)extern "C" {#endif..........声明被调用的函数名转载 2014-06-19 09:44:02 · 2645 阅读 · 0 评论 -
VS2008的动、静态编译
前几天申请到微软学生中心账号,并成功通过验证,下载了传说中的“正版”VS2008专业版,并申请了正版KEY!结果安装后,才发现还是90天试用版,申请到的正版KEY也无效!!没办法,费了好大劲安装,占了好几G的空间,还是用吧。到网上找了个KEY,没想到反而成功升级到正式版,后又安装了SP1。一直是用VC6.0,突然升级到高版本,很多不适应,慢慢摸索了。开始写了个HelloVS转载 2014-06-03 11:45:02 · 3686 阅读 · 0 评论 -
在c++中虚函数和多态性是什么意思
虚函数是在基类中定义的,目的是不确定它的派生类的具体行为。例:定义一个基类:class Animal//动物。它的函数为breathe()//呼吸。再定义一个类class Fish//鱼 。它的函数也为breathe()再定义一个类class Sheep //羊。它的函数也为breathe()为了简化代码,将Fish,Sheep定义成基类Animal的派生类。然而Fish与Sheep的b转载 2014-07-23 20:44:03 · 781 阅读 · 0 评论 -
CString的GetBuffer用法,GetBuffer本质,GetBuffer常见问题解决方法
一.函数原型CString::GetBufferLPTSTR GetBuffer( int nMinBufLength );throw( CMemoryException );Return ValueAn LPTSTR pointer to the object’s (null-terminated) character buffer.ParametersnMinBuf转载 2014-07-23 14:26:08 · 1077 阅读 · 0 评论 -
template<class T>
//参考 http://prglab.com/cms/pages/c-tutorial/advanced-concepts/templates.php函数模板( Function templates)模板是通用语言的特性,模板又叫参数化类型(parametrized types)。利用模板机制可以显著减少冗余信息,能大幅度地节约程序代码,进一步提高面向对象程序的可重用性和维护性转载 2014-06-11 14:21:40 · 594 阅读 · 0 评论 -
try 和 catch 的用法
try{} catch(…){}以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的。例如下面的代码:try{BYTE* pch ;pch = ( BYTE* )00001234 ; //给予一个非法地址*pch = 6 ; //对非法地址赋值,会造成Access Violation转载 2014-05-26 10:13:28 · 798 阅读 · 0 评论 -
try catch throw用法
要防止因为异常产生的内存泄漏,可以使用智能指针,也可以用 __try { } __finally { } 《Windows核心编程》一书第23~25章是很好的参考资料。----------------------------------------------------try,catch,throw:try包含你要防护的代码 ,称为防护块. 防转载 2014-05-26 10:15:56 · 2204 阅读 · 0 评论 -
C++中引用(&)的用法和应用实例
对于习惯使用C进行开发的朋友们,在看到c++中出现的&符号,可能会犯迷糊,因为在C语言中这个符号表示了取地址符,但是在C++中它却有着不同的用途,掌握C++的&符号,是提高代码执行效率和增强代码质量的一个很好的办法。在 c++学习提高篇(3)---隐式指针的文章中我详细介绍了在隐式指针&的用法,其实这两个概念是统一的。引用是C++引入的新语言特性,是C++常用的一个重要内容之一,正确、转载 2014-06-09 16:52:28 · 499 阅读 · 0 评论 -
WaitForSingleObject介绍
用户模式的线程同步机制效率高,如果需要考虑线程同步问题,应该首先考虑用户模式的线程同步方法。 但是,用户模式的线程同步有限制,对于多个进程之间的线程同步,用户模式的线程同步方法无能为力。这时,只能考虑使用内核模式。 Windows提供了许多内核对象来实现线程的同步。对于线程同步而言,这些内核对象有两个非常重要的状态:“已通知”状态,“未通知”状态(也有翻译为:受信状态,未受信状转载 2014-06-08 14:28:46 · 643 阅读 · 0 评论 -
WaitForSingleObject
临界区临界区是一种最简单的同步对象,它只可以在同一进程内部使用。它的作用是保证只有一个线程可以申请到该对象void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection );产生临界区void DeleteCriticalSection(LPCRITICA转载 2014-06-08 14:27:50 · 1345 阅读 · 0 评论 -
VS2008 创建DLL和调用DLL
隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当中。隐式链接必须的文件:lib .显式链接是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。不过实现显式链接要麻烦一些。在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态链接转载 2014-06-05 14:10:50 · 667 阅读 · 0 评论 -
sprintf格式化长整形的问题
sprintf("%ld,%d",int64,int)我用sprintf格式化64位整数,用%d或者%ld结果都不对,它取不到64位,在它后面的格式化位就会被冲掉。C里难道不支持64位吗?还是我用%d或者%ld不对呢?c++这样写sprintf("%I64d,%d",int64,int)转载 2014-08-13 12:11:08 · 8240 阅读 · 0 评论 -
常用数据类型在32位和64位CPU上的字节数比较
测试语句(C语言):printf("char[%d] char*[%d] s_int[%d] int[%d] u_int[%d] float[%d] double[%d] long[%d] LL[%d] UL[%d]/n", sizeof(char),sizeof(char *), sizeof(short int),sizeof(int),si转载 2014-08-13 12:20:05 · 1288 阅读 · 0 评论 -
C++类(Class)总结
一、C++类的定义 C++中使用关键字 class 来定义类, 其基本形式如下:class 类名{public://公共的行为或属性 private://公共的行为或属性}; 示例: 定义一个点(Point)类, 具有以下属性和方法: ■ 属性: x坐标, y坐标 ■ 方法: 1.设置x,y的坐标值; 2.输出坐标的转载 2016-05-23 15:05:31 · 671 阅读 · 0 评论 -
进程间通信与线程间通信 . windows下多线程通信方法 Linux 多线程通信
操作系统的主要任务是管理计算机的软件、硬件资源。现代操作系统的主要特点是多用户和多任务,也就是程序的并行执行,windows如此linux也是如此。所以操作系统就借助于进程来管理计算机的软、硬件资源,支持多任务的并行执行。要并行执行就需要多进程、多线程。因此多进程和多线程间为了完成一定的任务,就需要进行一定的通信。而线程间通信又和进程间的通信不同。由于进程的数据空间相对独立而线程是共享数据空间的,转载 2016-03-08 10:11:26 · 2567 阅读 · 0 评论 -
Win32多线程编程 — 线程同步与通信
一.线程间数据通信系统从进程的地址空间中分配内存给线程栈使用。新线程与创建它的线程在相同的进程上下文中运行。因此,新线程可以访问进程内核对象的所有句柄、进程中的所有内存以及同一个进程中其他所有线程的栈。这样一来,同一个进程中的多个线程可以很容易的相互通信。到目前为止,将数据从一个线程传到另一个线程的惟一方法是在创建线程时传递给新线程一个指针参数(LPVOID lpParam)。参数lpPa转载 2016-03-07 11:05:04 · 1375 阅读 · 0 评论 -
[VC]SendMessage和PostMessage发送消息(不同进程传递字符串)
一、函数功能该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。二、函数原型SendMessage函数的原型为 LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam,转载 2014-11-04 22:13:49 · 5640 阅读 · 0 评论 -
用PostMessage或SendMessage发送结构体指针
SendMessage可以随意发送结构体指针。PostMessage则必须注意结构体的生命周期。例如如下发送代码,使用PostMessage: struct _tag_aa { CString s1; char szBuffer[512]; int a; char* sz转载 2014-11-04 22:13:26 · 5908 阅读 · 0 评论 -
对SendMessage与PostMessage的理解
学习VC++近几个月的时间了。 现在回过头来回想消息机制时,对SendMessage与PostMessage的区别与联系仍然是懵懵懂懂的。有些时候分不清到底是哪个发送消息后会立即返回。 因此,特别在这些记录一下,以备不时不需: 1、消息结构体:1typedef struct tagMsg2{3 HWND hWnd;4 UINT msg转载 2014-11-04 22:11:50 · 688 阅读 · 0 评论 -
网络通信时字节序转换原理与网络字节序、大端和小端模式
引言:在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换。原因如下:网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节。小端模式的多字节数据在存放时,低地址存放的是低字节,而被发送方网络协议函数发送时会首先去低地址取数据(想要取高字节,真正取得是低字节),接转载 2014-11-04 10:06:56 · 958 阅读 · 0 评论 -
COMMTIMEOUTS详解
COMMTIMEOUTS 结构体被用在SetCommTimeouts和GetCommTimeouts 函数中,以便设置和查询通讯设备的超时参数。这个参数决定ReadFile,WriteFile, ReadFileEx, 和WriteFileEx 操作设备的行为。 typedef struct _COMMTIMEOUTS { DWORD ReadIntervalTimeout;转载 2014-10-10 17:36:35 · 2614 阅读 · 0 评论 -
MFC中char*,string和CString之间的转换
一、 将CString类转换成char*(LPSTR)类型方法一,使用强制转换。例如: CString theString( "This is a test" ); LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString; 方法二,使用strcpy。例如: CString theString( "This is a test" ); LPT转载 2014-10-07 14:47:12 · 774 阅读 · 0 评论 -
结构体含CString成员
问题如下:我定义了如下的一个结构体:typedef struct{ CString csText;}MyStruct;并有如下的程序段1:MyStruct * p=NULL;p=(MyStruct *)malloc(sizeof(MyStruct));if(!p) AfxMessageBox("分配内存失败!");else{转载 2014-10-07 14:40:18 · 1255 阅读 · 0 评论 -
Run-Time Check Failure #3 使用未初始化的变量
typedef struct DIR{ CString str;}WATCHDIR, *PWATCHDIR;PWATCHDIR pDir;pDir->str = "E:\\"; 调试的时候出现一个警告: warning C4700: 使用了未初始化的局部变量“pDir”运行的时候出现一个错误:Run-Time Check F转载 2014-10-07 14:21:18 · 9239 阅读 · 0 评论 -
“当前不会命中断点。源代码与原始版本不同”的问题的有效解决办法
开发时有一个工程的一个文件的断点无效,VS 2005提示说当前不会命中断点。源代码与原始版本不同,请在断点选项里设置允许源代码与原始版本不同。这个是针对单个断点进行设置。如果要对所有的断点进行设置,则要在“工具”——〉“选项”——〉“调试”——〉“要求源文件与原始版本完成匹配”去掉勾。 实际上有比这个办法更好的办法,就是将出问题的文件用notepad打开,然后另存为Unicode编码转载 2014-10-07 14:16:42 · 918 阅读 · 0 评论 -
Run-Time Check Failure #0
动态加载dll后,执行导出的C API发生运行时错误:Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling con转载 2014-10-07 14:15:13 · 1177 阅读 · 0 评论 -
C++模板(二)
四、类模板的默认模板类型形参 1、可以为类模板的类型形参提供默认值,但不能为函数模板的类型形参提供默认值。函数模板和类模板都可以为模板的非类型形参提供默认值。 2、类模板的类型形参默认值形式为:template class A{};为第二个模板类型形参T2提供int型的默认值。 3、类模板类型形参默认值和函数的默认参数一样,如果有多个类型形参则从第一个形参设定了默认值之后的所转载 2014-08-27 16:26:42 · 490 阅读 · 0 评论 -
C++ 模板详解(一)
C++模板 模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。 模板是一种对类型进行参数化的工具; 通常有两种形式:函数模板和类模板; 函数模板针对仅参数类型不同的函数; 类模板针对仅数据成员和成员函数类型不同的类。 使用模板的目的就是能够让程序转载 2014-08-27 16:01:12 · 465 阅读 · 0 评论 -
VC++常用数据类型
一. VC常用数据类型列表二. 常用数据类型转化2.1数学类型变量与字符串相互转换2.2 CString及string,char *与其他数据类型的转换和操作●CString,string,char*的综合比较●数学类型与CString相互转化●CString与char*相互转换举例●CString 与 BSTR 型转转载 2014-08-13 12:36:16 · 653 阅读 · 0 评论 -
do...while(0)的妙用(转)
在C++中,有三种类型的循环语句:for, while, 和do...while, 但是在一般应用中作循环时, 我们可能用for和while要多一些,do...while相对不受重视。 但是,最近在读我们项目的代码时,却发现了do...while的一些十分聪明的用法,不是用来做循环,而是用作其他来提高代码的健壮性。1. do...while(0)消除goto语句。通常,如果在一个转载 2014-08-13 12:28:24 · 562 阅读 · 0 评论 -
_beginThreadex创建多线程解读
_beginThreadex创建多线程解读一、需要的头文件支持 #include // for _beginthread()需要的设置:ProjectàSetting-->C/C++-->User run-time library 选择Debug Multithreaded 或者Multithreaded。即使用: MT或MTD。源码如下:转载 2014-06-06 10:08:21 · 583 阅读 · 0 评论 -
WINAPI宏
一直搞不懂为什么在函数前面加上WINAPI、CALLBACK等是什么意思 又不是返回值 为什么加在前面 今天终于知道了 这是一个呼叫声明(姑且称之吧)。引子:看看这个函数:int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw){ MSG msg;转载 2014-06-23 14:54:22 · 2255 阅读 · 0 评论 -
vs2008无法执行添加/移除操作,因为代码元素**是只读的
在vs中,大量添加窗体或者控件后,发现无法由系统IDE自动生成代码,如自动添加按钮响应函数等,rc管理器界面双击按钮添加函数,会出现 提示框 “无法执行添加/移除操作,因为代码元素**是只读的”。开始认为可能是对应的.cpp和.h被加了只读属性,后来发现是工程的ncb文件引起的。解决方案:关闭vs,删除工程对应的.ncb文件,重启vs就好了。问题原因:NCB是no compile brow转载 2014-03-11 14:19:00 · 3909 阅读 · 0 评论