- UID
- 418
- 精华
- 积分
- 3994
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
本帖最后由 cyycoish 于 2015-1-9 15:18 编辑
dll的优点想必大家你知我知,不用我废话了吧,接下来老C将网上和自己总结的一些开发dll的心得在此帖与大家分享。
那么,开始。老C用的环境是win8.1+vc2013,使用纯C来开发我们的动态链接库。
1.新建一个win32工程
2.按图进行设置,注意这里要选dll
3.给工程添加一个C源文件
好了,这里贴上dll的源码:
- #include <windows.h> //包含windows.h头文件
- #define DLLEXPORT _declspec(dllexport) //定义导出宏
- DLLEXPORT int Add(int a, int b) //导出的函数
- {
- return a + b;
- }
- BOOL APIENTRY DllMain(HANDLE hModule, DWORD reason, LPVOID lpReserved) //dll入口函数
- {
- switch (reason)
- {
- case DLL_PROCESS_ATTACH:
- break;
- case DLL_PROCESS_DETACH:
- break;
- case DLL_THREAD_ATTACH:
- break;
- case DLL_THREAD_DETACH:
- break;
- }
- return TRUE;
- }
复制代码
ok,咱们先来vc调用dll的例子:
首先建立一个console app,将以下代码粘贴至C源文件中:
- #include <stdio.h>
- extern _declspec(dllexport) int Add(int a, int b); //刚才写的dll中的导出函数,如果导出函数较多,可以写在头文件中并包含
- #pragma comment(lib,"dlltest.lib") //把dlltest.dll和dlltest.lib复制到当前目录
- int main()
- {
- int a;
- a = Add(10, 5);
- printf("%d \n", a);
- return 0;
- }
复制代码
再来vb6调用的例子:
- Option Explicit
- Private Declare Function Add Lib "dlltest.dll" (ByVal a As Integer, ByVal b As Integer) As Integer
- Private Sub Command1_Click()
- MsgBox Add(10, 5)
- End Sub
复制代码
接着是delphi7调用的例子:
- unit Unit1;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls;
- type
- TForm1 = class(TForm)
- Button1: TButton;
- procedure Button1Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- Form1: TForm1;
- implementation
- function Add(a:Integer; b:Integer):Integer; stdcall; external 'dlltest.dll';
- {$R *.dfm}
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- ShowMessage(IntToStr(Add(2,3)));
- end;
- end.
复制代码
这里需要注意的是:
dll文件必须要放在程序当前目录下或者windows目录下,以供程序寻找dll入口
还有,以vc2013默认状态开发出来的dll是不可以在xp系统上使用的
老C再将一些从vc dll中导出字符串供vb6调用的办法告诉大家
这个功能的具体作用呢,就是将多种语言字符串封装在dll中,程序调用后,即可切换显示语言
先以上面的模板改造dll:
- #include <windows.h> //包含windows.h头文件
- #define DLLEXPORT _declspec(dllexport) //定义导出宏
- DLLEXPORT int Add(int a, int b)
- {
- return a + b;
- }
- DLLEXPORT BOOL GetString(LPSTR str, int iWhichLanguage) //导出的函数
- {
- if (iWhichLanguage == 0)
- strcpy(str, "Hello!");
- else
- strcpy(str, "你好!");
- return TRUE;
- }
- BOOL APIENTRY DllMain(HANDLE hModule, DWORD reason, LPVOID lpReserved) //dll入口函数
- {
- switch (reason)
- {
- case DLL_PROCESS_ATTACH:
- break;
- case DLL_PROCESS_DETACH:
- break;
- case DLL_THREAD_ATTACH:
- break;
- case DLL_THREAD_DETACH:
- break;
- }
- return TRUE;
- }
复制代码
然后呢,在vb6中这样调用:
- Option Explicit
- Private Declare Function GetString Lib "dlltest.dll" (ByVal str As String, ByVal iWhichLanguage As Integer) As Boolean
- Private Sub Option1_Click(Index As Integer)
- Dim str As String * 256 '注意这里一定要申请一个定长字符串然后将函数中的字符串传进这个定长字符串,否则会导致程序崩溃
- Call GetString(str, Index)
- Label1 = str
- End Sub
复制代码
结果如下:
最后:
这些方法是老C试验了n次得出的结论,每段代码都有测试,确保可以使用。 |
|