首页
社区
课程
招聘
如何用c写的dll在win32汇编中使用
发表于: 2009-11-15 10:09 5146

如何用c写的dll在win32汇编中使用

2009-11-15 10:09
5146
真的不想在看雪问这种很低级的问题,自己也在问之前百度了好长时间,也按照上面说的方法自己试过了,没有搜到c写的dll在汇编中使用的例子,大多数是在vb中或者java,c++中使用

甚是疑惑对于c++,c,vc,vc++,MFC,c的sdk,这些区别,自己耶搜到一些关于这些的

VC++是WinDOS下开发人员使用的专业C++ SDK(SDK,Standard SoftWare Develop Kit,专业软件开发平台),VC++只是一个编译器,或者说是一种编译器+源程序编辑器的IDE,WS,PlatForm

MFC就是挂在VC++之上的一个辅助软件开发包

C++是一种程序设计语言,是一种大家都承认的软件编制的通用规范,c也是一样的,vc是c的sdk

Pascal是Delphi的语言基础,Delphi使用Pascal规范来进行Win下应用程序的开发和编译

Basic语言在VB开发出来被应用的年代已经成了Basic语言的新规范,VB新加的Basic语言要素,如面向对象程序设计的要素,是一种性质上的飞跃,使VB既是一个IDE,又成长成一个新的程序设计语言

看了上面的一些心里大概明白了一些

下面的是在罗的书中看到的:关于不同语言之间的dll调用问题
vc和win32汇编使用的名字修饰约定是相同的,vc中使用win32汇编写的dll函数,只要在头文件中加上_stdcall
vc写的dll只要将函数定义为stdcall的方式,就可以了

罗写的很明白,可是我没写过c中的dll,对这些名字约定甚是迷惑

写了一个简单的dll()
#include  <windows.h>
_stdcall CALLBACK MySum(int a,int b);

BOOL APIENTRY DllMain( HANDLE hModule,
                                          DWORD  ul_reason_for_call,
                                          LPVOID lpReserved
                                          )
{
    return TRUE;
}

_stdcall CALLBACK MySum(int a,int b);

{
        return a+b;
}

vc编译提示missing function header (old-style formal list?)

放弃之

继续百度,找到dll的调用分位显示和隐式调用
这是我找到的关于dll编写的http://hi.baidu.com/hxzon/blog/item/7333af0181a1e40e1c958339.html             不懂c++,放弃

继续百度,找到一篇c写的DLL供vb调用的http://blog.csdn.net/sgnaw/archive/2006/12/07/1433343.aspx
#include  <windows.h>
#include "MyDLL.h"

int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
     return TRUE ;
}

__stdcall int CALLBACK MySum(int a,int b)
{
   return a+b;
}

/**//*----------------------
   MyDLL.h 文件
  ----------------------*/
#ifdef __cplusplus
extern "C" {
#endif

__stdcall int CALLBACK MySum (int, int) ;

#ifdef __cplusplus
}
#endif

;
; MyDLL.def 文件
;
LIBRARY "MyDLL"
EXPORTS
MySum @1

成功编译出dll,感到很欣慰,但是win32是从右开始入栈,而vb好像是从左

已经持续一天了,还是没搞出来

这种对有这经验的人来说是好简单,没遇到过所以觉的很难

希望提供一个具体的例子
要隐式调用的,

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

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 157
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
可以试试google...baidu技术方面的搜索做的没有google好...
对于dll的问题,没接触过,帮不上忙了...
2009-11-15 10:14
0
雪    币: 146
活跃值: (182)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
3
都差不多的,搜c出c++,搜c++出vc,整个世界都乱了
2009-11-15 10:16
0
雪    币: 146
活跃值: (182)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
4
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

//#if BUILDING_DLL
//# define DLLIMPORT __declspec (dllexport)
//#else /* Not BUILDING_DLL */
//# define DLLIMPORT __declspec (dllimport)
//#endif /* Not BUILDING_DLL */

/*定义了一个 dll 函数 addxy,返回2个数的和*/
_stdcall  addxy ( int x, int y)
{
    return (x+y);
}

BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{
    switch (reason)
    {
      case DLL_PROCESS_ATTACH: /*dll 进程加载的时候执行的事情*/
        break;

      case DLL_PROCESS_DETACH: /*dll 进程卸载的时候执行的事情*/
        break;

      case DLL_THREAD_ATTACH: /*dll 线程加载的时候执行的事情*/
        break;

      case DLL_THREAD_DETACH: /*dll 线程卸载的时候执行的事情*/
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
}
unresolved external symbol _main
2009-11-15 10:31
0
雪    币: 208
活跃值: (148)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
include kernel32.inc
includelib kernel32.lib

.data
dll_name db 'myDll.dll',0
func_name db "myFunc",0

.code
push offset dll_name
call LoadLibraryA
push offset func_name
push eax
call GetProcAddressA
call eax
看完后给K币,我赚K币
2009-11-15 11:53
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
看下面~~~
2009-11-15 12:02
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7

更正一下,上面我写的有几处错误,sorry...应该是这样:
/*************************************/
MyDLL.h 文件
/************************************/

#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
#include <windows.h>
MYDLL_API int CALLBACK MySum(int a,int b);

/*************************************/
MyDLL.c 文件
/************************************/

#define MYDLL_EXPORTS
#include   "MyDLL.h"
BOOL APIENTRY DllMain( HANDLE hModule,
            DWORD  ul_reason_for_call,
            LPVOID lpReserved
            )
{
    return TRUE;
}

int CALLBACK MySum(int a,int b)
{
  return a+b;
}
2009-11-15 12:15
0
雪    币: 146
活跃值: (182)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
8
d:\程序\msdev98\myprojects\dll3\dll3.h(8) : error C2146: syntax error : missing ';' before identifier 'MySum'
d:\程序\msdev98\myprojects\dll3\dll3.h(8) : fatal error C1004: unexpected end of file found

头文件显示有错误

楼上的更正后的对了,不知道能不能在汇编中调用,我式下,先谢谢了
2009-11-15 12:15
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
隐式调用不需要def文件
2009-11-15 12:16
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
嗯,6楼写错了,7楼才是正确的,不好意思。。
2009-11-15 12:16
0
雪    币: 146
活跃值: (182)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
11
我的inc文件是这样定义的:MySum        proto        :dword,:dword

也将生产的lib文件放到了我程序目录下
在win32汇编程序中直接调用MySum还是出错
利用c写的dll.obj : error LNK2001: unresolved external symbol _MySum@8
利用c写的dll.exe : fatal error LNK1120: 1 unresolved externals
觉的还是名字修饰出了问题
对于5楼的,我需要隐式调用
2009-11-15 12:25
0
雪    币: 173
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学过C,很少写代码,所以很少发现问题。
2009-11-15 12:36
0
雪    币: 95
活跃值: (419)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
13
将dll头文件里MYDLL_API int CALLBACK MySum(int a,int b)前面加上extern "C"重新编译生成dll和lib文件即可
2009-11-15 13:06
0
雪    币: 146
活跃值: (182)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
14
非常感谢13楼及10楼的,谢谢
问题解决
2009-11-15 14:42
0
雪    币: 146
活跃值: (182)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
15

老罗的书中书加_stdcall ,原来是假的
2009-11-15 14:50
0
游客
登录 | 注册 方可回帖
返回
//