易截截图软件、单文件、免安装、纯绿色、仅160KB
热门标签: c c# c++ asp asp.net linux php jsp java vb Python Ruby mysql sql access Sqlite sqlserver delphi javascript Oracle ajax wap mssql html css flash flex dreamweaver xml
 最新文章 : c++

C/C++函数调用约定之间的转换

C语言的初学者常犯的一个失误是调用系统或第三方API时忘了在函数声明中标注WINAPI调用方式,而菜鸟C++程序员也每每困惑为什么成员函数必须指示为CALLBACK再添加static关键字才能作为回调函数。在x86系统中,存在多种函数调用约定。如果调用者与被调用者采用不同的调用约定,很可能导致堆栈破坏、非法访问等致命错误。
也许您会得出一个结论,除非借助汇编指令,否则调用约定之间的转换是不可能的。不过很多事情都不是绝对的。我们先看下面的例子:
#include
int __cdecl CDeclFunction()
{
printf("from CDecl function\n");
return 1;
}
int main()
{
printf("Begin call STDCall function\n");
typedef int(__stdcall * STDCALLFUNCTION)();
STDCALLFUNCTION pfn =(STDCALLFUNCTION)CDeclFunction;
int i=pfn();
printf("End call STDCall function\n");
return i;
}
这是一个简单的函数调用的例子,唯一特别的地方是函数定义为__cdecl,而调用时采用__stdcall方式。我们把这段代码编译后执行。嗬,一切正常。如果您不服气,再加一个for循环看看J
我们再来看另一个更特别的例子:
#include
int __stdcall StdCallFunction (int i, ......

C/C++函数调用约定之间的转换

C语言的初学者常犯的一个失误是调用系统或第三方API时忘了在函数声明中标注WINAPI调用方式,而菜鸟C++程序员也每每困惑为什么成员函数必须指示为CALLBACK再添加static关键字才能作为回调函数。在x86系统中,存在多种函数调用约定。如果调用者与被调用者采用不同的调用约定,很可能导致堆栈破坏、非法访问等致命错误。
也许您会得出一个结论,除非借助汇编指令,否则调用约定之间的转换是不可能的。不过很多事情都不是绝对的。我们先看下面的例子:
#include
int __cdecl CDeclFunction()
{
printf("from CDecl function\n");
return 1;
}
int main()
{
printf("Begin call STDCall function\n");
typedef int(__stdcall * STDCALLFUNCTION)();
STDCALLFUNCTION pfn =(STDCALLFUNCTION)CDeclFunction;
int i=pfn();
printf("End call STDCall function\n");
return i;
}
这是一个简单的函数调用的例子,唯一特别的地方是函数定义为__cdecl,而调用时采用__stdcall方式。我们把这段代码编译后执行。嗬,一切正常。如果您不服气,再加一个for循环看看J
我们再来看另一个更特别的例子:
#include
int __stdcall StdCallFunction (int i, ......

在vc.net中的C/C++代码生成DLL步骤


1 选择new->project->win32 console project;
    在这一步的选框上有一个选项是 create dictionary for solution, 我不知道这个具体是什么作用,选了之后会项目出现两层文件夹,比如你创建一个命名为test的项目,会生成test文件夹,test中包含另一个test文件夹,你的项目实际上放在了内层test文件夹中。选与不选对于后续的创建没有影响。这个的具体作用等我查明白了再补上!
2 输入你的文件名字->按下next->选择DLL->选择OK;
3 在工程中添加一个与工程名字同名的test.h文件,在文件中写入代码: extern "C" __declspec(dllexport) void testexam(char *input); (文件名字是需要导出的文件名);
4 在cpp文件的头上其他include语句后面,添加#include "test.h",在其中写入你的函数void testexam(char *input);
5 在build->batch build 中将两个选项都选中,然后选择这个选项框中的编译指令
OK, now you can get your dll and lib file in the release and debug file folder! Congratulations !
......

在vc.net中的C/C++代码生成DLL步骤


1 选择new->project->win32 console project;
    在这一步的选框上有一个选项是 create dictionary for solution, 我不知道这个具体是什么作用,选了之后会项目出现两层文件夹,比如你创建一个命名为test的项目,会生成test文件夹,test中包含另一个test文件夹,你的项目实际上放在了内层test文件夹中。选与不选对于后续的创建没有影响。这个的具体作用等我查明白了再补上!
2 输入你的文件名字->按下next->选择DLL->选择OK;
3 在工程中添加一个与工程名字同名的test.h文件,在文件中写入代码: extern "C" __declspec(dllexport) void testexam(char *input); (文件名字是需要导出的文件名);
4 在cpp文件的头上其他include语句后面,添加#include "test.h",在其中写入你的函数void testexam(char *input);
5 在build->batch build 中将两个选项都选中,然后选择这个选项框中的编译指令
OK, now you can get your dll and lib file in the release and debug file folder! Congratulations !
......

C/C++数组名与指针区别深层探索

作者:宋宝华 e-mail:21cnbao@21cn.com
1.    引言
指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:“数组名就是指针”。很幸运,我的大学老师就是其中之一。时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着“数组名就是指针”的误解。
想必这种误解的根源在于国内某著名的C程序设计教程。如果这篇文章能够纠正许多中国程序员对数组名和指针的误解,笔者就不甚欣慰了。借此文,笔者站在无数对知识如饥似渴的中国程序员之中,深深寄希望于国内的计算机图书编写者们,能以“深入探索”的思维方式和精益求精的认真态度来对待图书编写工作,但愿市面上多一些融入作者思考结晶的心血之作!
2.    魔幻数组名
请看程序(本文程序在WIN32平台下编译):
1. #include <iostream.h>
2. int main(int argc, char* argv[])
3. {
4.     char str[10];
5.     c ......

C/C++数组名与指针区别深层探索

作者:宋宝华 e-mail:21cnbao@21cn.com
1.    引言
指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:“数组名就是指针”。很幸运,我的大学老师就是其中之一。时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着“数组名就是指针”的误解。
想必这种误解的根源在于国内某著名的C程序设计教程。如果这篇文章能够纠正许多中国程序员对数组名和指针的误解,笔者就不甚欣慰了。借此文,笔者站在无数对知识如饥似渴的中国程序员之中,深深寄希望于国内的计算机图书编写者们,能以“深入探索”的思维方式和精益求精的认真态度来对待图书编写工作,但愿市面上多一些融入作者思考结晶的心血之作!
2.    魔幻数组名
请看程序(本文程序在WIN32平台下编译):
1. #include <iostream.h>
2. int main(int argc, char* argv[])
3. {
4.     char str[10];
5.     c ......

C/C++文件操作[转载]

掌握文本文件读写的方法
了解二进制文件的读写方法
C++文件流:
fstream  // 文件流
ifstream  // 输入文件流
ofstream  // 输出文件流
//创建一个文本文件并写入信息
//同向屏幕上输出信息一样将信息输出至文件
#include<iomanip.h>
#include<fstream.h>
void main()
{
  ofstream f1("d:\\me.txt");           //打开文件用于写,若文件不存在就创建它
  if(!f1)return;                 //打开文件失败则结束运行
  f1<<setw(20)<<"姓名:"<<"廉东方"<<endl;     //使用插入运算符写文件内容
  f1<<setw(20)<<"家庭地址:"<<"河南郑州"<<endl;
  f1.close();                   //关闭文件
}
运行后打开文件d:\me.txt,其内容如下:
       姓名:廉东方
     家庭地址:河南郑州
文件操作:
打开文件
  文件名
    注意路径名中的斜杠要双写,如:
    "D:\\MyFiles\\ReadMe.txt"
  文件打开方式选项:
    ios::in    = 0x01, //供读,文件不存在则创建(ifstream默认的打开 ......

C/C++文件操作[转载]

掌握文本文件读写的方法
了解二进制文件的读写方法
C++文件流:
fstream  // 文件流
ifstream  // 输入文件流
ofstream  // 输出文件流
//创建一个文本文件并写入信息
//同向屏幕上输出信息一样将信息输出至文件
#include<iomanip.h>
#include<fstream.h>
void main()
{
  ofstream f1("d:\\me.txt");           //打开文件用于写,若文件不存在就创建它
  if(!f1)return;                 //打开文件失败则结束运行
  f1<<setw(20)<<"姓名:"<<"廉东方"<<endl;     //使用插入运算符写文件内容
  f1<<setw(20)<<"家庭地址:"<<"河南郑州"<<endl;
  f1.close();                   //关闭文件
}
运行后打开文件d:\me.txt,其内容如下:
       姓名:廉东方
     家庭地址:河南郑州
文件操作:
打开文件
  文件名
    注意路径名中的斜杠要双写,如:
    "D:\\MyFiles\\ReadMe.txt"
  文件打开方式选项:
    ios::in    = 0x01, //供读,文件不存在则创建(ifstream默认的打开 ......

VC++与VB数据类型对应关系


 VC++
与VB
数据类型对应关系
  在做VC与vb程序间互相调用,需要注意两种语言不同编译器对数据类型的定义区别,此时两者数据类型的对应关系就显得十分的重要,对应关系以及声明方式如下所示。
VC++

VB

short
Integer
int
Long
long
Long
UNIT
Long
ULONG
Long
WORD
DWORDLong
WPARAM
LPARAMLong
WMSG
UMSGLong
HRESULT
Long
BOOL
Boolean
COLORREF
Long
HWND,HDC,HBRUSH,HKEY,
等 等
Long
LPSTR
LPCSTRString
LPWSTR,OLECHARBSTR
String
LPTSTR
String
VARIANT_BOOL
Boolean
unsignedchar
Byte
BYTE
Byte
VARIANTVariant
(
任何 以*
或**
结尾的数据类型)
Long
 
 
 
 
 
c
中的数据类型
VB
中的声明
结果
 
 
 
 
 
ATOM
ByVal variable As Integer
结果为Integer
类型的表达式 
 
BOOL
ByVal variable As Boolean
结果为 Long
类型的表达式 
 
BYTE
ByVal variable As Byte
结果为 Byte
类型的表达式 
 
CHAR
ByVal variable As Byte
结 ......

VC++与VB数据类型对应关系


 VC++
与VB
数据类型对应关系
  在做VC与vb程序间互相调用,需要注意两种语言不同编译器对数据类型的定义区别,此时两者数据类型的对应关系就显得十分的重要,对应关系以及声明方式如下所示。
VC++

VB

short
Integer
int
Long
long
Long
UNIT
Long
ULONG
Long
WORD
DWORDLong
WPARAM
LPARAMLong
WMSG
UMSGLong
HRESULT
Long
BOOL
Boolean
COLORREF
Long
HWND,HDC,HBRUSH,HKEY,
等 等
Long
LPSTR
LPCSTRString
LPWSTR,OLECHARBSTR
String
LPTSTR
String
VARIANT_BOOL
Boolean
unsignedchar
Byte
BYTE
Byte
VARIANTVariant
(
任何 以*
或**
结尾的数据类型)
Long
 
 
 
 
 
c
中的数据类型
VB
中的声明
结果
 
 
 
 
 
ATOM
ByVal variable As Integer
结果为Integer
类型的表达式 
 
BOOL
ByVal variable As Boolean
结果为 Long
类型的表达式 
 
BYTE
ByVal variable As Byte
结果为 Byte
类型的表达式 
 
CHAR
ByVal variable As Byte
结 ......

about pack and align for C/C++

http://msdn.microsoft.com/en-us/library/2e70t5y1(VS.80).aspx
#pragma
pack(  n  )
n : Valid values are 1, 2, 4, 8, and 16.the
alignment of a member will be on a boundary that is either a multiple of 
n
 or
a multiple of the size of the member
,
whichever is smaller.
The
default value for n
 is 8
成员变量对齐:选n
和该成员长度

最小值(的倍数)
结构ABCD中d的对齐方式,选n和sizeof(d)的最小值8,然后按8字节对齐!!!
sizeof大小:选n
和最大成
员长度
的最小值,对齐
例子:
#pragma
pack(8)
struct ABCD
{
bool
b;
short s;
double d;
};
int
main()
{
cout << offsetof(ABCD,
b) << endl;
cout << offsetof(ABCD,
s) << endl;
cout << offsetof(ABCD,
d) << endl;
cout << sizeof(ABCD) << endl;
}
output
is:

2
8
16
http://msdn.microsoft.com/en-us/library/83ythb65(VS.71).aspx
__declspec( align( n ) )
__declspec( align() ) 和 #pragma pack ......

about pack and align for C/C++

http://msdn.microsoft.com/en-us/library/2e70t5y1(VS.80).aspx
#pragma
pack(  n  )
n : Valid values are 1, 2, 4, 8, and 16.the
alignment of a member will be on a boundary that is either a multiple of 
n
 or
a multiple of the size of the member
,
whichever is smaller.
The
default value for n
 is 8
成员变量对齐:选n
和该成员长度

最小值(的倍数)
结构ABCD中d的对齐方式,选n和sizeof(d)的最小值8,然后按8字节对齐!!!
sizeof大小:选n
和最大成
员长度
的最小值,对齐
例子:
#pragma
pack(8)
struct ABCD
{
bool
b;
short s;
double d;
};
int
main()
{
cout << offsetof(ABCD,
b) << endl;
cout << offsetof(ABCD,
s) << endl;
cout << offsetof(ABCD,
d) << endl;
cout << sizeof(ABCD) << endl;
}
output
is:

2
8
16
http://msdn.microsoft.com/en-us/library/83ythb65(VS.71).aspx
__declspec( align( n ) )
__declspec( align() ) 和 #pragma pack ......
总记录数:969; 总页数:162; 每页6 条; 首页 上一页 [36] [37] [38] [39] 40 [41] [42] [43] [44] [45]  下一页 尾页
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号