来说下win32和汇编的接口问题吧。Win32程序是以WinMain()开始的,而C是以main开始的,但是Win32真的必须一定要以WinMain开始么?其实不是。之所以以WinMain开始,是因为编译器内定了WinMain作为被调函数名,然后在WinMain前面,会生成一段asm代码,去调用WinMain 从而开始整个程序。
知道了原理,我们来试试。偶用的工具和平台如下:
Win2000 Prefossonl Sp4 VC6.0 汇编方面是Masm32 V8.2。
开始前说下原理,在VC环境下,建立个Win32App工程,删除系统生成的WinMain,这个时候直接编译,系统Link时会出错,因为VC编译器内定的程序起始点是WinMain ,所以当你没有写这个函数时,系统就会找不到入口点,这样程序就不知道要从哪里开始,这样link时就会报错。 我们要做的就是自己写一个asm文件,来自己定义一个程序入口,然后用C实现这个入口就可以了。从接口上抽象来说,就是汇编调用C函数。下面看代码:
===用来定义程序入口的asm========================================================
.586
.model flat
.data
copyright db "Hello World!"
.code
extern C xmain: near ;声明程序入口点
extern C Exit: near ;声明程序出口点
extern C TerminateProcess@8: near ;Win32API 可以在这里调用,也可以在C的实现函数里调用
extern C GetCurrentProcess@0: near ;Win32API 可以在这里调用,也可以在C的实现函数里调用
public STARTCODE
STARTCODE PROC NEAR C
call xmain
call Exit
; push eax
; call GetCurrentProcess@0
;push eax
;call TerminateProcess@8
STARTCODE ENDP
END STARTCODE
=================================================================================
上面这个asm代码,定义了程序入口为xmain,出口为exit 下面要做的就是用C来实现这2个函数,并且把他们的obj文件link起来就可以了。
=========main.c===================================================================
#include <Windows.h>
int xmain(void)
{
return 0;
}
void Exit(int ExitCode)
{
TerminateProcess(GetCurrentProcess(),ExitCode);
}
================================================================================
这段程序用来实现入口和出口函数。现在先用Masm将asm文件编译,得到obj文件。再将obj文件加入VC6的
Win32App工程,编译这个工程,link。就可以了,然后你可以用单步调试的方法看看,记得打开asm反汇编。
asm代码如何和C接口的。