找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 5001|回复: 3

使用vc开发标准dll及其调用

[复制链接]

85

主题

175

回帖

3990

积分

用户组: 超级版主

No. 418

UID
418
精华
14
威望
53 点
宅币
1974 个
贡献
1582 次
宅之契约
0 份
在线时间
252 小时
注册时间
2014-8-9
发表于 2015-1-9 15:16:12 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本帖最后由 cyycoish 于 2015-1-9 15:18 编辑

dll的优点想必大家你知我知,不用我废话了吧,接下来老C将网上和自己总结的一些开发dll的心得在此帖与大家分享。
那么,开始。老C用的环境是win8.1+vc2013,使用纯C来开发我们的动态链接库。
1.新建一个win32工程
1.jpg
2.按图进行设置,注意这里要选dll
2.jpg
3.给工程添加一个C源文件
3.jpg
好了,这里贴上dll的源码:
  1. #include <windows.h> //包含windows.h头文件

  2. #define DLLEXPORT _declspec(dllexport) //定义导出宏

  3. DLLEXPORT int Add(int a, int b) //导出的函数
  4. {
  5.         return a + b;
  6. }

  7. BOOL APIENTRY DllMain(HANDLE hModule, DWORD  reason, LPVOID lpReserved) //dll入口函数
  8. {
  9.         switch (reason)
  10.         {
  11.         case DLL_PROCESS_ATTACH:
  12.                 break;
  13.         case DLL_PROCESS_DETACH:
  14.                 break;
  15.         case DLL_THREAD_ATTACH:
  16.                 break;
  17.         case DLL_THREAD_DETACH:
  18.                 break;
  19.         }
  20.         return TRUE;
  21. }
复制代码

x1.jpg
ok,咱们先来vc调用dll的例子:
首先建立一个console app,将以下代码粘贴至C源文件中:
  1. #include <stdio.h>

  2. extern _declspec(dllexport) int Add(int a, int b); //刚才写的dll中的导出函数,如果导出函数较多,可以写在头文件中并包含

  3. #pragma comment(lib,"dlltest.lib") //把dlltest.dll和dlltest.lib复制到当前目录

  4. int main()
  5. {
  6.         int a;
  7.         a = Add(10, 5);
  8.         printf("%d \n", a);
  9.         return 0;
  10. }
复制代码

x2.jpg
再来vb6调用的例子:
  1. Option Explicit
  2. Private Declare Function Add Lib "dlltest.dll" (ByVal a As Integer, ByVal b As Integer) As Integer

  3. Private Sub Command1_Click()
  4.     MsgBox Add(10, 5)
  5. End Sub
复制代码

x3.jpg
接着是delphi7调用的例子:
  1. unit Unit1;

  2. interface

  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls;

  6. type
  7.   TForm1 = class(TForm)
  8.     Button1: TButton;
  9.     procedure Button1Click(Sender: TObject);
  10.   private
  11.     { Private declarations }
  12.   public
  13.     { Public declarations }
  14.   end;

  15. var
  16.   Form1: TForm1;

  17. implementation
  18.   function Add(a:Integer; b:Integer):Integer; stdcall; external 'dlltest.dll';
  19. {$R *.dfm}

  20. procedure TForm1.Button1Click(Sender: TObject);
  21. begin
  22.   ShowMessage(IntToStr(Add(2,3)));
  23. end;

  24. end.
复制代码

x4.jpg
这里需要注意的是:
dll文件必须要放在程序当前目录下或者windows目录下,以供程序寻找dll入口
还有,以vc2013默认状态开发出来的dll是不可以在xp系统上使用的


老C再将一些从vc dll中导出字符串供vb6调用的办法告诉大家
这个功能的具体作用呢,就是将多种语言字符串封装在dll中,程序调用后,即可切换显示语言
先以上面的模板改造dll:
  1. #include <windows.h> //包含windows.h头文件

  2. #define DLLEXPORT _declspec(dllexport) //定义导出宏

  3. DLLEXPORT int Add(int a, int b)
  4. {
  5.         return a + b;
  6. }

  7. DLLEXPORT BOOL GetString(LPSTR str, int iWhichLanguage) //导出的函数
  8. {
  9.         if (iWhichLanguage == 0)
  10.                 strcpy(str, "Hello!");
  11.         else
  12.                 strcpy(str, "你好!");
  13.         return TRUE;
  14. }

  15. BOOL APIENTRY DllMain(HANDLE hModule, DWORD  reason, LPVOID lpReserved) //dll入口函数
  16. {
  17.         switch (reason)
  18.         {
  19.         case DLL_PROCESS_ATTACH:
  20.                 break;
  21.         case DLL_PROCESS_DETACH:
  22.                 break;
  23.         case DLL_THREAD_ATTACH:
  24.                 break;
  25.         case DLL_THREAD_DETACH:
  26.                 break;
  27.         }
  28.         return TRUE;
  29. }
复制代码

然后呢,在vb6中这样调用:
  1. Option Explicit
  2. Private Declare Function GetString Lib "dlltest.dll" (ByVal str As String, ByVal iWhichLanguage As Integer) As Boolean

  3. Private Sub Option1_Click(Index As Integer)
  4.     Dim str As String * 256 '注意这里一定要申请一个定长字符串然后将函数中的字符串传进这个定长字符串,否则会导致程序崩溃
  5.     Call GetString(str, Index)
  6.     Label1 = str
  7. End Sub
复制代码

结果如下:
x5.jpg
x6.jpg

最后:
这些方法是老C试验了n次得出的结论,每段代码都有测试,确保可以使用。
In the beginning I was not the best.
And the world was also not the best.
But I still know that I am who I am.
Because I think that it is good.
I have been working hard.
I have been keeping growth with the world.
And it was so.
回复

使用道具 举报

1112

主题

1653

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24261 个
贡献
46222 次
宅之契约
0 份
在线时间
2298 小时
注册时间
2014-1-26
发表于 2015-1-9 15:30:05 | 显示全部楼层
不错不错。。但是为毛你截取的图看起来都好大?
回复 赞! 靠!

使用道具 举报

17

主题

28

回帖

590

积分

用户组: 大·技术宅

UID
140
精华
5
威望
30 点
宅币
440 个
贡献
26 次
宅之契约
0 份
在线时间
54 小时
注册时间
2014-3-22
发表于 2015-1-9 19:49:32 | 显示全部楼层
最好再加个extern "C"
回复 赞! 靠!

使用道具 举报

85

主题

175

回帖

3990

积分

用户组: 超级版主

No. 418

UID
418
精华
14
威望
53 点
宅币
1974 个
贡献
1582 次
宅之契约
0 份
在线时间
252 小时
注册时间
2014-8-9
 楼主| 发表于 2015-1-10 03:04:11 | 显示全部楼层
mzflz 发表于 2015-1-9 19:49
最好再加个extern "C"

嗯,extern “C”是cpp的写法 我是用纯C写的,这样保证了在cpp下也能运行
In the beginning I was not the best.
And the world was also not the best.
But I still know that I am who I am.
Because I think that it is good.
I have been working hard.
I have been keeping growth with the world.
And it was so.
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-29 16:26 , Processed in 0.047166 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表