cyycoish 发表于 2015-1-9 15:16:12

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

本帖最后由 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, DWORDreason, 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, DWORDreason, 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次得出的结论,每段代码都有测试,确保可以使用。

0xAA55 发表于 2015-1-9 15:30:05

不错不错。。但是为毛你截取的图看起来都好大?

mzflz 发表于 2015-1-9 19:49:32

最好再加个extern "C"

cyycoish 发表于 2015-1-10 03:04:11

mzflz 发表于 2015-1-9 19:49
最好再加个extern "C"

嗯,extern “C”是cpp的写法 我是用纯C写的,这样保证了在cpp下也能运行:)
页: [1]
查看完整版本: 使用vc开发标准dll及其调用