首页 文章

从DLL导出ASM功能 - Visual Studio C.

提问于
浏览
4

我创建了Dll项目 . 我创建了具有一个函数的myasm.asm文件:

.486
.model flat, stdcall
.code
MyProc1 proc x: DWORD, y: DWORD
    xor eax,eax
//......//
    ret
MyProc1 endp
    end

有我的heade文件:

#pragma once

#include <Windows.h>

#ifdef LAB1DLL_EXPORTS
#define LAB1DLL_API __declspec(dllexport)
#else
#define LAB1DLL_API __declspec(dllimport)
#endif

extern "C"
{
    LAB1DLL_API int _stdcall MyProc1(DWORD x, DWORD y);
}

和dllMain(它的结合)“

#define LAB1DLL_EXPORTS 1
#include "Lab1Dll.h"

我是我的测试应用程序,我想使用该DLL和它的导出函数我有:

#include "Lab1Dll.h"

但是我的dll没有导出我的MyProc1功能 . 如果我将“普通”函数添加到该DLL并对其进行exprot,它在我的Test应用程序中可用,并且DLL编译过程会生成lib文件 .

没有“正常”函数我不会得到.lib文件 . 我无法链接到该库 .

如何使导出的功能工作?或者如何让它首先出口?

更新:我看到添加.def文件与下面的竞争工作完美 . 但是之后 . 我不应该这样做 . __declspec(dllexport)应该为我做什么?

LIBRARY

EXPORTS

MyProc1

1 回答

  • 2

    尝试从另一个模块(DLL / EXE)使用从DLL导出的汇编函数时,我遇到了类似的问题 . 从链接器错误我发现导入模块试图访问例如 __impl_SRFlushCache 函数而不是 SRFlushCache 函数,因为它在导出模块的头文件中声明并在汇编文件中定义 . 所以有些东西正在添加 __impl_ 前缀,但我将该函数声明为 extern "C" 以避免任何重整 .

    我通过向导出模块添加模块定义(.def)文件并在下面列出我的汇编函数来解决了这个问题:

    LIBRARY SRPlatform
    EXPORTS
      SRFlushCache
    

    以供参考:

    头文件中的函数声明:

    #ifdef SRPLATFORM_EXPORTS
    #define SRPLATFORM_API __declspec(dllexport)
    #else
    #define SRPLATFORM_API __declspec(dllimport)
    #endif // SRPLATFORM_EXPORTS
    
    SRPLATFORM_API void __fastcall SRFlushCache(const void *pFirstCl, const void *pLimCl, const size_t clSize);
    

    .asm文件中的函数定义:

    _DATA SEGMENT
    
    _DATA ENDS
    
    _TEXT SEGMENT
    
    PUBLIC SRFlushCache
    
    ; RCX=pFirstCl
    ; RDX=pLimCl
    ; R8=clSize
    SRFlushCache PROC
    
    SRFlushCache_Loop:
      clflushopt byte ptr [RCX]
      add RCX, R8
      cmp RCX, RDX ; RCX-RDX
      jl SRFlushCache_Loop
      ret
    
    SRFlushCache ENDP
    
    _TEXT ENDS
    
    END
    

相关问题