社区
C++ Builder
帖子详情
[非常急]刚才的dll中带参数函数问题,开新贴问
wingfootedtiger
2005-09-28 02:50:57
这次简单点,头晕了,朋友给我一个test.dll文件,里面有2个函数如下
BOOL aaa(LPCTSTR name, LPCTSTR id);
void bbb();
我想在button点击的时候调用这2个函数,请给我一个能通过的正确代码,谢谢
...全文
105
5
打赏
收藏
[非常急]刚才的dll中带参数函数问题,开新贴问
这次简单点,头晕了,朋友给我一个test.dll文件,里面有2个函数如下 BOOL aaa(LPCTSTR name, LPCTSTR id); void bbb(); 我想在button点击的时候调用这2个函数,请给我一个能通过的正确代码,谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
XBox360
2005-09-28
打赏
举报
回复
3楼都说完了,没得说了!
constantine
2005-09-28
打赏
举报
回复
注意dll里面输出函数的写法
constantine
2005-09-28
打赏
举报
回复
BCB 编写 DLL 终极手册
由于现在比较多的网友老是在 CSDN 上询问关于 BCB 编写 DLL 的问题,我编写了这篇文章抛砖引玉
一. 编写 DLL
File/New/Dll 生成 Dll 的向导,然后可以添加导出函数和导出类
导出函数:extern "C" __declspec(dllexport) ExportType FunctionName(Parameter)
导出类:class __declspec(dllexport) ExportType ClassName{...}
例子:(说明:只是生成了一个 DLL.dll )
#include "DllForm.h" // TDllFrm 定义
USERES("Dll.res");
USEFORM("DllForm.cpp", DllFrm);
class __declspec(dllexport) __stdcall MyDllClass { //导出类
public:
MyDllClass();
void CreateAForm();
TDllFrm* DllMyForm;
};
TDllFrm* DllMyForm2;
extern "C" __declspec(dllexport) __stdcall void CreateFromFunct();//导出函数
//---------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
return 1;
}
//---------------------------------------------------------------------------
MyDllClass::MyDllClass()
{
}
void MyDllClass::CreateAForm()
{
DllMyForm = new TDllFrm(Application);
DllMyForm->Show();
}
//---------------------------------------------------------------------------
void __stdcall CreateFromFunct()
{
DllMyForm2 = new TDllFrm(Application);
DllMyForm2->Show();
}
二. 静态调用 DLL
使用 $BCB path\Bin\implib.exe 生成 Lib 文件,加入到工程文件中
将该文件拷贝到当前目录,使用 implib MyDll.lib MyDll.dll 生成
// Unit1.h // TForm1 定义
#include "DllForm.h" // TDllFrm 定义
//---------------------------------------------------------------------------
__declspec(dllimport) class __stdcall MyDllClass {
public:
MyDllClass();
void CreateAForm();
TDllFrm* DllMyForm;
};
extern "C" __declspec(dllimport) __stdcall void CreateFromFunct();
class TForm1 : public TForm{...}
// Unit1.cpp // TForm1 实现
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // 导出类实现,导出类只能使用静态方式调用
DllClass = new MyDllClass();
DllClass->CreateAForm();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{ // 导出函数实现
CreateFromFunct();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
delete DllClass;
}
三. 动态调用 DLL
// Unit1.h
class TForm1 : public TForm
{
...
private: // User declarations
void (__stdcall *CreateFromFunct)();
...
}
// Unit1.cpp // TForm1
HINSTANCE DLLInst = NULL;
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if( NULL == DLLInst ) DLLInst = LoadLibrary("DLL.dll"); //上面的 Dll
if (DLLInst) {
CreateFromFunct = (void (__stdcall*)()) GetProcAddress(DLLInst,
"CreateFromFunct");
if (CreateFromFunct) CreateFromFunct();
else ShowMessage("Could not obtain function pointer");
}
else ShowMessage("Could not load DLL.dll");
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if ( DLLInst ) FreeLibrary (DLLInst);
}
四. DLL 作为 MDIChild (子窗体) 【只编写动态调用的例子】
实际上,调用子窗体的 DLL 时,系统只是检查应用程序的 MainForm 是否为 fsMDIForm 的窗体,这样只
要把调用程序的 Application 的 Handle 传递给 DLL 的 Application 即可;同时退出 DLL 时也要恢复
Application
// MDIChildPro.cpp // Dll 实现 CPP
#include "unit1.h" // TForm1 定义
TApplication *SaveApp = NULL;
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
if ( (reason==DLL_PROCESS_DETACH) && SaveApp )
Application = SaveApp ; // 恢复 Application
return 1;
}
extern "C" __declspec(dllexport) __stdcall void TestMDIChild( //1024X768
TApplication* mainApp,
LPSTR lpCaption)
{
if ( NULL == SaveApp ) // 保存 Application,传递 Application
{
SaveApp = Application;
Application = mainApp;
}
// lpCaption 为子窗体的 Caption
TForm1 *Form1 = new TForm1 ( Application, lpCaption );
Form1->Show();
}
注:上面的程序使用 BCB 3.0 编译成功
rainfall19831109
2005-09-28
打赏
举报
回复
不好意思,发错了,应该为:
HWND hnd=LoadLibrary("test.dll");
if(hnd1=NULL)
{
BOOL (*func1)(LPCTSTR,LPCTSTR);
(FARPROC&)func1=GetProcAddress(hnd,"aaa");
func1("abc","xyz");
void (*func2)();
(FARPROC&)func2=GetProcAddress(hnd,"bbb");
func2();
}
rainfall19831109
2005-09-28
打赏
举报
回复
HWND hnd=LoadLibrary("test.dll");
if(hnd1=NULL)
{
BOOL (*func1)(LPCTSTR,LPCTSTR);
func=GetProcAddress(hnd,"aaa");
func1("abc","xyz");
void (*func2)();
func2=GetProcAddress(hnd,"bbb");
func2();
}
伪加壳器制作记录(增节区/修改导入表)
但受限于笔者目前的技术水平,还无法完全兼顾这些所有内容,仅记录一些比较关键的原理和操作(之后将另择时间完整地实现一遍壳,届时再考虑是否
开新贴
还是就此处补充吧) 前置知识: 至少要知道PE文件格式有哪些...
VB常见
问
题
总结
实在不会了,请在此贴中查找您的常见
问
题
,如果还没有,那请您发出新贴,向各位高手讨教:) 查找方法:按ctrl+f,输入要查找的
问
题
关键字即可 注明:本贴源于VB编程乐园网站,本人只是稍微编辑了一下...
求救:activeForm释放
问
题
?
求救:activeForm释放
问
题
? Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiNetwork/html/delphi_20061204173421201.html
问
题
:1.在win2000,IE6下,先打开一个IE,不做任何操作. 2.后再先...
vb4android 源码,VB精典实用源代码(详细))
若朋友您想要
问
如何才能学好vb,或者入门需要看什么教材一类的
问
题
,建议你抱着一颗刻苦钻研的心去面对这门学
问
,多动脑,少提
问
,遇到不知道的,多查资料,多看看帖子,或者用断点来亲自试验。实在不会了,请在此贴...
编写高性能 Web 应用程序的10个技巧
常见的 ASP.NET 性能神话 有用的 ASP.NET 性能技巧和诀窍 在 ASP.NET 中处理数据库的一些建议 缓冲以及用 ASP.NET 进行后台处理 本文使用下列技术:ASP.NET,.NET 框架,IIS 用 ASP.NET 编写 Web ...
C++ Builder
13,825
社区成员
102,679
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章