VC中加汇编的问题?

时间:2021-03-18 01:01:06
char * lpCaption="aaa";
char * lpText="c/c++中汇编";
__asm{

    push MB_OK
    push lpCaption  
    push lpText       
    push NULL 
    call dword ptr MessageBoxA
}
请问为什么这段代码在WIN编程中好用!而在用MFC框架的程序中报错:
D:\Documents and Settings\Administrator\桌面\aaa\MainFrm.cpp(119) : error C2420: 'MessageBoxA' : illegal symbol in first operand
D:\Documents and Settings\Administrator\桌面\aaa\MainFrm.cpp(120) : error C2415: improper operand type
Error executing cl.exe.

aaa.exe - 2 error(s), 0 warning(s)

13 个解决方案

#1


帮你顶,关注!

#2


严重关注

#3



push NULL
push lpCaption  
push lpText       
push MB_OK

猜的^_^

#4


因该如下使用:
char * lpCaption="aaa";
char * lpText="c/c++中汇编";
int  (__stdcall *fun)( HWND ,  LPCTSTR ,  LPCTSTR ,  UINT );
    fun = ::MessageBox;
__asm{
    
    push MB_OK
    push lpCaption  
    push lpText       
    push NULL 
    call dword ptr fun
}

#5


代码移植有许多问题
在MFC 中要用::访问全局函数。

#6


call MessageBoxA 好象直接这样可以,没VC没法调,你可以试一下

#7


lovenoend(有容乃大):应该不行吧
如果行的话,原程序也应该行的。

#8


在这里你应该用Unicode编码的MessageBoxW。
wchar_t * lpCaption=L"aaa";          //unicode编码的字符串
wchar_t * lpText=L"c/c++中汇编";
__asm{

    push MB_OK
    push lpCaption  
    push lpText       
    push NULL 
    call dword ptr MessageBoxW
}

#9


谢谢broadoceans(broadoceans)兄:能再说一下为什么吗?
谢谢najzni(najzni) ( )兄:您的也对:能再说一下为什么吗?
马上结贴给分!!!!!!!!!!!!!!!

#10


为什么我的程序在win32 application工程中不用改动也能用?

#11


你可以看一看在mfc中引用MessageBox的头文件,
它是一个条件编译的宏。在mfc中,默认的是unicode编码,所以应该为MessageBoxW.
如果自己要调用ascii,必须自己指定。当然你也可以#undef来达到同样的目的。

#12


在winuser.h里可以找到如下一段代码:
int
WINAPI
MessageBoxA(
    HWND hWnd ,
    LPCSTR lpText,
    LPCSTR lpCaption,
    UINT uType);
WINUSERAPI
int
WINAPI
MessageBoxW(
    HWND hWnd ,
    LPCWSTR lpText,
    LPCWSTR lpCaption,
    UINT uType);
#ifdef UNICODE
#define MessageBox  MessageBoxW
#else
#define MessageBox  MessageBoxA
#endif // !UNICODE
在VC编译器设置里面也是用的"_MBCS" ,也就是说默认采用的是mbcs编码,即是英文用一个字节编码,中文用两个字节编码。对应MessageBoxA的形式。所以在VC里默认的调用方式是MessageBoxA。说实话,我也不明白为什么在__asm{}里面,必须采用UICODE编码的形式。只是以前我碰到过类似的情况。我觉得broadoceans(broadoceans网友的“在mfc中,默认的是unicode编码,所以应该为MessageBoxW.”不是很确切。以上只是我的个人观点,不正确之处还望大家指正。

#13


najzni(najzni)说的是呀!
再次感谢楼上两兄!!!!!!!请允许我再等两贴,就结分.
为什么用::全局调用也好用,难道看到__asm{},MFC就将MessageBox引用为MessageBoxW,
就是说__asm{}中必须采用UICODE编码的形式.

#1


帮你顶,关注!

#2


严重关注

#3



push NULL
push lpCaption  
push lpText       
push MB_OK

猜的^_^

#4


因该如下使用:
char * lpCaption="aaa";
char * lpText="c/c++中汇编";
int  (__stdcall *fun)( HWND ,  LPCTSTR ,  LPCTSTR ,  UINT );
    fun = ::MessageBox;
__asm{
    
    push MB_OK
    push lpCaption  
    push lpText       
    push NULL 
    call dword ptr fun
}

#5


代码移植有许多问题
在MFC 中要用::访问全局函数。

#6


call MessageBoxA 好象直接这样可以,没VC没法调,你可以试一下

#7


lovenoend(有容乃大):应该不行吧
如果行的话,原程序也应该行的。

#8


在这里你应该用Unicode编码的MessageBoxW。
wchar_t * lpCaption=L"aaa";          //unicode编码的字符串
wchar_t * lpText=L"c/c++中汇编";
__asm{

    push MB_OK
    push lpCaption  
    push lpText       
    push NULL 
    call dword ptr MessageBoxW
}

#9


谢谢broadoceans(broadoceans)兄:能再说一下为什么吗?
谢谢najzni(najzni) ( )兄:您的也对:能再说一下为什么吗?
马上结贴给分!!!!!!!!!!!!!!!

#10


为什么我的程序在win32 application工程中不用改动也能用?

#11


你可以看一看在mfc中引用MessageBox的头文件,
它是一个条件编译的宏。在mfc中,默认的是unicode编码,所以应该为MessageBoxW.
如果自己要调用ascii,必须自己指定。当然你也可以#undef来达到同样的目的。

#12


在winuser.h里可以找到如下一段代码:
int
WINAPI
MessageBoxA(
    HWND hWnd ,
    LPCSTR lpText,
    LPCSTR lpCaption,
    UINT uType);
WINUSERAPI
int
WINAPI
MessageBoxW(
    HWND hWnd ,
    LPCWSTR lpText,
    LPCWSTR lpCaption,
    UINT uType);
#ifdef UNICODE
#define MessageBox  MessageBoxW
#else
#define MessageBox  MessageBoxA
#endif // !UNICODE
在VC编译器设置里面也是用的"_MBCS" ,也就是说默认采用的是mbcs编码,即是英文用一个字节编码,中文用两个字节编码。对应MessageBoxA的形式。所以在VC里默认的调用方式是MessageBoxA。说实话,我也不明白为什么在__asm{}里面,必须采用UICODE编码的形式。只是以前我碰到过类似的情况。我觉得broadoceans(broadoceans网友的“在mfc中,默认的是unicode编码,所以应该为MessageBoxW.”不是很确切。以上只是我的个人观点,不正确之处还望大家指正。

#13


najzni(najzni)说的是呀!
再次感谢楼上两兄!!!!!!!请允许我再等两贴,就结分.
为什么用::全局调用也好用,难道看到__asm{},MFC就将MessageBox引用为MessageBoxW,
就是说__asm{}中必须采用UICODE编码的形式.