mfc深入浅出第一个例子疑问

xiandao82 2006-12-01 10:01:11
真是很奇怪的问题:
这时mfc上的例子
全部代码如下:

//----------------------------------------------------------------
// 文件名:generic.h
//----------------------------------------------------------------

BOOL InitApplication(HANDLE);
BOOL InitInstance(HANDLE,int);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK About(HWND,UINT,WPARAM,LPARAM);


//-----------------------------------
//文件名:resource.h
//-----------------------------------
#ifndef __RESOURCE_H__

#define __RESOURCE_H__

#define IDM_NEW 102
#define IDM_SAVE 103
#define IDM_EXIT 104
#define IDM_ABOUT 105

#endif

//----------------------------------------
//文件名:Generic.rc
//-----------------------------------------
#include "windows.h"
#include "resource.h"

jjhouricon ICON "jjhour.ico";

GenericMenu MENU
BEGIN
POPUP "&File"
BEGIN
MENUITEM "&New",IDM_NEW,GRAYED
MENUITEM "Save",IDM_SAVE,GRAYED
MENUITEM "E&xit",IDM_EXIT
END
POPUP "&Help"
BEGIN
MENUITEM "ABout...",IDM_ABOUT
END
END

AboutBox DIALOG 22,17,144,75
STYLE DS_MODALFRAME|WS_CAPTION|WS_SYSMENU
CAPTION "About generic"
BEGIN
CTEXT "Window2000",-1,0,5,144,8
CTEXT "Generic Application",-1,0,14,144,8
CTEXT "Version 1.0",-1,0,34,144,8
DEFPUSHBUTTON "OK",IDOK,53,59,32,14,WS_GROUP
END

//----------------------------------------------------------------
// GENERIC--WIN32程序的基础写法
//文件名:GENERIC.CPP
//
//----------------------------------------------------------------

#include <windows.h>
#include "resource.h"
#include "generic.h"

HINSTANCE _hInst;
HWND _hWnd;
char _szAppName[]="Generic";
char _szTitle[]="Generic Sample Application";
//----------------------------------------------------------------
// WinMain---程序进入点
//
//----------------------------------------------------------------

int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
MSG msg;
if (!hInstance)
if (!InitApplication(hInstance))
return FALSE;


//判断初始化是否成功
if (!InitInstance(hInstance,nCmdShow))
return FALSE;


while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}

//----------------------------------------------------------------
//InitInstance--注册窗口类别
//
//----------------------------------------------------------------

BOOL InitApplication(HINSTANCE hInstance)
{
WNDCLASS wc;
wc.style =CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc =(WNDPROC)WndProc;
wc.cbClsExtra =0;
wc.cbWndExtra =0;
wc.hInstance =hInstance;
wc.hIcon =LoadIcon(hInstance,IDI_WINLOGO);
wc.hCursor =LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName =NULL;
wc.lpszClassName =_szAppName;

//注册创建窗体的资源
return RegisterClass(&wc);
}
//----------------------------------------------------------------
// InitInstance---产生窗体
//
//
//----------------------------------------------------------------

BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)
{
_hInst=hInstance;
_hWnd=CreateWindow(_szAppName,_szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
if (!_hWnd)
return FALSE;

ShowWindow(_hWnd,nCmdShow);
UpdateWindow(_hWnd);
return TRUE;

}
//----------------------------------------------------------------
// WndProc--窗体函数
//
//
//----------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
int wmId,wmEvent;

switch(message)
{
case WM_COMMAND:
wmId =LOWORD(wParam);
wmEvent =HIWORD(wParam);
switch(wmId)
{
case IDM_ABOUT:
DialogBox(_hInst,
"AboutBox",
hWnd,
(DLGPROC)About
);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
break;

case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;
}
//----------------------------------------------------------------
// About--弹出框函数
//
//
//----------------------------------------------------------------
LRESULT CALLBACK About(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam)==IDOK || LOWORD(wParam)==IDCANCEL)
{
EndDialog(hDlg,TRUE);
return TRUE;
}
break;
}
return FALSE;
}

以上代码不能通过编译

new_1 error LNK2019: 无法解析的外部符号 "int __cdecl InitInstance(void *,int)" (?InitInstance@@YAHPAXH@Z) ,该符号在函数 _WinMain@16 中被引用
new_1 error LNK2019: 无法解析的外部符号 "int __cdecl InitApplication(void *)" (?InitApplication@@YAHPAX@Z) ,该符号在函数 _WinMain@16 中被引用
new_1 fatal error LNK1120: 2 个无法解析的外部命令

而如果把InitApplication和InitInstance这两个基本点函数的内容直接写到winmain
中,就可以正常通过编译并执行.
如:

int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
MSG msg;
/*if (!hInstance)
if (!InitApplication(hInstance))
return FALSE;*/

WNDCLASS wc;
wc.style =CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc =(WNDPROC)WndProc;
wc.cbClsExtra =0;
wc.cbWndExtra =0;
wc.hInstance =hInstance;
wc.hIcon =LoadIcon(hInstance,IDI_WINLOGO);
wc.hCursor =LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName ="GenericMenu";
wc.lpszClassName =_szAppName;


RegisterClass(&wc);


_hInst=hInstance;

_hWnd=CreateWindow(_szAppName,
_szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
//if (!_hWnd)
//return FALSE;

ShowWindow(_hWnd,nCmdShow);
UpdateWindow(_hWnd);
//判断初始化是否成功
/*if (!InitInstance(hInstance,nCmdShow))
return FALSE;*/


while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}

这是为什么呢?如果写到函数里的话应该怎么写才正确
我的环境是vs2003
请各位帮忙。~~~~~~~~~
...全文
208 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
王国凡 2006-12-01
  • 打赏
  • 举报
回复
所以, generic.cpp 的全文是:
//----------------------------------------------------------------
//GENERIC--WIN32程序的基础写法
//文件名:GENERIC.CPP
//
//----------------------------------------------------------------

#include <windows.h>
#include "resource.h"
#include "generic.h"

HINSTANCE _hInst;
HWND _hWnd;
char _szAppName[]="Generic";
char _szTitle[]="Generic Sample Application";
BOOL InitInstance(HINSTANCE hInstance,int nCmdShow);
BOOL InitApplication(HINSTANCE hInstance);
//----------------------------------------------------------------
//WinMain---程序进入点
//
//----------------------------------------------------------------

int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
MSG msg;
if (!hInstance)
if (!InitApplication(hInstance))
return FALSE;


//判断初始化是否成功
if (!InitInstance(hInstance,nCmdShow))
return FALSE;


while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}

//----------------------------------------------------------------
//InitInstance--注册窗口类别
//
//----------------------------------------------------------------

BOOL InitApplication(HINSTANCE hInstance)
{
WNDCLASS wc;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc=(WNDPROC)WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(hInstance,IDI_WINLOGO);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName=_szAppName;

//注册创建窗体的资源
return RegisterClass(&wc);
}
//----------------------------------------------------------------
//InitInstance---产生窗体
//
//
//----------------------------------------------------------------

BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)
{
_hInst=hInstance;
_hWnd=CreateWindow(_szAppName,_szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
if (!_hWnd)
return FALSE;

ShowWindow(_hWnd,nCmdShow);
UpdateWindow(_hWnd);
return TRUE;

}
//----------------------------------------------------------------
//WndProc--窗体函数
//
//
//----------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
int wmId,wmEvent;

switch(message)
{
case WM_COMMAND:
wmId=LOWORD(wParam);
wmEvent=HIWORD(wParam);
switch(wmId)
{
case IDM_ABOUT:
DialogBox(_hInst,
"AboutBox",
hWnd,
(DLGPROC)About
);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
break;

case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;
}
//----------------------------------------------------------------
//About--弹出框函数
//
//
//----------------------------------------------------------------
LRESULT CALLBACK About(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam)==IDOK || LOWORD(wParam)==IDCANCEL)
{
EndDialog(hDlg,TRUE);
return TRUE;
}
break;
}
return FALSE;
}
王国凡 2006-12-01
  • 打赏
  • 举报
回复
这个问题太简单了, 在 generic.cpp 文件开始的位置添加那两个函数的声名好可:
BOOL InitInstance(HINSTANCE hInstance,int nCmdShow);
BOOL InitApplication(HINSTANCE hInstance);
liuqiyc 2006-12-01
  • 打赏
  • 举报
回复
BOOL InitApplication(HANDLE);
BOOL InitInstance(HANDLE,int);
------------------ 上面 HANDLE ----------------
------------------ 下面 HINSTANCE --------------
BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)
{
}
BOOL InitApplication(HINSTANCE hInstance)
{
}
high2003376320 2006-12-01
  • 打赏
  • 举报
回复
new_1 error LNK2019: 无法解析的外部符号 "int __cdecl InitInstance(void *,int)" (?InitInstance@@YAHPAXH@Z) ,该符号在函数 _WinMain@16 中被引用
new_1 error LNK2019: 无法解析的外部符号 "int __cdecl InitApplication(void *)" (?InitApplication@@YAHPAX@Z) ,该符号在函数 _WinMain@16 中被引用
new_1 fatal error LNK1120: 2 个无法解析的外部命令

似乎是你改了编译器的默认设置
xiandao82 2006-12-01
  • 打赏
  • 举报
回复
再顶上去~~~~~~~~~~~~~!
xiandao82 2006-12-01
  • 打赏
  • 举报
回复
各位高手,帮帮忙啊~~~~~!
xiandao82 2006-12-01
  • 打赏
  • 举报
回复
BOOL?
这个还需要定义?
怎么定义?
我查找定义能找到阿
typedef int BOOL;
在windef.h中
ouyh12345 2006-12-01
  • 打赏
  • 举报
回复
new_1 error LNK2019: 无法解析的外部符号 "int __cdecl InitInstance(void *,int)" (?InitInstance@@YAHPAXH@Z) ,该符号在函数 _WinMain@16 中被引用

没有BOOL的定义?
wltg2001 2006-12-01
  • 打赏
  • 举报
回复
是很奇怪,你试试将这两个函数改个名字,如将 InitInstance改成 InitInstance1试试
Stefine 2006-12-01
  • 打赏
  • 举报
回复
在WinDef.h有这么一句:typedef HANDLE HINSTANCE;
数据上两者是一样的,本质上没什么区别。

HANDLE是用来标记资源的,也就是handle to an object。
HINSTANCE是Handle to an instance, 是HANDLE的一种特殊情况,常用来标记
App实例。

用HINSTANCE而不是HANDLE只是给用者一种说明的作用。
xiandao82 2006-12-01
  • 打赏
  • 举报
回复
原来是这样...HINSTANCE一般是一个程序实例句柄,HANDLE呢?他一般是代表什么句柄?
现在流行的Windows下的编程语言实在不少,所以在BBS上常常有人会问:我应该使用什么编程语言呢?其中,有一个大家认可的答案:真正的程序员使用Visual C++。 的确,Visual C++是一个功能强大、灵活、方便的编程工具,可以完成其他编程语言所无法完成的任务,可以让程序员方便地实现自己的设计,尽情的发挥自己地创造性。 Visual C++的强大无比的功能除了得益于C++的特性之外,更重要的是它具有体系完整、机制灵活、功能丰富的MFC类库。 所以,要讲Visual C++,必须讲MFC类库。 MFC的类库可以分两个层次,首先是实现MFC编程框架体系的核心MFC类库,然后是建立在核心MFC类库基础之上的扩展类库,例如,支持COM的类库,实现网络功能的类库,等等。随着Visual C++的不断升级,MFC类库的功能越来越丰富,越来越强大,但是,MFC核心类库是相对稳定的,特别是从Visual C++ 4.2开始到现在的Visual C++6.0。 本书的中心就是深入浅出地解析MFC类库,分析怎么使用MFC类库以及MFC类库的内部实现,揭开MFC复杂、深奥的面纱,让读者对MFC有一个全面、透彻、清晰的理解。关于MFC的核心实现,主要有以下几个方面。 首先,MFC采用C++的面向对象的特征封装了Windows的对象和Win32函数,一定程度上隐蔽了底层Win32的复杂性。 其次,MFC采用消息映射的方法来处理Windows消息和事件,隐藏了Windows窗口的窗口过程,简化了消息处理的复杂性和烦琐性。 还有,MFC提供了一个以文档-视为中心的编程模式,并实现了以文档-视为中心的编程框架,简化了数据处理的过程。 而且,MFC提出了模块状态、线程状态、模块线程状态来支持多线程的编程设计和DLL的编程。 本书分别从使用MFC的角度和MFC内部设计及实现的角度讨论了上述内容,分析了MFC核心的设计和实现;然后,在此基础上,进一步讨论了MFC对一些常用类的实现。有关章节的内容如下: 第一章,MFC概述。 第二章,解释MFC对Win32 API和Windows对象的封装,讨论各类MFC对象的使用,分析MFC对象和Windows对象的关系。 第三章,讨论CObject的特性及其实现,包括动态类信息、动态创建、序列化的实现等内容。 第四章,讨论MFC的消息映射机制,分析MFC对各类消息的处理,例如对Windows消息、控制通知消息、命令消息、状态更新消息、反射消息的处理等;并揭示了MFC通过消息映射手段实现C++虚拟函数机制的原理。 第五章和第六章,分析MFC编程框架启动和关闭一个应用程序的过程,揭示MFC框架的内幕,剖析以文档模板为核心创建基于文档-视的应用程序的过程,展示MFC框架处理消息和调用虚拟函数的时机和位置。 第七、八、九章,介绍MFC的动态链接库、进程、线程等概念,以及MFC动态链接库的种类和使用,讨论MFC下多线程编程的问题。并且进一步阐述MFC的核心概念之一:状态(模块状态、线程状态、模块线程状态),揭示MFC对多线程的支持机制,MFC实现规则DLL和扩展DLL的内幕。 第十章,阐述MFC下的调试手段。 第十一章,讨论CFile类,主要分析了CFile的使用和它对Win32文件函数的封装。 第十二章,讨论模式和无模式对话框,分析MFC如何设计和实现这两种对话框的功能,分析CDialog和CFormView为实现有关功能而设计的虚拟函数、消息处理函数等。 第十三章,讨论MFC工具栏和状态栏的设计及其实现,分析MFC是如何以CControlBar为基础,派生出CStatusBar、CToolBar、CDialogBar等子类,实现MFC工具栏和状态栏标准处理。 第十四章,讨论MFC的Socket类。 第一章到第十章介绍了MFC的核心概念以及实现。在此基础上,第十一章到第十四章讨论了MFC一些常用类的实现。 本书的内容对MFC的初学者(最好对Visual C++和Windows有所了解)和提高者都是很有帮助的。 如果您是一个初学者,可以读第一至第六章。主要目的是建立对MFC的全面理解,了解MFC框架是如何支持程序员编程的。如果有读不懂的地方,可以跳过,直接阅读有关分析的结论。特别是第五章和第六章,可以重点阅读,了解MFC是怎样来处理有关消息、调用有关虚拟函数的。 然后,还可以读第十章,第十一至第十四章。特别第十二章,可以重点阅读,它是MFC从CWnd或者CView派生出特定的类实现特定功能的例子,可以帮助您进一步理解MFC,并且学习如何设计和实现一个特定的类。 如果您对MFC有一定的掌握,可以进一步阅读第八和第九章,了解MFC处理DLL和线程的知识。对于第一至第六章、第十至第十四

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧