[代码][为何][编译]VC++6中的代码为何编译时就停在那了

09月 15th, 2008 by admin
Posted in VC/MFC | No Comments »

下面的代码为何编译时就停在那不动了,难道函数调用有问题?谢谢了!

求平行四边形ABCD的对角线AC,BD的长度,坐标分别为A(x1,y1),B(x2,y2),C(x3,y3),D(x4,y4)。

#include <stdio.h>
#include <math.h>
double distance(int iA1,int iA2,int iB1,int iB2)
{
double fD;
fD=sqrt((iA1-iA2)^2+(iB1-iB2)^2);
return(fD);
}

void main()
{
int iX1=0,iX2=0,iX3=0,iX4=0,iY1=0,iY2=0,iY3=0,iY4=0;
double dDIST1=0,dDIST2=0;
printf("请顺序输入平行四边形四个点的坐标:");
scanf("%d,%d,%d,%d,%d,%d,%d,%d
",iX1,iX2,iX3,iX4,iY1,iY2,iY3,iY4);
dDIST1=distance(iX1,iX3,iY1,iY3);
dDIST2=distance(iX2,iX4,iY2,iY4);
printf("平行四边形的两条对角线长度各为%lf,%lf",dDIST1,dDIST1);
}

scanf必须取变量的地址,所以要改为
scanf("%d,%d,%d,%d,%d,%d,%d,%d
",&iX1,&iX2,&iX3,&iX4,&iY1,&iY2,&iY3,&iY4);

可能是VC++6出问题了,后来结束程序重新打开再编译就可以通过了,但是在运行的时候输入四个点的坐标后按回车键,出现出错提示框,说内存不能为written,请问这是怎么回事?

"%d,%d,%d,%d,%d,%d,%d,%d

8个要全部输入完整,而且格式必须是1,2,3,4,5,6,7,8这样

按上述的建议修改了,添加了&,程序也做了些修改,可是运行的结果好像和预期的不一样。

程序:
#include <stdio.h>
#include <math.h>

double distance(int iA1,int iB1,int iA2,int iB2)
{
double fD;
fD=sqrt((iA1-iA2)^2+(iB1-iB2)^2);
return(fD);
}

void main()
{
int iX1=0,iX2=0,iX3=0,iX4=0,iY1=0,iY2=0,iY3=0,iY4=0;
double dDIST1=0,dDIST2=0;
printf("请顺序输入平行四边形四个点的坐标:");
scanf("%d,%d,%d,%d,%d,%d,%d,%d
",&iX1,&iY1,&iX2,&iY2,&iX3,&iY3,&iX4,&iY4);
dDIST1=distance(iX1,iY1,iX3,iY3);
dDIST2=distance(iX2,iY2,iX4,iY4);
printf("平行四边形的两条对角线长度各为%lf,%lf",dDIST1,dDIST2);
}

输出的结果是两条对角线的长度为1.414214和0.000000,为什么呢?晕!

对了,刚才输入为:2,4,1,2,5,2,6,4,再按回车。

调了一下,总算找到错了,是在distance函数体内的下列语句:
fD=sqrt((iA1-iA2)^2+(iB1-iB2)^2);
平方不能用^,如x的平方不能写成x^2,只能写成x*x,还真是有点不习惯!

谢谢上面的各位大侠了!

Tags: , , ,

[创建][win32][编译]创建win32 DLL编译出错不知道哪里出的错

09月 15th, 2008 by admin
Posted in VC/MFC | No Comments »

用向导穿件的win32 DLL
DLL头文件如下(红色部分为自己加的):
#ifdef SYSTIME_EXPORTS
#define SYSTIME_API __declspec(dllexport)
#else
#define SYSTIME_API __declspec(dllimport)
#endif

// This class is exported from the SysTime.dll
class SYSTIME_API CSysTime {
public:
CSysTime(void);
// TODO: add your methods here.
};

extern SYSTIME_API int nSysTime;

SYSTIME_API int fnSysTime(void);

SYSTIME_API void GetTime( SYSTEMTIME* lpSystemTime );

DLL源文件如下(红色部分为自己加的):
#include "stdafx.h"
#include "SysTime.h"

BOOL APIENTRY DllMain( HANDLE hModule,
                      DWORD  ul_reason_for_call,
                      LPVOID lpReserved
)
{
    switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
    }
    return TRUE;
}

// This is an example of an exported variable
SYSTIME_API int nSysTime=0;

// This is an example of an exported function.
SYSTIME_API int fnSysTime(void)
{
return 42;
}

// This is the constructor of a class that has been exported.
// see SysTime.h for the class definition
CSysTime::CSysTime()
{
return;
}

SYSTIME_API void GetTime( SYSTEMTIME* lpSystemTime )
{
GetLocalTime( lpSystemTime );
}

编译出现如下信息:
:SysTimeSysTime.cpp(25) : error C2491: 'nSysTime' : definition of dllimport data not allowed
H:SysTimeSysTime.cpp(29) : error C2491: 'fnSysTime' : definition of dllimport function not allowed
H:SysTimeSysTime.cpp(36) : warning C4273: 'CSysTime::CSysTime' : inconsistent dll linkage.  dllexport assumed.
H:SysTimeSysTime.cpp(41) : error C2491: 'GetTime' : definition of dllimport function not allowed
Error executing xicl6.exe.

大家帮我看看到底哪里出现问题了,我是照书上敲的啊。

在最开头加上
#define SYSTIME_EXPORTS
或者在项目设置的预处理器定义里加上 SYSTIME_EXPORTS

谢谢lew0002 ,十分感谢

Tags: , , ,

[编译][错误][苦恼]编译错误!(苦恼)

09月 13th, 2008 by admin
Posted in VC/MFC | No Comments »

下载的vc++技术内幕源代码,编译时出现错误!!
c:vcpp32ex06aex06aview.cpp(4) : fatal error C1083: Cannot open precompiled header file: 'Debug/ex06a.pch': No such file or directory
源代码下载网址是:
http://softiidx1.softii.com/softii/VC++jsnmym.rar?0000000877248875099tflag=1215242787opin=80c18bf25563ac934aaf8c90a858725e&ip=.rar
是EX06A那个例子,不知道是不是我的编译器有问题,我自己编的也不行!!!(不知道问什么附件上传不上去)希望高手给我解决下,不胜感激!!!如果编译器不行的话,希望有人给我个!!!

你用VC编译应该可以,你在编译菜单下选择“rebuild all”,应该就行了,试试吧

部分源文件的长文件名丢失了,你可以自己手动改一下:
EX06AD~1.CPP -> EX06ADialog.CPP
EX06AD~1.H  -> EX06ADialog.H
EX06AV~1.CPP -> EX06AView.CPP
EX06AV~1.H  -> EX06AView.H

一般不管是从网站下载的源代码,还是从别人机器上拷来的源代码,都要经过重新编译,也就是 Build菜单下的 "Rebuild ALL"选项,重新编译所有后就没问题了!

Rebuild ALL

删除Debug目录,重新编译

Rebuild ALL

rebuild ALL即可

组建-》清除,然后在编译一下
有时候,明明好着呢,就是过不去,清除一下就好了

删除Debug目录,重新编译

Rebuild ALL就行啦

Tags: , , ,

[编制][语言][编译]自己编制的语言的编译解释辩错。

09月 10th, 2008 by admin
Posted in VC/MFC | No Comments »

自己编制的语言,关键字不太多。类似汇编形式。MOVL P[1] 200mm/s F  ‘’从一点沿直线走到P[1]点速度200,F可以理解为开关量吧。
对其进行检查语法错误。
我的程序一部分是:
if(strtemp=="MOVL")                                //MJ
{
strindex = FindStr(&strtemp, proc, strindex, '[', ']');
if(P[atoi(strtemp)][1][1]==0)
{
ok=0;
sh.Format("%s Line:[%d] error:%s",sh,j+1,"Point num
                      error");sh+="
";m_Check.SetWindowText(sh);
}
strindex = FindStr(&strtemp, proc, strindex, ' ', ' ');
if(strtemp=="")
{
ok=0;
sh.Format("%s Line:[%d] error:%s",sh,j+1,"velocity value error");sh+="
";m_Check.SetWindowText(sh);
}
strindex = FindStr(&strtemp, proc, strindex, ' ',-1);
if(strtemp=="")
{
ok=0;
sh.Format("%s Line:[%d] error:%s",sh,j+1,"style value error");sh+="
";m_Check.SetWindowText(sh);
}
}

FindStr(CString *target, CString source, int start, char charleft, char charright)
{
int left=0,right=0;
if(charleft!=-1)                        //规定了分隔符,如' ' 或 '['等
left=source.Find(charleft,start)+1;
else //自然边界
left=start;
if(charright!=-1)
right=source.Find(charright,left)-1;
else
right = source.GetLength();
CString temp;
temp = source.Mid(left,right-left+1);
if(temp.GetLength()>0)
{
*target=temp;
return right+1;
}
return -1;//没有找到
}
我的程序是错误的,不能检查出MOVL P[1] 200mm/s F这四段程序的几个语义错误。比如速度没有输入,就不会报错。
轻大虾们帮下忙。怎样进行词语检测。

简单来说,就是先根据分隔符(空格)将句子分成单词,然后检查某个位置的单词是否符合规定的格式。其实应该学学编译原理,进行语法分析。

能简要介绍下编译原理么

Tags: , , ,

[编译]看不懂的预编译

09月 10th, 2008 by admin
Posted in VC/MFC | No Comments »

/////////////////////////////////////////////////////////////////////////////
//   Special   configurations

//   _AFXEXT   implies   _AFXDLL
#if   defined(_AFXEXT)   &&   !defined(_AFXDLL)
#define   _AFXDLL
#endif

#if   defined(_AFXDLL)   &&   !defined(_DLL)
#error   Please   use   the   /MD   switch   for   _AFXDLL   builds
#endif

#if   defined(_AFXDLL)   &&   !defined(_MT)
#error   Please   use   the   /MD   switch   (multithreaded   DLL   C-runtime)
#endif

谁能帮忙解释一下,上面代码什么含义?
afxdll   mt这些是指什么?

谢谢。

_AFXDLL应该是指MFC   DLL

Tags: ,

[++部分][代码][编译]C++部分代码不编译的问题

09月 8th, 2008 by admin
Posted in VC/MFC | No Comments »

显然Release模式下编译会少很多代码。我写的if里的代码全部没有编译。DEBUG模式则是全部正常的。请问是为什么

源码是这样的
void My_ReadProcessMemory(DWORD Eax,

  HANDLE hProcess,
  LPCVOID lpBaseAddress,
  LPVOID lpBuffer,
  DWORD nSize,
  LPDWORD lpNumberOfBytesRead
  )
{
if (!IsMe)
{
IsMe =true;
MessageBox(NULL,"","",NULL);
if ((DWORD)lpBaseAddress>=0×6f000000&&(DWORD)lpBaseAddress <=0×6F705000)
{
hProcess=nOK;
DWORD lpnew;
lpnew=(DWORD)lpBaseAddress-0×6f000000;
lpnew+=(DWORD)gamedllbuf;
(LPCVOID)lpBaseAddress=(LPCVOID)lpnew;

}
IsMe = false;
}
}
用Release编译出来的代码为
10009530  cmp        byte ptr [IsMe (1002FBB8h)],0
10009537  jne        My_ReadProcessMemory+2Bh (1000955Bh)
10009539  push        0   
1000953B  push        offset string "" (10007354h)
10009540  push        offset string "" (10007354h)
10009545  push        0   
10009547  mov        byte ptr [IsMe (1002FBB8h)],1
1000954E  call        dword ptr [__imp__MessageBoxA@16 (10001408h)]
10009554  mov        byte ptr [IsMe (1002FBB8h)],0
1000955B  ret
用Debug编译出来的代码为
10111E50  push        ebp 
10111E51  mov        ebp,esp
10111E53  sub        esp,0CCh
10111E59  push        ebx 
10111E5A  push        esi 
10111E5B  push        edi 
10111E5C  lea        edi,[ebp-0CCh]
10111E62  mov        ecx,33h
10111E67  mov        eax,0CCCCCCCCh
10111E6C  rep stos    dword ptr es:[edi]
10111E6E  movzx      eax,byte ptr [IsMe (1027ADA8h)]
10111E75  test        eax,eax
10111E77  jne        My_ReadProcessMemory+8Bh (10111EDBh)
10111E79  mov        byte ptr [IsMe (1027ADA8h)],1
10111E80  mov        esi,esp
10111E82  push        0   
10111E84  push        offset string "" (100D41EAh)
10111E89  push        offset string "" (100D41EAh)
10111E8E  push        0   
10111E90  call        dword ptr [__imp__MessageBoxA@16 (10282CFCh)]
10111E96  cmp        esi,esp
10111E98  call        @ILT+34760(__RTC_CheckEsp) (100B67CDh)
10111E9D  cmp        dword ptr [lpBaseAddress],6F000000h
10111EA4  jb          My_ReadProcessMemory+84h (10111ED4h)
10111EA6  cmp        dword ptr [lpBaseAddress],6F705000h
10111EAD  ja          My_ReadProcessMemory+84h (10111ED4h)
10111EAF  mov        eax,dword ptr [nOK (1027AC9Ch)]
10111EB4  mov        dword ptr [hProcess],eax
10111EB7  mov        eax,dword ptr [lpBaseAddress]
10111EBA  sub        eax,6F000000h
10111EBF  mov        dword ptr [lpnew],eax
10111EC2  mov        eax,dword ptr [lpnew]
10111EC5  add        eax,dword ptr [gamedllbuf (1027ADA4h)]
10111ECB  mov        dword ptr [lpnew],eax
10111ECE  mov        eax,dword ptr [lpnew]
10111ED1  mov        dword ptr [lpBaseAddress],eax
10111ED4  mov        byte ptr [IsMe (1027ADA8h)],0
10111EDB  pop        edi 
10111EDC  pop        esi 
10111EDD  pop        ebx 
10111EDE  add        esp,0CCh
10111EE4  cmp        ebp,esp
10111EE6  call        @ILT+34760(__RTC_CheckEsp) (100B67CDh)
10111EEB  mov        esp,ebp
10111EED  pop        ebp 
10111EEE  ret

Release给你优化掉啦。

跟isme的赋值没关系吧。。。是里面那个IF没编译

10009547  mov        byte ptr [IsMe (1002FBB8h)],1
1000954E  call        dword ptr [__imp__MessageBoxA@16 (10001408h)]
10009554  mov        byte ptr [IsMe (1002FBB8h)],0

han…

没人知道吗?

if ((DWORD)lpBaseAddress>=0×6f000000&&(DWORD)lpBaseAddress <=0×6F705000)
{
hProcess=nOK;
DWORD lpnew;
lpnew=(DWORD)lpBaseAddress-0×6f000000;
lpnew+=(DWORD)gamedllbuf;
(LPCVOID)lpBaseAddress=(LPCVOID)lpnew;

}

为什么要编译?
你用到的JUST ALL栈中传递过来的参数地址,没有任何外部引用, 出栈后没任意意义,
换句话说, 这些代码对程序没任何影响。

没影响不代表没意义。那如果是你写这个API拦截,你认为应该怎么写?

void foo(int a)
{
  a = 1;
}

void foo(int a)
{
  *(int *) = 1;
}

你可能想写片段2, 却写成了片段1.
片段1是对程序没有任何影响的代码, 我认为的没影响就是没意义。

btw:
看起来是一个外挂(或者反外挂)的代码。
void My_ReadProcessMemory(DWORD Eax,

  HANDLE hProcess,
  LPCVOID lpBaseAddress,
  LPVOID lpBuffer,
  DWORD nSize,
  LPDWORD lpNumberOfBytesRead
  )
不知道这个是不是需要hook 的api, 如果是的话, 原型应该对应上才对呀。
怎么会有个eax,
hook常用的是inline hook, 即吧api的首地址改成一个e9远跳, 抽取最少5个代码组合在跳转回去生成一个原来的api实现。
e9跳转到自己的处理函数, 自己处理函数做一些判断过滤, 然后在return刚刚组合出的原有api实现。

找到解决办法了。。。。
看雪上有人给解决了。
是一个反反外挂代码。反外挂代码要检测游戏进程的内存。我就装载一个为修改的游戏到内存里。然后检测到他读取游戏内存的时候就让他读取我准备好的内存给他。
以下是哪位的回答
“因为编译器优化的问题,你把项目属性 - C/C++ - 优化里的优化给禁用了就可以看到生成完整代码了”
我测试果然是这样。。。

以下是哪位的回答
“因为编译器优化的问题,你把项目属性 - C/C++ - 优化里的优化给禁用了就可以看到生成完整代码了”
我测试果然是这样。。。

你这属于欺骗自己的做法
编译器没问题
编译器敢这么做是有原因的
因为你的代码有问题
现在的情况是
你的代码没有做任何事, 编译器给你变没了, 可是你还觉得不爽, 想让他显示出来,
利用这种假象来安慰自己, 好像有了效果一样。

另外二毛同学, 此贴回复到此为止。
等你最后调试发现问题的时候, 应该能理解我所说的这些, 别忘记结贴给分。

补充最后一点, debug是用来调试的, release是用来发布的
如果你只是想调试的时候看这个值的话, 可以在watch里面写你要观看的变量,
然而, 绝不推荐在release下调试, 除非是迫不得已。

Release配置默认是优化代码运行速度的,编译时会把它认为没有实际意义的代码优化掉。如果不想让编译器优化,可以这样来处理:
#pragma optimize( "", off )
// 不想被优化的代码
#pragma optimize( "", on )

引用 11 楼 pigsanddogs 的回复:
另外二毛同学, 此贴回复到此为止。
等你最后调试发现问题的时候, 应该能理解我所说的这些, 别忘记结贴给分。

引用 10 楼 pigsanddogs 的回复:
以下是哪位的回答
“因为编译器优化的问题,你把项目属性 - C/C++ - 优化里的优化给禁用了就可以看到生成完整代码了”
我测试果然是这样。。。

你这属于欺骗自己的做法
编译器没问题
编译器敢这么做是有原因的
因为你的代码有问题
现在的情况是
你的代码没有做任何事, 编译器给你变没了, 可是你还觉得不爽, 想让他显示出来,
利用这种假象来安慰自己, 好像有了效果一样。


我估计你不怎么懂底层。在编译的时候我那段代码看上去是没任何用。但是经过我修改内存之后它就变得有用了。所以编译器并不代表总是对的。他自以为聪明的帮我做了一些我不想它做的事。

这么早的帖都被你翻出来啦。 很少上CSDN, 既然看到了, 就简单说两句。

当碰到奇怪的问题很难实现的时候, 首先要考虑是不是自己设计的问题?
大多数问题都被别人碰到了并且有好的解决方案, 可以从别人那里吸取一点什么?
为什么要在运行后用其他的进程在改变他的状态?  这样做的目的是什么?
我先简单假设一下:
1:有可能是一个木马, 运行的时候要激活一段代码,
这种情况一般都是吧代码作为一种资源, 一种数据, 解密后在跳转过去运行。
因为可以精确定位, 如果穿插到代码中,  那么你是无法知道编译后的具体
地址是什么(或者很难知道), 就比如说你碰到的release和debug的优化问题,
有比如说有可能你程序多定义了几个局部变量, 导致sub esp, 60 变成了sub esp, 200
以致这条指令多几个字节, 代码的offset又需要重新计算, 等等。
如果必须精确的控制指令精确到字节操作,
都是在代码中插入 __asm { youcode } 来控制的,
并且这种代码是不会被编译器优化的。
2:有可能你说的一个 anti-anit-wg 工具, 为了逃避anti-wg的检测, 所以在运行动态的
修改代码, 完全可以设置一个标记, 来选择性的调用函数, 就不会导致不被编译的情况。
也可能是为了调试的时候需要, 比如运行到这里想看程序的内部状态,
而设置的调试输出代码, 手动拨动eip去执行, 这属于调试技巧, 可以完全
不用写代码都能做到的。

总的来说, 还是那句话, 不是表面解决一个问题, 编译器这么做的道理你可以怀疑他,
但同时要怀疑你自己, 编译器为什么要这么做以及我如何避免他是否有更好的方式。

另, 姑且不拿我看雪的id说事, 就是csdn6年的id, 多年的杀软引擎设计编码经验,
我想我对于底层的理解应该比你强很多, 在看了你的40%的结贴率, 我也不多说什么了;
所谓虚心使人进步, 不需要在这个“我就要这么做”上较劲了。

Tags: , , ,

[T.264][编译]T.264怎么编译

09月 3rd, 2008 by admin
Posted in VC/MFC | No Comments »

我下了T.264-0.14可是用VC6编译时提示:

Performing Custom Build Step on ….encodersse2utility_mmx.asm
'nasm' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
执行 c:windowssystem32cmd.exe 时出错

我下载了NASM并放到vc98in中,结果出现下面的错误:

Performing Custom Build Step on ….encodersse2utility_mmx.asm
Invalid keyboard code specified
nasm: fatal: unable to open input file `….encodersse2utility_mmx.asm'
执行 c:windowssystem32cmd.exe 时出错.

请问在VC6.0 下如何编译

报一大堆的错误,有谁调过T.264
有没有调试好的?

up

这个一看就不行!你找个可以编译汇编代码的编译器啊!

我下了个Nasm 编译没有出现上面错误
一大fatal error C1600: unsupported data type 这个错误,都找不到位置。

http://bbs.lmtw.com/dispbbs.asp?boardid=108&id=125985

楼上的发的,我之前看过,和我的问题一样。

Tags: , ,

[编译]wtl编译问题

09月 2nd, 2008 by admin
Posted in VC/MFC | No Comments »

我安装了wtl70,并包含了include。
可是编译是还是报如下错误。

c:wtl70includeatlframe.h(274)   :   error   C2146:   syntax   error   :   missing   '; '   before   identifier   'lpnm '
                c:wtl70includeatlframe.h(905)   :   see   reference   to   class   template   instantiation   'WTL::CFrameWindowImplBase <TBase,TWinTraits> '   being   compiled
c:wtl70includeatlframe.h(274)   :   error   C2501:   'LPNMREBARCHEVRON '   :   missing   storage-class   or   type   specifiers

我用vc6,WTL8beta,PSDK2003,一切OK。
你应该是程序写错了。
检查你程序里的这句话
DECLARE_FRAME_WND_SUPERCLASS

没装P   SDK的原因     我也遇到过     下个新的sdk吧

程序不会有问题的,我运行的是例子程序。
platfrom2003我已经安装上了。可是编译还是出一样的错误
是不是我的directories设置的有问题啊?
Include   Files路径:
C:PROGRAM   FILESMICROSOFT   VISUAL   STUDIOVC98INCLUDE
C:PROGRAM   FILESMICROSOFT   VISUAL   STUDIOVC98ATLINCLUDE
C:PROGRAM   FILESMICROSOFT   VISUAL   STUDIOVC98MFCINCLUDE
C:PROGRAM   FILESMICROSOFT   SDKINCLUDE
C:WTL70INCLUDE
library   files:
C:Program   FilesMicrosoft   Visual   StudioVC98LIB
C:PROGRAM   FILESMICROSOFT   VISUAL   STUDIOVC98MFCLIB
C:PROGRAM   FILESMICROSOFT   SDKLIB
executable   files:
C:PROGRAM   FILESMICROSOFT   SDKBIN

WTL用了很多vc6时代没有的界面函数,比如rebar   control,这些都需要sdk,而vc6里面有很多头文件是和sdk头文件是重叠的,你应该把sdk的头和库文件排到前面。其次排WTL。总之,新的要排前面。

SDK   2003   可以注册下   自动导入路径的

该回复于2008-08-02 05:20:02被管理员或版主删除

我看你那个路径的设置里也没有包含WTL相应的LIB和.H啊

找到#if (_WIN32_IE >= 0×0500)
typedef struct tagNMREBARCHEVRON
{
    NMHDR hdr;
    UINT uBand;
    UINT wID;
    LPARAM lParam;
    RECT rc;
    LPARAM lParamNM;
} NMREBARCHEVRON, *LPNMREBARCHEVRON;
#endif
在commctrl.h里

Tags: ,

[程序][编译][通过]一个简单的API程序编译通过可能连接库有问题请各位大哥指教……

09月 2nd, 2008 by admin
Posted in VC/MFC | No Comments »

原代码:
#include <windows.h>
#include <commctrl.h>
#include <string.h>
#include <stdio.h>
#include"resource.h"
#define MAX 3
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK DialogFunc1(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK DialogFunc2(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK DialogFunc3(HWND,UINT,WPARAM,LPARAM);
void Initstatus(HWND hwnd);
char szWinName[]="MyAPI";
HINSTANCE hInst;
HWND hwnd;
HWND htabwnd;
HWND hstatuswnd;
int part[MAX];
HWND hDlg=(HWND)NULL;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
MSG Message; 
WNDCLASS WndClass;
INITCOMMONCONTROLSEX cc;
WndClass.style=0;
WndClass.lpfnWndProc=WndProc;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hInstance=hInstance;
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));
WndClass.lpszMenuName=NULL;
WndClass.lpszClassName=szWinName;

if(!RegisterClass(&WndClass))
{
MessageBox(NULL,TEXT("This progrom requires windows NT!"),"resource",MB_ICONERROR);
return 0;
}

hwnd=CreateWindow(
szWinName,
"标签显示实例程序",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
hInst=hInstance;
cc.dwSize=sizeof(INITCOMMONCONTROLSEX);
cc.dwICC=ICC_UPDOWN_CLASS &brvbarICC_TAB_CLASSES;
InitCommonControlsEx(&cc);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);

while(GetMessage(&Message,NULL,0,0))
{if(!IsDialogMessage(hDlg,&Message))
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT Message,WPARAM wParam,LPARAM lParam)
{
NMHDR *nmptr;
int tabnum=0;
TCITEM tci;
switch(Message)
{
case WM_CREATE:
htabwnd=CreateWindow(WC_TABCONTROL,"",WS_VISIBLE &brvbarWS_TABSTOP &brvbarWS_CHILD,20,20,
325,250,hwnd,NULL,hInst,NULL);
tci.mask=TCIF_TEXT;tci.iImage=-1;
tci.pszText="选项";TabCtrl_InsertItem(htabwnd,0,&tci);
tci.pszText="程度";TabCtrl_InsertItem(htabwnd,1,&tci);
tci.pszText="页面";TabCtrl_InsertItem(htabwnd,2,&tci);
hDlg=CreateDialog(hInst,"Mydia1",htabwnd,(DLGPROC)DialogFunc1);
break;

case WM_NOTIFY:
nmptr=(LPNMHDR)lParam;
if(nmptr->code==TCN_SELCHANGE){
if(hDlg)DestroyWindow(hDlg);
tabnum=TabCtrl_GetCurSel((HWND)nmptr->hwndFrom);
switch(tabnum){
case 0:
hDlg=CreateDialog(hInst,"Mydia1",htabwnd,(DLGPROC)DialogFunc1);
break;
case 1:
hDlg=CreateDialog(hInst,"Mydia2",htabwnd,(DLGPROC)DialogFunc2);
break;
case 2:
hDlg=CreateDialog(hInst,"Mydia3",htabwnd,(DLGPROC)DialogFunc3);
break;}
}
break;
case WM_DESTROY:
if(hDlg)DestroyWindow(hDlg);
    PostQuitMessage(0);
    break;
default:
return(DefWindowProc(hwnd,Message,wParam,lParam));
} return 0;
}
BOOL CALLBACK DialogFunc1(HWND hdwnd,UINT Message,LPARAM lParam,WPARAM wParam)
{static long udpos=0;
static char str[80];
static HWND heboxwnd;
static HWND udwnd;
static statuscb1,statuscb2;
int low=0,high=20;
switch(Message){
case WM_INITDIALOG:
Initstatus(hdwnd);
heboxwnd=GetDlgItem(hdwnd,ID_EB1);
udwnd=CreateUpDownControl(WS_CHILD &brvbarWS_BORDER &brvbarWS_VISIBLE &brvbarUDS_SETBUDDYINT &brvbar
UDS_ALIGNRIGHT,10,10,50,50,hdwnd,ID_UPDOWN,hInst,heboxwnd,high,low,high/2);
return 1;
case WM_VSCROLL:
if(udwnd==(HWND)lParam){
udpos=GetDlgItemInt(hdwnd,ID_EB1,NULL,1);
sprintf(str,"滚动:%d",udpos);
SendMessage(hstatuswnd,SB_SETTEXT,(WPARAM)0,(LPARAM)str);
}return 1;
case WM_COMMAND:
switch(LOWORD(wParam)){
case ID_CB1:
statuscb1=SendDlgItemMessage(hdwnd,ID_CB1,BM_GETCHECK,0,0);
if(statuscb1)sprintf(str,"选项1:ON");
else sprintf(str,"选项1:OFF");
SendMessage(hstatuswnd,SB_SETTEXT,(WPARAM)1,(LPARAM)str);
return 1;
case ID_CB2:
statuscb2=SendDlgItemMessage(hdwnd,ID_CB2,BM_GETCHECK,0,0);
if(statuscb1)sprintf(str,"选项2:ON");
else sprintf(str,"选项2:OFF");
SendMessage(hstatuswnd,SB_SETTEXT,(WPARAM)2,(LPARAM)str);
return 1;
    case ID_RESET:
SendMessage(udwnd,UDM_SETPOS,0,(LPARAM)high/2);
SendMessage(hstatuswnd,SB_SETTEXT,(WPARAM)0,(LPARAM)"滚动:10");
SendDlgItemMessage(hdwnd,ID_CB1,BM_SETCHECK,0,0);
        SendMessage(hstatuswnd,SB_SETTEXT,(WPARAM)1,(LPARAM)"选项1:OFF");
        SendMessage(hstatuswnd,SB_SETTEXT,(WPARAM)2,(LPARAM)"选项2:OFF");
return 1;
case IDCANCEL:
case IDOK:
PostQuitMessage(0);
return 1;
}
}return 0;
}
BOOL CALLBACK DialogFunc2(HWND hdwnd,UINT Message,LPARAM lParam,WPARAM wParam)
{switch(Message){
case WM_COMMAND:
switch(LOWORD(wParam)){
case IDOK:
          PostQuitMessage(0);
  return 1;
}
}return 0;
}
BOOL CALLBACK DialogFunc3(HWND hdwnd,UINT Message,LPARAM lParam,WPARAM wParam)
{switch(Message){
case WM_COMMAND:
switch(LOWORD(wParam)){
case IDOK:
          PostQuitMessage(0);
  return 1;
}
}return 0;
}
void Initstatus(HWND hwnd)
{RECT windim;
int i;
GetClientRect(hwnd,&windim);
for(i=1;i <=MAX;i++)
part[i-1]=windim.right/MAX*i;
hstatuswnd=CreateWindow(STATUSCLASSNAME,"",WS_CHILD &brvbarWS_VISIBLE,0,0,0,0,hwnd,NULL,hInst,NULL);
SendMessage(hstatuswnd,SB_SETPARTS,(WPARAM)MAX,(LPARAM)part);
SendMessage(hstatuswnd,SB_SETTEXT,(WPARAM)0,(LPARAM)"滚动:10");
SendMessage(hstatuswnd,SB_SETTEXT,(WPARAM)1,(LPARAM)"选项1:OFF");
SendMessage(hstatuswnd,SB_SETTEXT,(WPARAM)2,(LPARAM)"选项2:OFF");
}
编译通过,连接时错误是:Compiling resources…
Linking…
zz63a.obj : error LNK2001: unresolved external symbol "int __stdcall DialogFun3(struct HWND__ *,unsigned int,unsigned int,long)" (?DialogFun3@@YGHPAUHWND__@@IIJ@Z)
zz63a.obj : error LNK2001: unresolved external symbol "int __stdcall DialogFun2(struct HWND__ *,unsigned int,unsigned int,long)" (?DialogFun2@@YGHPAUHWND__@@IIJ@Z)
zz63a.obj : error LNK2001: unresolved external symbol "int __stdcall DialogFun1(struct HWND__ *,unsigned int,unsigned int,long)" (?DialogFun1@@YGHPAUHWND__@@IIJ@Z)
Debug/zz63a.exe : fatal error LNK1120: 3 unresolved externals
请指点一二,小弟感激不尽!

是吗?我在看看,今天我检查了不下十遍的语法错误啊,好像没有楼上说的拼写错误啊?
///都是DialogFunc1,2,3啊

拼写错误,DialogFun和DialogFunc。
///////////////////////
语法没问题啊,能否告诉我在那里拼写错误了?

错误提示是找不到DialogFun1、DialogFun2、DialogFun3,你的代码中是DialogFunc1、DialogFunc2、DialogFunc3。你检查一下看看是怎么回事。

函数定义与申明不符,

谢谢各位大哥!太好了,谢谢你们!

Tags: , , ,

[编译][出错]vc编译出错

08月 31st, 2008 by admin
Posted in VC/MFC | No Comments »

编译时出现
warning C4652: compiler option 'Generate Browser Info' inconsistent with precompiled header; current command-line option will override that defined in the precompiled header
这是什么问题?怎样解决?

确认已包含stdafx.h

或者关闭 预编译选项

http://www.builder.com.cn/2007/0909/497240.shtml

常见错误及问题分析,参考一下

Tags: , ,