Win7 VS2015 x64汇编语言编写DLL文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Win7 VS2015 x64汇编语言编写DLL文件相关的知识,希望对你有一定的参考价值。

有点坑记录一下。

首先创建工程时选控制台类型工程,Win32估计就应该选Win32的,反正我测试用的控制台。

然后选DLL类型,除了Empty其他全都去掉。

技术分享

工程属性,masm勾上。

技术分享

 

技术分享

Linker >> Advanced里

Entry Point写上默认的入口函数

DllEntryPoint

技术分享

Linker >> Input里

Module Definition File写上你所用的def文件名

技术分享

建立asm和def文件,如下

 

ASM

 

.code

DllEntryPoint proc
	mov rax, 1
	ret
DllEntryPoint endp

AddFun proc
	mov eax, ecx
	add eax, edx
	ret
AddFun endp
end

 

DEF

 

LIBRARY "ASM64DLLTest"  
EXPORTS  
AddFun

 

技术分享

 

然后就可以了,只是一个简单的加法函数,对应C++版本为

__declspec(dllexport) int Add(int a, int b)
{
	return (a + b);
}

 

然后写个x64控制台程序测试一下。

 

#include <iostream>

#include <windows.h> 

using namespace std;

typedef int(*MYPROC)(int, int);

int main()
{
	HINSTANCE hinstLib;
	MYPROC ProcAdd;
	BOOL fFreeResult = FALSE;

	// Get a handle to the DLL module.
	hinstLib = LoadLibrary(TEXT("ASM64DLLTest.dll"));

	// If the handle is valid, try to get the function address.
	if (hinstLib != NULL)
	{
		ProcAdd = (MYPROC)GetProcAddress(hinstLib, "AddFun");

		// If the function address is valid, call the function.
		if (NULL != ProcAdd)
		{
			cout << (ProcAdd)(1, 2) << endl;

			cout << "LoadLibrary Success and Function Run" << endl;
		}
		else
		{
			cout << "LoadLibrary Success and GetProcAddress Fail" << endl;
		}

		// Free the DLL module.
		fFreeResult = FreeLibrary(hinstLib);

		if (fFreeResult == 1)
		{
			cout << "FreeLibrary Success" << endl;
		}
		else
		{
			cout << "FreeLibrary Fail" << endl;
		}
		
	}
	else
	{
		cout << "LoadLibrary Fail" << endl;
	}

	return 0;
}

  

结果

 

技术分享

 

以上是关于Win7 VS2015 x64汇编语言编写DLL文件的主要内容,如果未能解决你的问题,请参考以下文章

VS2015生成64位dll文件

VS 2015 C++ Redistributable 不在单个 DLL 中?

MFC120u.dll“丢失”

VS2013 + Win7 中缺少 MSVCP140.dll

VS2015编辑C语言时出现这个,KernelBase.dll,已经设置了工具的选项,启用了服务器支持和符号服务器

修复win7 pro X64的mfc100u.dll问题