请教 c++builder xe2 动态调用dll方法

ynquan 2012-08-01 03:29:46
dll文件名是clntTransfer.dll
#include <vcl.h>
#include <windows.h>
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <IdAntiFreezeBase.hpp>
#include <IdBaseComponent.hpp>
#include <IdComponent.hpp>
#include <IdConnectThroughHttpProxy.hpp>
#include <IdCustomTransparentProxy.hpp>
#include <IdIOHandler.hpp>
#include <IdIOHandlerSocket.hpp>
#include <IdIOHandlerStack.hpp>
#include <IdSocks.hpp>
#include <IdTCPClient.hpp>
#include <IdTCPConnection.hpp>
#include <Vcl.ComCtrls.hpp>
#include <Vcl.IdAntiFreeze.hpp>
#include <Vcl.ExtCtrls.hpp>

#pragma hdrstop

extern "C" __declspec(dllexport) __stdcall int MyTest(int,int);

#pragma argsused

TIdTCPClient *UploadClient;
TIdIOHandlerStack *IdIOHandlerStack1;
TIdAntiFreeze *IdAntiFreeze1;
TIdConnectThroughHttpProxy *IdConnectThroughHttpProxy1;
TIdSocksInfo *IdSocksInfo1;
UnicodeString srvPort,srvIP;
TProgressBar *ProgressBar1;

//-----------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
__declspec(dllexport) __stdcall int MyTest(int n1,int n2)
{
int t;
t= n1*n2;
return t;
}
//==========================================================
dll调用;
int __stdcall (*MyTest)(int,int);
void __fastcall TfrClient::Button2Click(TObject *Sender)
{
HINSTANCE hdll;
AnsiString proname;
FARPROC pr;
UnicodeString dllflName=ExtractFilePath(Application->ExeName)+"clntTransfer.dll";
try {
if (hdll==NULL) {
hdll=LoadLibrary(L"clntTransfer.dll");
}
if (hdll!=NULL) {
proname="MyTest";
pr=GetProcAddress(hdll,"MyTest");
if (pr!=NULL) {
MyTest=(int __stdcall (__cdecl *)(int,int))pr;
ShowMessage(MyTest(10,20));

} else {
ShowMessage("打开函数错误。");
}

}else {
ShowMessage("打开动态链接库错误。");
}
} __finally {
FreeLibrary(hdll);
}
}

我在c++builder xe2 上做的。
在动态导入dll时候是成功的但是取函数地址时取不到出现“打开函数错误。”信息。
我在网上找了很多都是这种方法,难道xe2 例外吗?
请高手帮忙看看。
...全文
268 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ynquan 2012-08-02
  • 打赏
  • 举报
回复
我在创建另一个工程测试中妖哥的代码可以使用但是只能使用一次再一次点击时候
还是出来“LoadLibrary 错误”信息。
应该是dll文件导入错误。应该是dll释放问题。
::FreeLibrary(hDll);这样释放难道不行?
再次请教怎样点击多次?
ynquan 2012-08-02
  • 打赏
  • 举报
回复
测试上面的代码在HINSTANCE hDll = ::LoadLibraryW(dllflName.c_str());
返回的是false,出现"LoadLibrary 错误"信息。
我是dll文件放在exe文件(Client\Win32\Debug)下面应该没有问题。
请帮忙看看这是怎样解决呢?

[Quote=引用 4 楼 的回复:]

DLL中:
函数声明:
C/C++ code
extern "C" __declspec(dllexport) int __stdcall MyTest(int, int);

函数定义:
C/C++ code
int __stdcall MyTest(int n1, int n2)
{
int t;
t= n1*n2;
return t;
}

调用:
C/C++ code
……
[/Quote]
ynquan 2012-08-01
  • 打赏
  • 举报
回复
我先谢谢妖哥。
我试一试。
ccrun.com 2012-08-01
  • 打赏
  • 举报
回复
DLL中:
函数声明:
extern "C" __declspec(dllexport) int __stdcall MyTest(int, int);

函数定义:
int __stdcall MyTest(int n1, int n2)
{
int t;
t= n1*n2;
return t;
}

调用:
typedef int (__stdcall *MYTEST)(int, int);

void __fastcall TfrClient::Button2Click(TObject *Sender)
{
UnicodeString dllflName = ExtractFilePath(Application->ExeName) + "clntTransfer.dll";
HINSTANCE hDll = ::LoadLibraryW(dllflName.c_str());
if (hDll)
{
MYTEST MyTest = (MYTEST)::GetProcAddress(hDll, "MyTest");
if (MyTest)
{
ShowMessage(MyTest(10, 20));
}
else
{
ShowMessage("GetProcAddress 错误");
}

::FreeLibrary(hDll);
}
else
{
ShowMessage("LoadLibrary 错误");
}
ynquan 2012-08-01
  • 打赏
  • 举报
回复
extern "C" int __stdcall (*MyTest)(int,int);
这样写编译通不过。
妖哥能不能多写几行呢?
ynquan 2012-08-01
  • 打赏
  • 举报
回复
在那里写?
extern "C" int __stdcall (*MyTest)(int,int);
是这样吗?
ccrun.com 2012-08-01
  • 打赏
  • 举报
回复
extern "C"

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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