[代码][为何][编译]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,还真是有点不习惯!
谢谢上面的各位大侠了!
[创建][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 ,十分感谢
[编译][错误][苦恼]编译错误!(苦恼)
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就行啦
[编制][语言][编译]自己编制的语言的编译解释辩错。
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这四段程序的几个语义错误。比如速度没有输入,就不会报错。
轻大虾们帮下忙。怎样进行词语检测。
简单来说,就是先根据分隔符(空格)将句子分成单词,然后检查某个位置的单词是否符合规定的格式。其实应该学学编译原理,进行语法分析。
能简要介绍下编译原理么
[编译]看不懂的预编译
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
[++部分][代码][编译]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 )
我估计你不怎么懂底层。在编译的时候我那段代码看上去是没任何用。但是经过我修改内存之后它就变得有用了。所以编译器并不代表总是对的。他自以为聪明的帮我做了一些我不想它做的事。
这么早的帖都被你翻出来啦。 很少上CSDN, 既然看到了, 就简单说两句。
当碰到奇怪的问题很难实现的时候, 首先要考虑是不是自己设计的问题?
大多数问题都被别人碰到了并且有好的解决方案, 可以从别人那里吸取一点什么?
为什么要在运行后用其他的进程在改变他的状态? 这样做的目的是什么?
我先简单假设一下:
1:有可能是一个木马, 运行的时候要激活一段代码,
这种情况一般都是吧代码作为一种资源, 一种数据, 解密后在跳转过去运行。
因为可以精确定位, 如果穿插到代码中, 那么你是无法知道编译后的具体
地址是什么(或者很难知道), 就比如说你碰到的release和debug的优化问题,
有比如说有可能你程序多定义了几个局部变量, 导致sub esp, 60 变成了sub esp, 200
以致这条指令多几个字节, 代码的offset又需要重新计算, 等等。
如果必须精确的控制指令精确到字节操作,
都是在代码中插入 __asm { youcode } 来控制的,
并且这种代码是不会被编译器优化的。
2:有可能你说的一个 anti-anit-wg 工具, 为了逃避anti-wg的检测, 所以在运行动态的
修改代码, 完全可以设置一个标记, 来选择性的调用函数, 就不会导致不被编译的情况。
也可能是为了调试的时候需要, 比如运行到这里想看程序的内部状态,
而设置的调试输出代码, 手动拨动eip去执行, 这属于调试技巧, 可以完全
不用写代码都能做到的。
总的来说, 还是那句话, 不是表面解决一个问题, 编译器这么做的道理你可以怀疑他,
但同时要怀疑你自己, 编译器为什么要这么做以及我如何避免他是否有更好的方式。
另, 姑且不拿我看雪的id说事, 就是csdn6年的id, 多年的杀软引擎设计编码经验,
我想我对于底层的理解应该比你强很多, 在看了你的40%的结贴率, 我也不多说什么了;
所谓虚心使人进步, 不需要在这个“我就要这么做”上较劲了。
[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
楼上的发的,我之前看过,和我的问题一样。
[编译]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里
[程序][编译][通过]一个简单的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 ¦ICC_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 ¦WS_TABSTOP ¦WS_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 ¦WS_BORDER ¦WS_VISIBLE ¦UDS_SETBUDDYINT ¦
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 ¦WS_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。你检查一下看看是怎么回事。
函数定义与申明不符,
谢谢各位大哥!太好了,谢谢你们!
[编译][出错]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
常见错误及问题分析,参考一下