关于EXE中导出函数接口问题

前言

exe中导出函数接口原本我是不知道的,但是实际开发过程中需要使用到接口,这时一个老员工就跟我们讲可以在exe中导出函数接口,因为exe跟dll都是pe文件,于是我进行了尝试,但是也发现问题

实现

在头文件中申明要导出的函数接口

extern "C" int __declspec(dllexport) _cdecl Exporter(char * cInput,char *cOutput);

 在cpp文件中实现该接口,这里我的接口仅仅返回了1+1

int Exporter(char * cInput,char *cOutput)
{

	//char Input[MAX_PATH] = {0};
	//sprintf(Input,"%s_OK",cInput);

	//strcpy(cOutput,Input);

	return 1+1;

}

下面编译下,生成如下文件

下面使用工具看下到底有没有导出函数接口

可以看到确实导出了接口

下面试一下能不能使用该接口(跟dll的调用方式一致)

HMODULE h = LoadLibrary(_T("initiator.exe"));

	typedef int ( _cdecl *Exporter1)(char * cInput,char *cOutput);

	if (h != NULL)
	{
		Exporter1 Ex = (Exporter1)GetProcAddress(h,"Exporter");
		char cOutput[MAX_PATH] = {0};
		int i = Ex("Hello world",cOutput);

		OutputDebugStringA("");

	}

编译后调试程序

可以看到这时候i = 2,说明函数确实是导出了

但是我们要导出函数不可能只实现这种弱智功能,下面我演示下导出一个复杂点的函数

把上面的导出函数实现修改下

int Exporter(char * cInput,char *cOutput)
{

	char Input[MAX_PATH] = {0};
	sprintf(Input,"%s_OK",cInput);

	strcpy(cOutput,Input);	

	return 0;

}

其他步骤跟上面一样

下面调试下

直接奔溃

我找了网上的资源讲解,意思是exe导出的接口应该面向资源,比如一个数据什么的而不应该面向代码流程

具体怎么解决该问题目前我还没有发现,但是提供一个解决方案:使用dll导出函数

给一个链接,里面有一些问题汇总

https://www.cnblogs.com/thinkinlove/archive/2008/11/12/1320797.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将 C 语言编写的 DLL 文件打包进 EXE 文件,可以通过以下步骤实现: 1. 首先,需要创建一个用于打包 DLL 的 C 语言项目。在 Visual Studio 选择新建项目,选择 C 语言项目模板,并添加你的功能代码。 2. 在项目将功能代码封装为一个 DLL,可以使用动态链接库生成器来创建 DLL 文件。在 Visual Studio 创建项目后,选择“文件”->“新建”->“项目”->“Visual C++”->“动态链接库 (.dll)”,然后按照向导的步骤进行设置。 3. 在 DLL 项目,将所有的功能代码写在 DLL 动态链接库的导出函数,并且需要将这些函数在 .def 文件进行导出声明。在导出函数,可以通过动态链接库提供的接口来获取和使用 DLL 提供的功能。 4. 在主 EXE 项目,添加对 DLL 的引用。在 Visual Studio 选择主 EXE 项目,右键点击“引用”,选择“添加引用”,然后浏览到 DLL 项目的输出目录,选择 DLL 文件添加到引用。这样主 EXE 项目就可以使用 DLL 提供的功能了。 5. 当主 EXE 项目构建并运行时,系统会自动加载和链接 DLL 文件,以便在主程序使用 DLL 提供的功能。 通过上述步骤,我们可以将 C 语言编写的 DLL 文件打包进 EXE 文件,并且在主程序使用 DLL 的功能。这样做的好处是可以将代码和资源集在一个 EXE 文件,方便分发和部署。另外,也可以通过将 DLL 文件打包进 EXE,提高一些信息的隐藏性和保密性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值