用LoadLibrary和GetProcAddress函数调用dll的代码有问题,希望高手指点(谢谢)!

wangzi163 2005-04-02 02:12:01
请高手指点程序有何问题,我做了一个dll文件想用显示的方式调用,就是用LoadLibrary和GetProcAddress函数实现,可是运行总是出错。
程序代码如下:
//Dll_Test.cpp 生成Dll_Test.dll
#include "stdafx.h"
#include "Dll_Test.h"
int Max(int a, int b)
{
if(a>b)
return a;
else
return b;
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

//Test_GetMax.cpp
#include "stdafx.h"
#include <stdio.h>
#include <afxwin.h>
#include <afxext.h>
#include <afxdisp.h>
#include <afxdtctl.h>
int main(int argc, char* argv[])
{
typedef int (CALLBACK* LPFNDLLFUNC)(int ,int);
HINSTANCE hDLL;
LPFNDLLFUNC lpfnDllFunc;

hDLL = LoadLibrary("Dll_Test.dll");
if (hDLL != NULL)
{
lpfnDllFunc = (LPFNDLLFUNC)GetProcAddress(hDLL, "Max");
if (!lpfnDllFunc)
{
FreeLibrary(hDLL);
}
else
{
printf("已经找到函数");
int a;
a = lpfnDllFunc(1,2);
printf("返回直:%d",a);
}
}
return 0;
}
...全文
3129 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
robot1980 2005-06-06
  • 打赏
  • 举报
回复
Ok
redkit 2005-04-03
  • 打赏
  • 举报
回复
hDLL = LoadLibrary("Dll_Test.dll");
这句话你还是使用绝对路径吧!

tankbattle 2005-04-03
  • 打赏
  • 举报
回复
用dumpbin.exe(vc里有)看看动态库导出的函数名被改成了什么。
wangzi163 2005-04-03
  • 打赏
  • 举报
回复
其实我已经声明了,可是忘了写了,如下:
extern "C"_declspec(dllimport) int Max(int a,int b);
最后原因把callback去掉就好使了,谢谢各位!
sambios 2005-04-03
  • 打赏
  • 举报
回复
你以上的代码有以下几个不妥的地方:
1)没有说明要导出什么函数。
2)缺少.def文件。
以下是更正的文件内容:
dll中的函数改为以下代码:
extern "C" __declspec(dllexport) int __stdcall Max(int a, int b)
{
if(a>b)
return a;
else
return b;
}
//以下是test.def文件内容:
EXPORTS
Max
//:~
主函数不用修改。这样就没有问题了。
wellin 2005-04-02
  • 打赏
  • 举报
回复
typedef int(*AAA)(int ,int);
AAA lpfnDllFunc;
HINSTANCE hInst;
hInst = LoadLibrary("DemoDll.dll");
lpfnDllFunc = (AAA)GetProcAddress(hInst, 函数名);
lpfnDllFunc(a,b);
kugou123 2005-04-02
  • 打赏
  • 举报
回复
楼主最好用.def文件导出
避免编译器更改你的导出函数的名字。
另外,如果你的函数本身没有加调用约定,那么你用typedef定义函数指针的时候,也不要加。
Kudeet 2005-04-02
  • 打赏
  • 举报
回复
不要callback试试
typedef int(SQRTPROC)(int ,int);
SQRTPROC* lpfnDllFunc;
lpfnDllFunc = (SQRTPROC* )GetProcAddress(hDLL, "Max");
wenxinfly 2005-04-02
  • 打赏
  • 举报
回复
上面说得有道理
不过还有你的int Max()函数是不是加上标识为导出函数的标识
legendhui 2005-04-02
  • 打赏
  • 举报
回复
看看你的dll路径是否正确
oyljerry 2005-04-02
  • 打赏
  • 举报
回复
保证dll在工程目录下
出错指什么错误?
louifox 2005-04-02
  • 打赏
  • 举报
回复
注意Dll_Test.dll在哪个文件夹下。
内容概要:本文档围绕“光伏并网逆变器序阻抗建模、扫频辨识与弱电网交互稳定性分析”展开,提供基于Matlab和Simulink的完整代码与仿真模型,复现了相关博士论文的核心研究成果。内容聚焦于新能源发电系统接入弱电网时的稳定性问题,系统阐述了光伏逆变器的正负序阻抗建模方法、小信号扫频辨识技术、锁相环与电流环的动态耦合效应、LCL滤波器的作用机制以及系统宽频带振荡的失稳机理。通过构建精确的序阻抗模型并结合扫频法进行稳定性判据分析,深入揭示并网逆变器与弱电网间的交互特性,为实际工程中振荡问题的预测、诊断与抑制提供坚实的理论支撑与有效的技术路径。; 适合人群:具备电力电子、自动控制理论及新能源发电系统基础知识,正在从事相关领域研究的硕士/博士研究生、高校科研人员以及电力系统行业的工程师。; 使用场景及目标:①复现并验证博士论文中关于光伏逆变器序阻抗建模与弱电网交互稳定性的关键结论;②作为科研项目或学位论文的技术蓝本,开展弱电网环境下并网系统稳定性仿真与机理研究;③深入掌握Matlab/Simulink在电力系统小信号稳定性分析、特别是阻抗建模与扫频法应用方面的高级仿真技能。; 阅读建议:学习者应结合所提供的Matlab代码与Simulink仿真模型,亲手运行并调试扫频辨识程序,细致分析序阻抗建模的每一步推导与实现过程,重点关注锁相环动态特性对系统稳定裕度的影响,通过调整控制器参数与电网强度观察系统响应变化,从而深刻理解交互失稳的内在机理,实现从理论到实践的融会贯通。

15,465

社区成员

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

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