首页
社区
课程
招聘
汇编的静态链接库如何在VC中调用?
发表于: 2006-2-21 20:32 6355

汇编的静态链接库如何在VC中调用?

2006-2-21 20:32
6355
.386
.model flat,stdcall,c
option casemap:none

include windows.inc

include user32.inc
include kernel32.inc

includelib user32.lib
includelib kernel32.lib

public MsgBox

.const
_testdb"我爱你",0

.code

MsgBox proc

invoke MessageBox,NULL,addr _test,0,0
ret

MsgBox endp

end

这段代码可以编译成功~~~

然后我给VC调用

但是VC在编译的时候出现
error LNK2019: 无法解析的外部符号 _MessageBoxA ,该符号在函数 _MsgBox 中被引用

实在不知道怎么解决

VC代码:
#include <windows.h>
#pragma comment(lib,"test.lib")

extern "C" void MsgBox();

void main()
{
MsgBox();
}

如果MsgBox中不调用API函数,只是做一个简单的加法运算,则VC可以编译成功也可以成功运行

问了好多地方,都不知道~~~・
难道汇编写的静态库,里面不可以调用API函数?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
请这样修改:

汇编代码第2行改为:
.model flat, stdcall

第18行改为:
MsgBox PROC C

在VC6.0下测试成功
2006-2-21 22:45
0
雪    币: 235
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
倒~~~~~~

真的成功了~~~

太谢谢了~~~~

终于没有让我失望~~~

注册ID等一天才能发帖子,看来没白等~~~

对了,阁下知道,为什么在开始声明stdcall,c会导致VC的编译错误吗?
2006-2-21 22:54
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
4
声明为stdcall, c的话实际上是声明了c函数调用类型, stdcall会被忽略, 这样编译器在处理API函数MessageBoxA函数的时候会把它当作C调用类型,而实际上MessageBoxA是Stdcall类型的
2006-2-21 23:16
0
雪    币: 235
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
反过来呢?

如果我要在汇编中调用VC写的函数

我尝试了一下

#include <windows.h>

extern "C" void fuckme()
{
        MessageBox(NULL,"","",0);
}

汇编

.386
.....

fuckme proto C

这样调用fuckme函数会出错的~~
fatal error LNK1104: cannot open file "LIBC.lib"

如果不加后面的C,就会找不到fuckme这个函数
main.obj : error LNK2001: unresolved external symbol _fuckme@0
2006-2-24 00:54
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
定义为:extern "C" void __stdcall func()
就能找到"_func@0"了.
2006-2-24 09:21
0
雪    币: 235
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
还是不行啊~

MASM:
.386
.model flat,stdcall
option casemap:none

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

includelib user32.lib
includelib kernel32.lib
includelib fuckme.lib

fuckme proto C

.code

start:
invoke fuckme
invoke ExitProcess,0
end start

VC:
#include <windows.h>

extern "C" void WINAPI fuckme()
{
        MessageBox(NULL,"","",0);
}
2006-2-25 02:46
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
像MASM类的中级汇编语言会隐藏函数命名方法,虽然对初学者有入门方便,但链接起来(尤其是跨语言)可能会出现不易处理的问题.
这一点我比较喜欢使用NASM,完全使用自定义的函数名,可惜不支持宏.
其实MASM也应该支持自定义函数名(即不会自动修改函数名).不过我不太了解.
2006-2-25 10:06
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
9
MASM支持自定义函数名的, SYSCALL就是
我我测试了下面两个程序, 没有问题

;-----------------------------------------------------
;a.asm
.386
.model flat,stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\user32.inc

includelib \masm32\lib\user32.lib

fuckme proto C

.code

start:
invoke fuckme
ret
end start

//////////////////////////////////////////////////
//b.cpp
#include <windows.h>

extern "C" void fuckme()
{
  MessageBox(NULL,"","",0);
}

编译连接命令如下:
ml /c /Cp /coff a.asm
cl /c b.cpp
link /subsystem:windows a.obj b.obj
2006-2-25 10:53
0
雪    币: 191
活跃值: (55)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
最近我也在学32位汇编语言,在这里看到不少好东西,非常感激大家。真的非常高兴。
2006-5-26 09:44
0
游客
登录 | 注册 方可回帖
返回
//