我想使用 winAPI 创建一个窗口:
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,
int nShowCmd)
{
WNDCLASSEX wClass;
HWND hWnd;
wClass.cbClsExtra=NULL;
wClass.cbSize=sizeof(WNDCLASSEX);
wClass.cbWndExtra=NULL;
wClass.hbrBackground=(HBRUSH)COLOR_WINDOW;
wClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wClass.hIcon=NULL;
wClass.hIconSm=NULL;
wClass.hInstance=hInst;
wClass.lpfnWndProc=(WNDPROC)WinProc;
wClass.lpszClassName=TEXT("Window Class");
wClass.lpszMenuName=NULL;
wClass.style=CS_HREDRAW|CS_VREDRAW|CS_DROPSHADOW ;
if(!RegisterClassEx(&wClass))
{
int nResult=GetLastError();
MessageBox(NULL,
TEXT("Window class creation failed"),
TEXT("Window Class Failed"),
MB_ICONERROR);
}
hWnd=CreateWindowEx(NULL,
TEXT("Window Class"),
TEXT("My Process Explorer"),
WS_OVERLAPPEDWINDOW,
200,
20,
800,
630,
NULL,
NULL,
hInst,
NULL);
}
但我收到访问冲突错误。 为什么?
最佳答案
Tenfour 已经在评论中指出了这一点,但值得再次重复大约 6 或 8 次:永远不要将指向窗口过程函数的指针转换为 WNDPROC。事实上,不要投任何东西,除非你知道确切的原因你需要投它。你对他问你为什么选角的评论的回答是:
For not getting Warnings!
事实上,这正是问题所在! Actor 所做的就是告诉编译器“闭嘴,我知道我在做什么!”您不再收到警告,因为您按下了“覆盖”按钮。但这些警告是有原因的——它们试图告诉你你的代码被破坏了。编译器可以帮助你。忽略它不会走得太远,或者更糟的是,翻转覆盖位并告诉它闭嘴。正如多产的 Win32 博主 Raymond Chen 所说,A function pointer cast is a bug waiting to happen . (这是一个如此常见的错误,他还写了关于它的 here 和 here 。)
人们感到被迫强制转换函数指针的最常见原因是因为编译器试图警告他们他们的函数签名不正确。记录了窗口过程函数的正确签名 here on MSDN看起来像这样:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
当然,您可以命名您选择的函数。但是参数的数量、类型和返回值都需要与该签名匹配。
如果他们不这样做,编译器将发出错误。如果您翻转覆盖位并丢弃错误,则代码将在运行时失败,这正是您现在遇到的症状。 CreateWindowEx 函数说“嘿,哇,我不认识你试图传递给我的那个窗口过程!”
当我编写一个有效的窗口过程 stub 、删除虚假转换,然后运行您的代码时,它工作正常,没有错误。例如:
LRESULT CALLBACK WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc(hWnd, message, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst,
LPSTR lpCmdLine, int nShowCmd)
{
WNDCLASSEX wClass;
HWND hWnd;
wClass.cbClsExtra=NULL;
wClass.cbSize=sizeof(WNDCLASSEX);
wClass.cbWndExtra=NULL;
wClass.hbrBackground=(HBRUSH)COLOR_WINDOW;
wClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wClass.hIcon=NULL;
wClass.hIconSm=NULL;
wClass.hInstance=hInst;
wClass.lpfnWndProc=WinProc;
wClass.lpszClassName=TEXT("Window Class");
wClass.lpszMenuName=NULL;
wClass.style=CS_HREDRAW|CS_VREDRAW|CS_DROPSHADOW ;
if(!RegisterClassEx(&wClass))
{
int nResult=GetLastError();
MessageBox(NULL,
TEXT("Window class creation failed"),
TEXT("Window Class Failed"),
MB_ICONERROR);
}
hWnd=CreateWindowEx(NULL,
TEXT("Window Class"),
TEXT("My Process Explorer"),
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
200,
20,
800,
630,
NULL,
NULL,
hInst,
NULL);
}
但是,还有一些需要注意的事情:
您使用的是 ANSI 入口点 WinMain,这是不正确的,因为在 2012 年,您绝对应该针对 Unicode 进行编译。您已经在使用 TEXT() 宏来确保在定义 UNICODE 时您的字符串文字是宽字符串,但是您需要对入口点执行相同的操作功能。将定义更改为:
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow);
您正在正确检查 RegisterClassEx 函数的返回值,如果失败,则调用 GetLastError 作为调试辅助。您应该使用 CreateWindowEx 函数做同样的事情。 The documentation for that function确实表明它设置了最后一个错误:
If the function fails, the return value is
NULL. To get extended error information, callGetLastError.
因此您可以将代码更改为:
hWnd=CreateWindowEx(NULL,
TEXT("Window Class"),
TEXT("My Process Explorer"),
WS_OVERLAPPEDWINDOW,
200,
20,
800,
630,
NULL,
NULL,
hInst,
NULL);
if (!hWnd)
{
int nResult = GetLastError();
MessageBox(NULL,
TEXT("Window creation failed"),
TEXT("Window Failed"),
MB_ICONERROR);
}
关于c - 调用 CreateWindowEx 函数时出现访问冲突错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10869240/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c