关于C++加载DLL文件 用的LoadLibrary方法的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于C++加载DLL文件 用的LoadLibrary方法的问题相关的知识,希望对你有一定的参考价值。

能不能给我一个实例。我现在DLL已经生成好了名字是TestDLL.dll
_declspec(dllexport) int clFun(int a, int b)

int mynum = a+b;
return mynum;

是一个加法。。请问我怎么在我的Main函数里调用这个TestDLL.dll里的clFun函数??

现在的问题是。。他输出显示 "加载DLL失败,程序退出"
没有调用。。如果实际调用到他的这个函数的话。 在哪里调?比如我要调用
clFun(1,2)返回的应该是3。请问怎么调!万分感谢

LoadLibrary不是加载DLL文件,LoadLibrary出现是系统设置错误导致。

如下参考:

1.按下Win+R组合键,输入控件,点击“确定”按钮,打开控制面板,如下图所示。

2.在控制面板界面,点击“硬件和声音”按钮,如下图所示。

3.再次点击“电源选项”按钮。

4.根据需要修改“balance”、“highperformance”等计划属性,分别点击“changeplanSettings”按钮。

5.再次点击“更改高级电源设置”按钮。

6.在电源选项窗口中,找到“可切换动态显卡-全局设置-性能最大化”选项,将相应的“用电量”和“开机电量”修改为“性能最大化”。此时,设置了power属性。

参考技术A /*
【1】静态调用
把TestDLL.lib和TestDLL.dll拷贝到你的测试工程下
你的dll声明方法_declspec(dllexport)是想要静态调用dll,所以需要添加如下代码:
//*/

#pragma comment(lib,"TestDLL.lib") /*(1)包含库文件,不写这句话,就需要通过程序配置包含这个库*/
_declspec(dllimport) int clFun(int a, int b);/*(2)声明函数是从dll中调用的,不写这句话,就需要包含头文件*/

void main()

int a = 1,b = 2,c =0;
c = clFun(a,b);


/*
【2】动态调用

你想用LoadLibrary方法,就属于动态调用,这时可以不加你的声明_declspec(dllexport),只需要在TestDLL工程目录下的.def文件中把你要调用的函数名加进去

; TestDLL.def : 声明 DLL 的模块参数。
LIBRARY "TestDLL"
EXPORTS
; 此处可以是显式导出
clFun

接下来TestDLL.dll拷贝到你的测试工程下,添加如下代码:
//*/

void main()

int a = 1,b = 2,c =0;

//定义一个函数指针
typedef int (* Any_name)(int param1, int param2);

//定义一个函数指针变量
Any_name pfFuncInDll = NULL;

//加载dll
HINSTANCE hinst=LoadLibrary(L"TestDLL.dll");

if ( hinst != NULL )

//找到dll的clFun函数
pfFuncInDll = (Any_name)GetProcAddress(hinst, "clFun");

//调用dll里的函数
if (pfFuncInDll != NULL )

c = pfFuncInDll(a,b);

FreeLibrary(hinst);

参考技术B 可以参考如下语法:

HINSTANCE hDLL; // DLL句柄
typedef int __stdcall (*DLLFUN)(int a, int b);

DLLFUN Dll_clFun;

//读取:
if(hDLL == NULL)
hDLL=LoadLibrary((LPCTSTR)"TestDLL.dll");
if(hDLL)

Dll_clFun =(DLLFUN)GetProcAddress(hDLL,"clFun");

else

ShowMessage("加载DLL失败,程序退出");


//释放:
if(hDLL)

FreeLibrary(hDLL); // 卸下DLL 
hDLL = NULL;
追问

DLLFUN Dll_clFun;报错。。DLLFUN未声明的 这是什么?
typedef int __stdcall (*DLLFUN)(int a, int b); 报错。。语法错误:“(”

追答

详细错误是在第几行呢?

试试把:
HINSTANCE hDLL; // DLL句柄
改成
HINSTANCE hDLL=NULL ; // DLL句柄

参考技术C #pragma comment(lib, "TestDLL.lib")
include 头文件
然后你懂的

关于delphi调用C++的DLL中char*参数的问题

我现在在用delphi做一个接口,接口DLL是使用C++开发的,接口规范如下:
dll动态链接库文件名为:networkBillPrn.dll,无须注册,将dll文件放在系统文件目录或HIS系统的同一文件目录。方法: int CallBillService(char * inParams, char * outParams)传入参数inParams是json数据格式,传入参数outParams是以实参方式传入的,它的值是His系统调用票据系统的接口的返回结果,也是json数据格式,返回值是表示outParams的字符串长度。
我是这样实现的:
var
billTest: TbillTest;
//调用方法CallBillService
function CallBillService(inParams:PChar; outParams:PChar): Integer; stdcall; external 'NetworkBillPrnDll.dll';
implementation

$R *.dfm

procedure TbillTest.btn1Click(Sender: TObject);
var
jo,jt:ISuperObject;
billAddr,inParam:String;
returnNum:Integer;
outParam:PChar;
begin
billAddr:=UpperCase(Trim(Edit_Addr.Text));
jo:=SO('"billAddr":"http://202.99.207.176:7001/BILL/BsExecute","appVersion":"1.0.0.1","deptNode":"16100101","secretKey":"A990AA3E8D9FDE5D04EA0BAE88450A0B0D4BA8931778CDCA17","methodName":"getValidBillNo","busName":"hisMz","billReg":"测试"');
inParam:=jo.AsString;
//将json内容写入日志文件
writeTxt(PChar(inParam),'测试服务器端-输入');
outParam:='';
//执行到下面这条语句报错
returnNum:= CallBillService(PChar(inParam),outParam);
writeTxt(outParam,'测试服务器端-输出');
ShowMessage(IntToStr(returnNum));
end;

procedure TbillTest.writeTxt(tmpString:string;operaName:string);
var
wText: TextFile;
shijian:string;
begin
shijian:=DateTimeToStr(Now());
AssignFile(wText, 'logo.txt');
Append(wText);
Writeln(wText,'-----时间:' + shijian + '--操作:' + operaName + '-----');
Writeln(wText, tmpString);
CloseFile(wText);
end;

end.
请高手给予解答,谢谢。

&符号在c++中是表示引用类型,在c#中类似ref,在dellphi作为参数有var关键字来表示:BOOLNVS_Login(ULONG&lLoginID,constchar*szNvsIP,intnNvsPort,constchar*szUser,constchar*szPwd)转为delphi:functionNVS_Login(varlLoginID:DWORD;constszNvsIP:PChar;constszUser:PChar;constszPwd:PChar):boolean; 参考技术A 调用前,参数变量,初始化一下

~
~
~追问

怎么初始化,能给举一个例子吗?

以上是关于关于C++加载DLL文件 用的LoadLibrary方法的问题的主要内容,如果未能解决你的问题,请参考以下文章

java加载dll文件

在 asp.net 中使用 c++ dll - 异常:无法加载文件或程序集

Visual Studio 2015:C++ 代码分析错误 C1253,无法加载模型文件“res://mspft140.dll/300”

dll文件如何反汇编成源码,C++语言编写

使用 C++ 应用程序加载 dll

导出 DLL C++ 类,关于 .def 文件的问题