1>TestDlg.obj : error LNK2019: 无法解析的外部符号 "long __stdcall WinSunProc(struct HWN

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1>TestDlg.obj : error LNK2019: 无法解析的外部符号 "long __stdcall WinSunProc(struct HWN相关的知识,希望对你有一定的参考价值。

1>TestDlg.obj : error LNK2019: 无法解析的外部符号 "long __stdcall WinSunProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WinSunProc@@YGJPAUHWND__@@IIJ@Z),该符号在函数 "public: virtual int __thiscall CTestDlg::OnInitDialog(void)" (?OnInitDialog@CTestDlg@@UAEHXZ) 中被引用
1>E:\作业\lesson7\lesson7\Debug\lesson7.exe : fatal error LNK1120: 1 个无法解析的外部命令

就是孙鑫 lesson7 最后创建回车键响应过程
void CTestDlg::OnOk()

// TODO: 在此添加控件通知处理程序代码
//OnOK();//基类onok函数

WNDPROC prevProc;
LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);

BOOL CTestDlg::OnInitDialog()

CDialog::OnInitDialog();

// TODO: 在此添加额外的初始化

prevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(long)WinSunProc);//***********
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE

加上****这一行就报上面错误!!!!!!!!!!!!!

而且加上WNDPROC prevProc;
LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);

//afx_msg void OnBnClickedButton1();
//ON_BN_CLICKED(IDC_BUTTON1, &CTestDlg::OnBnClickedButton1)

if(uMsg==WM_CHARr&&wParam==0x0d)

::SetFocus(::GetNextWindow(hwnd,GW_HWNDNEXT));
return 1;

else

return preProc(hwnd,uMsg,wParam,lParam);


prevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(LONG)WinSunProc);

BOOL CTestDlg::OnInitDialog()

CDialog::OnInitDialog();

// TODO: 在此添加额外的初始化

return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE

报错
1>e:\作业\lesson7\lesson7\lesson7\testdlg.cpp(219) : error C2059: 语法错误 : “if”
1>e:\作业\lesson7\lesson7\lesson7\testdlg.cpp(220) : error C2143: 语法错误 : 缺少“;”(在“”的前面)
1>e:\作业\lesson7\lesson7\lesson7\testdlg.cpp(220) : error C2447: “”: 缺少函数标题(是否是老式的形式表?)
1>e:\作业\lesson7\lesson7\lesson7\testdlg.cpp(224) : error C2059: 语法错误 : “else”
1>e:\作业\lesson7\lesson7\lesson7\testdlg.cpp(225) : error C2143: 语法错误 : 缺少“;”(在“”的前面)
1>e:\作业\lesson7\lesson7\lesson7\testdlg.cpp(225) : error C2447: “”: 缺少函数标题(是否是老式的形式表?)
1>e:\作业\lesson7\lesson7\lesson7\testdlg.cpp(230) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>e:\作业\lesson7\lesson7\lesson7\testdlg.cpp(230) : error C2373: “prevProc”: 重定义;不同的类型修饰符
1> e:\作业\lesson7\lesson7\lesson7\testdlg.cpp(208) : 参见“prevProc”的声明
1>e:\作业\lesson7\lesson7\lesson7\testdlg.cpp(230) : error C2660: “GetDlgItem”: 函数不接受 1 个参数
1>e:\作业\lesson7\lesson7\lesson7\testdlg.cpp(230) : error C2227: “->m_hWnd”的左边必须指向类/结构/联合/泛型类型
1>生成日志保存在“file://e:\作业\lesson7\lesson7\lesson7\Debug\BuildLog.htm”
1>lesson7 - 10 个错误,0 个警告
========== 生成: 成
呃,不知道怎么动的把prevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(LONG)WinSunProc);
移到函数外去了……

第一个错误问题很浅显,很简单,你只是定义声明了一个子窗口响应回调函数。却没有写函数实现的代码。自然报如上错误。
而第二错误也一样很明显,你复制了一下代码,但是犯了一个粗心小错误。函数实现后面没有分号,首先去掉分号,然后跟一般的函数一样写实现的代码

LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
); //这里去掉分号

//afx_msg void OnBnClickedButton1();
//ON_BN_CLICKED(IDC_BUTTON1, &CTestDlg::OnBnClickedButton1)

/这里加大括号
if(uMsg==WM_CHARr&&wParam==0x0d)

::SetFocus(::GetNextWindow(hwnd,GW_HWNDNEXT));
return 1;

else

return preProc(hwnd,uMsg,wParam,lParam);

//这里加大括号
还有错误不是因为加了这句。 prevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(long)WinSunProc);

在提点一番,窗口消息响应回调函数,没那么神奇,它也是一个函数。函数其作用自然有声明和实现两个部分。写回调函数如同写一般的函数一样。只不过它相当特别一点,是写消息处理的函数。对于此问题,还有不明白的追问。我也有孙鑫的教程加源代码。追问

谢谢哈~为什么要加括号?我确实有很多不明白的地方,能麻烦把孙鑫教程原代码发到我邮箱里吗?1191405824@qq.com非常感谢

参考技术A prevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(long)WinSunProc);//***********
回调函数为什么要强制转换成,(long)

56_异常处理error,errors和painc的使用

Go语言引入了一个关于错误处理的标准模式,即error接口,它是Go语言内建的接口类型

//error和errors的使用
package main

import (
"errors"
"fmt"
)

func main()
//调用errorf()方法,返回一个error类型的字符串(error是一个接口类型)
var err1 error = fmt.Errorf("this is a new time")
fmt.Println(err1)
//直接调用errors包的new方法,作用和errorf一样
err2 := errors.New("this is a good new")
fmt.Println(err2)


  当遇到不可恢复的错误状态的时候,如数组访问越界、空指针引用等,这些运行时错误会引起painc异常。这时,上述错误处理方式显然就不适合了。反过来讲,在一般情况下,我们不应通过调用panic函数来报告普通的错误,而应该只把它作为报告致命错误的一种方式。当某些不应该发生的场景发生时,我们就应该调用panic。

  当panic异常发生时,程序会中断运行,并立即执行在该goroutine(可以先理解成线程,在中被延迟的函数(defer 机制)。随后,程序崩溃并输出日志信息。日志信息包括panic value和函数调用的堆栈跟踪信息。

不是所有的panic异常都来自运行时,直接调用内置的panic函数也会引发panic异常;panic函数接受任何值作为参数。
  func panic(v interface)

//panic代码
package main

import "fmt"

func test(a, b int) (res int)
if b == 0
panic("this is a zero")
else
res = a / b
return



func main()
//可以隐式调用painc,使程序中断
var a []int = []int1, 2, 3, 4
result := test(1, 0) //程序会在此处中断,不会往下执行
fmt.Println(result)
for _, value := range a
fmt.Println(value)


以上是关于1>TestDlg.obj : error LNK2019: 无法解析的外部符号 "long __stdcall WinSunProc(struct HWN的主要内容,如果未能解决你的问题,请参考以下文章

error C2731: “WinMain”: 无法重载函数

上下文闭包类型 '(Data?, URLResponse?, Error?) -> Void' 需要 3 个参数,但 1 在闭包主体中使用

jdk error

1>TEST.obj : error LNK2005: "int a" (?a@@3HA) 已经在 data.obj 中定义

jsp一些使用技巧

[error]