写VC资源文件时设置F1快捷键总是编译出错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了写VC资源文件时设置F1快捷键总是编译出错相关的知识,希望对你有一定的参考价值。

#define IDM_MAIN 0x3000
#define IDA_MIAN 0x3000

#define IDM_OPEN 0x4101
#define IDM_INACTIVE 0x4201
#define IDM_GRAYED 0x4202
#define IDM_HELP 0x4301

IDM_MAIN MENU DISCARDABLE

POPUP "文件(&F)"

MENUITEM "打开(&O)\t\tCtrl+Alt+0",IDM_OPEN

POPUP "查看(&V)"

MENUITEM "被禁用的菜单项",IDM_INACTIVE, INACTIVE
MENUITEM SEPARATOR
MENUITEM "被灰化的菜单项",IDM_GRAYED, GRAYED

POPUP "帮助(&H)"

MENUITEM "帮助(&H)\a\tF1",IDM_HELP,HELP



IDA_MAIN ACCELERATORS

"0",IDM_OPEN, CONTROL, ALT
VK_F1,IDM_HELP,VIRTKEY


error RC2104 : undefined keyword or key name: VK_F1

参考技术A 你单击Resource Files,把手工写好的myMenu.rc添加进去。如果原来有一个同名文件,则把这个文件删除。再编译就正确了 参考技术B 由于VK_F1的定义是在头文件winuser.h中,所以你需要在资源文件的头部加入:#include <winuser.h>即可

参考资料:http://zhidao.baidu.com/question/65335619.html

参考技术C 没定义变量VK_F1,很好改的。追问

应该如何改,请指教

追答

你用什么版本的 VC?

masm x86汇编 资源混合编译

和rc资源进行混编

我们在日常编程的时候经常使用rc来写一些dialog快捷键等。本节展示如何在其混镖环境下使用这个rc资源.

如果你使用ml来进行编译,并且使用高版本的visual studio来编辑rc文件,那么请安装XP支持组件
这里直接使用vc6.0来进行

我保存后得到两个文件

resource.h
resouce.rc

我们将h文件转化为汇编的头文件

//resource.h
//NO_DEPENDENCIES
// Microsoft Developer Studio generated include file.
// Used by myresouce.rc
//
#define BTN_TEST                        3
#define IDD_DIALOG1                     101

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1000
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

转化后

;resource.inc
IDD_DIALOG1          equ           101
_APS_NEXT_RESOURCE_VALUE    equ    102
_APS_NEXT_COMMAND_VALUE     equ    40001
_APS_NEXT_CONTROL_VALUE      equ   1000
_APS_NEXT_SYMED_VALUE       equ    101
BTN_TEST            equ            3

最后编写我们的汇编代码

.386
.model flat,stdcall
option casemap:NONE

include windows.inc
include user32.inc
include kernel32.inc
include resource.inc

includelib user32.lib
includelib kernel32.lib

.data
    g_hInst dd 0
    g_szText db "button is clicked",0



    
.code

MyDlgProc proc hWndDlg:HWND,uMsg:UINT,wParam:WPARAM,LParam:LPARAM

    .IF uMsg ==WM_CLOSE
        invoke EndDialog,hWndDlg,0
    .ELSEIF uMsg ==WM_COMMAND
        mov eax,wParam
        .IF ax == BTN_TEST
            invoke MessageBoxA,NULL,offset  g_szText,NULL,MB_OK
        .ENDIF
    .ENDIF

    mov eax,FALSE
    ret
MyDlgProc endp 



START:
    ;获取进程句柄
    invoke GetModuleHandleA,NULL
    mov g_hInst,eax
    
    invoke DialogBoxParamA,g_hInst,IDD_DIALOG1,NULL,offset MyDlgProc,0



    invoke ExitProcess,0

end START

执行编译

rc myresouce.rc
ml /c /coff my32.asm
link /subsystem:windows  my32.obj myresouce.RES

c调用汇编

.386
.model flat,stdcall
option casemap:NONE

.code
myAddFun proc arg1:dword,arg2:dword
    mov eax,arg1
    add eax,arg2
    ret
myAddFun endp 
end

编译成obj后拖入vs中


执行函数声明并调用

extern "C" int __stdcall myAddFun(int, int);

int main()

	int ret = myAddFun(1, 2);
    std::cout << "Hello World!\\n"<<ret<<std::endl;

汇编调用c

请使用vc6.0编译减少链接问题

编写如下代码

编译后得到myfun.obj 放入汇编目录并写入如下代码

.386
.model flat,stdcall
option casemap:NONE


myAddFun proto arg1:dword,arg2:dword

.code

Start:
    invoke myAddFun, 2,3


end Start
```.386
.model flat,stdcall
option casemap:NONE


myAddFun proto arg1:dword,arg2:dword

.code

Start:
    invoke myAddFun, 2,3


end Start
ml /c /coff  xx.asm
link  /subsystem:console myfun.obj xx.obj 

调用一些系统库例子

.386
.model flat,stdcall
option casemap:NONE

include windows.inc
include user32.inc
include kernel32.inc
include msvcrt.inc

includelib user32.lib
includelib kernel32.lib
includelib msvcrt.lib

.data
    g_hInst dd 0
    g_szText db "button is clicked",0
    g_szFmt db "%s %d",0dh,0ah,0
    
.code

START:
    ;获取进程句柄
    invoke GetModuleHandleA,NULL
    mov g_hInst,eax
    
    ; invoke DialogBoxParamA,g_hInst,IDD_DIALOG1,NULL,offset MyDlgProc,0
    invoke crt_strlen,offset g_szText
    invoke crt_printf,offset g_szFmt,offset g_szText,eax


    invoke ExitProcess,0

end START

生产一个dll

.386
.model flat,stdcall
option casemap:NONE

include windows.inc
include user32.inc
include kernel32.inc
include msvcrt.inc

includelib user32.lib
includelib kernel32.lib
includelib msvcrt.lib

.data
    g_hInst dd 0
    g_szText db "button is clicked",0
    g_szFmt db "%s %d",0dh,0ah,0
    
.code

PrintText proc
    invoke crt_strlen,offset g_szText
    invoke crt_printf,offset g_szFmt,offset g_szText,eax
    ret
PrintText endp



DllMain proc hinstDLL:HINSTANCE, fdwReason:DWORD,lpReserved:LPVOID
    mov eax,TRUE
    ret
DllMain endp




end DllMain
EXPORTS
    PrintText
/dll 命令用于生产一个dll不然会生产exe  /def用于指定导出
link  /subsystem:windows /dll  my32.obj /def:test.def

我们写一个例子进行调用

.386
.model flat,stdcall
option casemap:NONE


include windows.inc
include user32.inc
include kernel32.inc
include msvcrt.inc

includelib user32.lib
includelib kernel32.lib
includelib msvcrt.lib


PrintText proto


.code

Start:
    invoke PrintText
    invoke ExitProcess,0
end Start

在链接时加上lib库即可

link  /subsystem:console invoke.obj my32.lib

实现一个win32最小化程序

.386
.model flat,stdcall
option casemap:NONE

include windows.inc
include user32.inc
include kernel32.inc
include msvcrt.inc

includelib user32.lib
includelib kernel32.lib
includelib msvcrt.lib

.data
    g_szWndClass db "xxsswndClass",0
    g_szTitle db "title",0
    
.code

MyDlgProc proc stdcall hWndDlg:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    .IF uMsg==WM_CLOSE
      invoke  PostQuitMessage,0
    .ENDIF

    invoke DefWindowProc,hWndDlg,uMsg,wParam,lParam
    ret
MyDlgProc endp 


WinMain proc   hInst:HINSTANCE ,
               hPrevInstance:HINSTANCE ,
               lpCmdLine:LPWSTR ,
               nCmdShow:DWORD
    local  @wc:WNDCLASS
    local  @msg:MSG
    ;注册窗口类
    ;清空内存用0去填充
    invoke RtlZeroMemory,addr @wc,type @wc
    ;窗口风格
    mov @wc.style,CS_HREDRAW or CS_VREDRAW
    ;窗口过程 
    mov @wc.lpfnWndProc ,offset MyDlgProc
    ;hInst 是内存 wc也是内存,但是汇编不允许内存直接到内存。workaround 应对内存到内存
    push hInst
    pop @wc.hInstance

    mov @wc.hbrBackground,COLOR_GRAYTEXT
    mov @wc.lpszClassName,offset g_szWndClass


    invoke RegisterClassA,addr @wc

    .IF eax==0
        ret
    .ENDIF

 
    ;创建窗口实例
    invoke CreateWindowExA,
                        0, 
                        offset g_szWndClass,
                        offset g_szTitle,
                        WS_OVERLAPPEDWINDOW or WS_VISIBLE,
                        CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
                        NULL,
                        NULL,
                        hInst,
                        NULL


    .IF eax ==  NULL
        ret
    .ENDIF

    ;消息循环
    .WHILE TRUE
        invoke GetMessage,addr @msg,NULL,0,0
        .IF eax==0
            ret
        .ENDIF

        invoke DispatchMessage,addr @msg
    .ENDW


WinMain endp

START:
    invoke GetModuleHandleA,NULL
    invoke WinMain,eax,NULL,NULL,NULL
    invoke ExitProcess,0

end START

以上是关于写VC资源文件时设置F1快捷键总是编译出错的主要内容,如果未能解决你的问题,请参考以下文章

masm x86汇编 资源混合编译

VC2013设置输出文件目录

VC中如何将添加到资源的文件保存到目标位置?

MPI在VC中配置出现下面情况:编译时没错,但是build时就出错了

vs2008的快捷键是怎么设置的

Android studio 加载Java和资源文件出错