关于VC++6.0的动态链接库的一系列相关问题如何处理?

两水先木示 2017-10-10 07:25:52
我建立了一个空的DLL项目,手动创建了头文件和cpp文件以及一个def文件,编译连接成功,在项目文件的Debug文件中生成了.dll和.lib文件,这样一个动态链接库就算完成了吧?然后我再创建一个MFC基本对话框的MFC项目,想在这个MFC项目中使用隐式方法调用动态链接库,要在该项目目录中添加一个动态链接库的头文件和.lib文件,并且在项目工程中添加头文件进去,在调用到动态链接库的函数的cpp顶部加入 #include "xxx.h" 动态链接库头文件和#pragma commer(lib,"xxx.lib")加载动态链接库函数,还有一种加载库方法是在菜单栏-工程-设置-连接-对象/库模块中添加这个库,还有一些就是设置头文件绝对路径和lib绝对路径的,不过我已经直接把lib,.h都包含进去了,所以这一步不用做也可以吧,然后我编译+连接,通过了,运行出现这个错误!!!def文件中的有一个语句是LIBRARY MX81A,这个错误是截图不了手打错误:Ex8_2.exe-系统错误(对话框标题) 内容:无法启动此程序,因为计算机中丢失MX81A.dll。尝试重新安装该程序以解决此问题。这个MX81A.dll 文件 是def文件里那个LIBRARY语句通知链接程序创建的DLL文件,LIBRARY指定了DLL文件名,但是我搞不懂这个dll和我实际生成在debug里面的dll文件有什么区别,有点乱,动态链接库我用了extern "C"编译链接方式,就4个函数加,减,传送数据,得到数据,还设置了一个内存段存的是一个4字节整数int。
...全文
664 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我能想到的也是dll,放到工程的运行目录里面,运行目录看工程设置。
赵4老师 2017-10-11
  • 打赏
  • 举报
回复
The directory from which the application loaded. The current directory. Windows 95 and Windows 98: The Windows system directory. Use theGetSystemDirectory function to get the path of this directory. Windows NT: The 32-bit Windows system directory. Use the GetSystemDirectory function to get the path of this directory. The name of this directory is SYSTEM32. Windows NT: The 16-bit Windows system directory. There is no function that obtains the path of this directory, but it is searched. The name of this directory is SYSTEM. The Windows directory. Use theGetWindowsDirectory function to get the path of this directory. The directories that are listed in the PATH environment variable.
schlafenhamster 2017-10-11
  • 打赏
  • 举报
回复
找不到 你的 MX81A.dll 可以 放 system 下
zgl7903 2017-10-11
  • 打赏
  • 举报
回复
把生成的DLL拷贝到EXE能识别的目录下
两水先木示 2017-10-11
  • 打赏
  • 举报
回复
MX81A.dll我找遍动态链接库项目的所有文件都没发现有这个文件。可喜可贺问题解决了,就是缺了.dll,我换了一种引出方式,改用__declspec(dllexport)方式引出,而不用def文件,把.lib和头文件都包含进MFC项目目录中后,依旧弹出这个错误,不过名字是实际存在的.dll文件,而不是def文件中LIBRARY命名的DLL文件,然后我把这个.dll放入到项目的debug里面去,就运行成功了。。。这个def文件指定的DLL文件是存在的吗?存在何处?我要用隐式加载不能用def文件的意思?其实经过这么一想,觉得隐式加载真的没必要用def啊,因为根本就没用到GetProcAddress这个东西。
两水先木示 2017-10-10
  • 打赏
  • 举报
回复
动态链接库DLL的项目文件内容:.cpp文件内容:

#include <windows.h>
#pragma data_seg("Shared")//声明内存段,名称为Shared
int dwID=6;//定义一个整数初始化
#pragma data_seg()//使整数放入内存段(定义内存段并初始化内存段内容)
//至此说明了一个内存段,该内存段包含了一个int的整数,内存段名称为Shared,整数名称为dwID,该整数必须初始化才能够使得编译器给它分配4字节空间.
#pragma comment(linker,"/SECTION:Shared,RWS")//要求编译器设置一个名为Shared的内存段,属性为任何进程可读可写(RWS)

		//DLL模块入口地址	调用DLL模块原因            释放
BOOL WINAPI DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
	return TRUE;
}
//extern "C"表示编译链接符合C语言命名规范 __stdcall调用函数规范:决定参数压栈方式、退栈方式、释放堆栈空间方式.
extern "C" int __stdcall Add(int a,int b){
	return a+b;
}
extern "C" int __stdcall Substruct(int a,int b){
	return a-b;
}
extern "C" void __stdcall setData(int data){
	dwID=data;
}
extern "C" int __stdcall getData()
{
	return dwID;
}
头文件内容:
#ifndef MX81A_H
#define MX81A_H
extern "C"{
	int __stdcall Add(int a,int b);
	int __stdcall Substruct(int a,int b);
	void __stdcall setData(int data);
	int __stdcall getData();
};
#endif
def文件内容:
LIBRARY MX81A
EXPORTS
Add @ 1
Substruct @ 2
setData @ 3
getData @ 4

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧