# 2017-2018-2 20155228 《信息安全系统设计原理》 使用VirtualStudio2008创建和调用静态库和使用VirtualC++6.0创建和调用动态库...

使用virtual c++ 6.0创建和调用动态库

不得不说一下关于环境的问题

只要我打一个响指,一半的安装在win7上的VC6.0都会因为兼容性问题直接崩掉

懒得研究怎么解决兼容性的问题了,直接开一个winXP虚拟机完美运行vc6.0,省时省心,岂不美哉

研究大佬的博客的时候

Windows下静态库与动态库的创建与使用

尝试使用.def文件生成动态库并使用隐式链接到工程时,发现这个方法仅适用于动态库所在的工程和调用动态库的工程同时处于一个工作空间

1073846-20180527230901128-360162433.png

如图所示,0527helloworld是动态库所在的工程,0527testhelloworld是调用动态库的工程,两个工程都是处于名为0527helloworld的工作空间里面的

#include "stdafx.h"
#include "../0527helloworld/0527helloworld.h"

int main(int argc, char* argv[])
{
    int iRet;
    printf("Hello World!\n");
    iRet = cmp(3,8);
    printf("return value is: %d\n",iRet);
    return 0;
}

可以看到声明头文件的时候是声明了位于其他工程的头文件:#include "../0527helloworld/0527helloworld.h"

这应该就是其他工作空间的工程就算把.dll和.lib拷到工作目录下也添加了.h文件也无法调用动态库的原因

后来在网上找到另外一个方案,解决了这个问题

VC++ 6.0如何创建与调用动态链接库

现在简单介绍一下这个方案的流程

算了,今天太晚了我要睡觉了,明天再说


20180531更新

关于在VirtualStudio2008生成和使用静态库的方法在网上有很多,但是很多都没有用,这一篇博客有用

vs2008添加连接静态库和动态库


20180601更新

今天就把使用VC6.0创建和使用动态库的问题写成傻瓜教程,不用带着脑子,直接跟着一步一步做就可以了

我想写一个名为SUM的求和函数,输入是两个int类型变量,输出是一个int类型变量,函数代码如下:

int SUM(int a,int b)
{
    return a+b;
}

1. 创建动态库

1.1 新建动态库项目0601testDLLver3

打开VC6.0,左上角菜单栏:文件->新建

1073846-20180601185536926-68776498.png

1073846-20180601185542222-608649101.png

1073846-20180601185545887-950445452.png

项目创建完成,切换到file view,可以看到一堆预生成的文件,只需要对其中三个文件进行修改

1073846-20180601185605298-607841016.png

1.2 修改0601testDLLver3.h文件
// 0601testDLLver3.h : main header file for the 0601TESTDLLVER3 DLL
//

#if !defined(AFX_0601TESTDLLVER3_H__16DBBD8E_146C_4508_8E8C_20D288314FEF__INCLUDED_)
#define AFX_0601TESTDLLVER3_H__16DBBD8E_146C_4508_8E8C_20D288314FEF__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#ifndef __AFXWIN_H__
    #error include 'stdafx.h' before including this file for PCH
#endif

#include "resource.h"       // main symbols

/
// CMy0601testDLLver3App
// See 0601testDLLver3.cpp for the implementation of this class
//

class CMy0601testDLLver3App : public CWinApp
{
public:
    CMy0601testDLLver3App();

// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CMy0601testDLLver3App)
    //}}AFX_VIRTUAL

    //{{AFX_MSG(CMy0601testDLLver3App)
        // NOTE - the ClassWizard will add and remove member functions here.
        //    DO NOT EDIT what you see in these blocks of generated code !
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

extern "C" __declspec(dllexport) int __stdcall SUM(int a,int b);

/

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_0601TESTDLLVER3_H__16DBBD8E_146C_4508_8E8C_20D288314FEF__INCLUDED_)

1073846-20180601185609083-453683736.png

1.3 修改0601testDLLver3.def文件
; 0601testDLLver3.def : Declares the module parameters for the DLL.

LIBRARY      "0601testDLLver3"
DESCRIPTION  '0601testDLLver3 Windows Dynamic Link Library'

EXPORTS
    ; Explicit exports can go here
    SUM

1073846-20180601185614335-524194134.png

1.4 修改0601testDLLver3.cpp文件
// 0601testDLLver3.cpp : Defines the initialization routines for the DLL.
//

#include "stdafx.h"
#include "0601testDLLver3.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//
//  Note!
//
//      If this DLL is dynamically linked against the MFC
//      DLLs, any functions exported from this DLL which
//      call into MFC must have the AFX_MANAGE_STATE macro
//      added at the very beginning of the function.
//
//      For example:
//
//      extern "C" BOOL PASCAL EXPORT ExportedFunction()
//      {
//          AFX_MANAGE_STATE(AfxGetStaticModuleState());
//          // normal function body here
//      }
//
//      It is very important that this macro appear in each
//      function, prior to any calls into MFC.  This means that
//      it must appear as the first statement within the 
//      function, even before any object variable declarations
//      as their constructors may generate calls into the MFC
//      DLL.
//
//      Please see MFC Technical Notes 33 and 58 for additional
//      details.
//

/
// CMy0601testDLLver3App

extern "C" __declspec(dllexport) int __stdcall SUM(int a,int b)
{
    return a+b;
}

BEGIN_MESSAGE_MAP(CMy0601testDLLver3App, CWinApp)
    //{{AFX_MSG_MAP(CMy0601testDLLver3App)
        // NOTE - the ClassWizard will add and remove mapping macros here.
        //    DO NOT EDIT what you see in these blocks of generated code!
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/
// CMy0601testDLLver3App construction

CMy0601testDLLver3App::CMy0601testDLLver3App()
{
    // TODO: add construction code here,
    // Place all significant initialization in InitInstance
}

/
// The one and only CMy0601testDLLver3App object

CMy0601testDLLver3App theApp;



1073846-20180601185621335-807103560.png

1.5 编译代码创建动态库

使用一阳指大力出奇迹按下f7开始编译

生成动态库文件0601testDLLver3.lib和0601testDLLver3.dll放在0601testDLLver3工程目录下的debug文件夹中

1073846-20180601185627511-606085361.png

2. 使用动态库

2.1 创建测试工程0601testDLLver4

1073846-20180601213353482-1344576103.png

1073846-20180601213358260-1519454613.png

1073846-20180601213401285-1820591960.png

项目创建完成,切换到file view,可以看到预生成的文件0601testDLLver4.cpp,除了对这个文件进行修改我们还要创建一个0601testDLLver4.h头文件

1073846-20180601213417474-1451132958.png

2.2 把动态库文件0601testDLLver3.lib和0601testDLLver3.dll放在0601testDLLver4工程目录下

1073846-20180601213421144-1804084485.png

2.3 新建0601testDLLver4.h文件

1073846-20180601213425419-465511725.png

1073846-20180601213428926-1484248234.png

#include "stdafx.h"

#pragma comment(lib,"0601testDLLver3.lib")

extern "C" _declspec(dllimport) int _stdcall SUM(int a,int b);
2.4 修改0601testDLLver4.cpp文件

1073846-20180601213433317-498557794.png

#include "stdafx.h"
#include <stdio.h>
#include "0601testDLLver4.h"

int main(int argc, char* argv[])
{
    printf("Hello World!\n");
    int a=1;
    int b=2;
    int c=SUM(a,b);
    printf("%d",c);
    return 0;
}
2.5 编译运行,万事大吉

1073846-20180601213444630-762693574.png


20180602更新

使用VirtualStudio2008创建和调用静态库

1. 创建静态库

1.1 创建静态库项目0602RSAlib

打开VS2008,左上角菜单栏:文件->新建

1073846-20180602114701611-1601837870.png

1073846-20180602114706521-25964790.png

项目创建完成,切换到解决方案资源管理器,可以看到一些预生成的文件,只需要创建两个新文件0602RSAlib.h和0602RSAlib.cpp

1.2 创建0602RSAlib.cpp文件

1073846-20180602114714016-1990321921.png

#include "stdafx.h"
#include <stdio.h>

int MessageToCipher(void)
{
    int p,q,e,d,m,n,t,c,r;
    int x,y,z;
    char s;
    printf("请输入P和Q的值,中间用空格隔开,P和Q的值不相同且P和Q都是素数:");
    scanf("%d%d",&p,&q);
    printf("计算得到N的值为%d\n",n);
    printf("计算得到T的值为%d\n",t);
    printf("请输入E的值:");
    scanf("%d",&e);
    if(1==1)
    {
        printf("输入不合要求,请重新输入\n",t);
        scanf("%d",&e);
    }
    d=1;
    while(((e*d)%t)!=1)
    {
        d++;
    }
    printf("计算得到D的值为%d\n请输入明文M的值:",d);
    scanf("%d",&m);
    x=m;
    y=e;
    z=n;
    c=1;
    y=y+1;
    while(y!=1)
    {
        c=c*x;
        c=c%z;
        y--;
    }
    return c;
}

int CipherToMessage(void)
{
    int p,q,e,d,m,n,t,c,r;
    int x,y,z;
    char s;
    printf("请输入P和Q的值,中间用空格隔开,P和Q的值不相同且P和Q都是素数:");
    scanf("%d%d",&p,&q);
    printf("计算得到N的值为%d\n",n);
    printf("计算得到T的值为%d\n",t);
    printf("请输入E的值:");
    scanf("%d",&e);
    if(1==1)
    {
        printf("输入不合要求,请重新输入\n",t);
        scanf("%d",&e);
    }
    d=1;
    while(((e*d)%t)!=1)
    {
        d++;
    }
    printf("计算得到D的值为%d\n请输入密文C的值:",d);
    scanf("%d",&c);
    x=c;
    y=d;
    z=n;
    m=1;
    y=y+1;
    while(y!=1)
    {
        m=m*x;
        m=m%z;
        y--;
    }
    return m;
}
1.3 创建0602RSAlib.h文件

1073846-20180602114726970-348183859.png

#include "stdafx.h"

int MessageToCipher(void);
int CipherToMessage(void);
1.4 编译代码创建静态库

生成静态库文件0602RSAlib.lib放0602RSAlib工程目录下的debug文件夹中

1073846-20180602114736864-876868130.png

另外0602RSAlib工程目录下的0602RSAlib.h待会也会用到

1073846-20180602114742141-693012495.png

2. 调用静态库

2.1 创建测试工程0602testRSAlib

1073846-20180602114748888-1137283984.png

1073846-20180602114752964-201502607.png

2.2 把静态库文件0602RSAlib.lib和0602RSAlib.h放在0602testRSAlib工程目录下

1073846-20180602114758520-1942212925.png

2.3 修改0602testRSAlib.cpp文件
// 0602testRSAlib.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "0602RSAlib.h"
#include <stdio.h>
#pragma comment(lib,"0602RSAlib.lib")


int _tmain(int argc, _TCHAR* argv[])
{
    int temp;
    printf("非对称密码算法RSA\n");
A:
    printf("请输入数字1或0选择进行加密运算或是解密运算:");
    scanf("%d",&temp);
    if(temp==1)
    {
        int c=MessageToCipher();
        printf("密文C的值为:%d\n",c);
        goto A;
    }
    else if(temp==0)
    {
        int m=CipherToMessage();
        printf("明文M的值为:%d\n",m);
        goto A;
    }
    else
    {
        printf("输入不合要求,请重新输入\n");
        goto A;
    }
    return 0;
}
2.4 编译运行,万事大吉

1073846-20180602114808052-827114681.png

转载于:https://www.cnblogs.com/besti20155228/p/9098026.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值