加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

VC6.0调用vs2010生成CImage类的动态库DLL

(2018-03-30 17:37:14)
标签:

vc6

vs2010

cimage

dll

调用

分类: 代码天地


VC6.0调用vs2010生成CImage类的动态库DLL

 

一 简要说明


 1 VC6.0(支持win7&win8)只有区区 30.2MB,vs2010安装包足有2.5GB,且两者对机器性能要求也相差很大。
2 VC6.0启动快,生成代码小,对于一般功能要求,完全可以达到要求。
3 对于VC6中没有,而VS2005以上有的新功能,则可以在高环境下编为动态库供VC6下使用。
下面以很强图像处理功能CImage类为例,说明方法步骤:


可以参考以下的相关内容

VC6 VC2010 C#调用C#的COM
C# VC6 VC2010调用C#的动态库DLL
c# VC6调用VC6编写的COM
C# VC6调用VC6的动态库DLL


本代码主要来自网上的 ,并做了适当的修改 VC6如何使用VS2005中的CImage类功能

 

 

二 创建VS2010动态库Image2010

 

 注意:打开VS2010,新建-项目-Windows-类库(),用于创建C#类库的项目(dll)。
 这里使用 Visual C++ 生成,方法步骤如下:

 

1 打开VS2010,新建 -- 项目 -- Visual C++ -- Win32 -- Win32项目

 

 名称输入 Image2010,

点      确定 --  下一步 --  应用程序类型 点选 Dll --   完成


2 加入 头文件 Image2010.h


 默认没有头文件,需要手工加入,步骤如下:
 右击 解决方案资源管理器下的方案 Image2010 -- 添加 -- 新建项,
 左侧框中选 Visual C++,中间框中 点选 其中的 头文件(.h)
 名称输入 Image2010,  点 添加
 
 注意:头文件不要包含其它的头文件,有也要移到实现文件.cpp内,以免vc6找不到

 Image2010.h 内容为:

 

#ifndef AFX_EXT_CLASS

#define AFX_EXT_CLASS __declspec(dllimport)

#endif

 

class AFX_EXT_CLASS CImage2010

{

private:

     void * m_pImage;   //内部数据,这里是关键 类型是通用的 void 

public:

     CImage2010(void);

     virtual ~CImage2010(void);

public:

     inline HRESULT Load(LPCSTR pszFileName);  //装载图片

    inline void SaveScreen(LPCSTR filename,HDC hdcSrc,RECT rect);//保存屏幕部分为jpg文件

     inline BOOL IsNull();  //资源是否存在

     inline BOOL Draw(HDC hDestDC, const RECT& rectDest);    //指定设备和区域画图

     inline operator HBITMAP();  //转换为GDI中的HBITMAP, 从而供GDI中的CDC等类使用

};

 
3 改写cpp实现文件 Image2010.cpp

 

 注意:其它的头文件,有也要移到实现文件.cpp内

  Image2010.cpp内容为:

 

// Image2010.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"
#define AFX_EXT_CLASS __declspec(dllexport)

#include "stdafx.h"

#include "Image2010.h"

//注意生成动态库需要的头文件,要放到实现文件.CPP内,不要放到头文件.H内,否则VC6下引用头文件找不到
#include < atlimage.h >  //注意 尖括号 左右两边 要留有 “空格”, 否则博客会过滤掉

#include < atlconv.h >

CImage2010::CImage2010(void)

{

     m_pImage=NULL;

     m_pImage=new CImage;//生成 的类型 是CImage 

}

CImage2010::~CImage2010(void)

{

     if(m_pImage)

     {

         delete m_pImage;

         m_pImage=NULL;

     }

}

inline HRESULT CImage2010::Load( LPCSTR pszFileName )

{

     USES_CONVERSION;
//void转换为CImage ,以便 调用其函数

     return ((CImage*)m_pImage)->Load(A2T(pszFileName));

}

inline void CImage2010::SaveScreen(LPCSTR filename,HDC hdcSrc,RECT rect)

{

//HDC hdcSrc = ::GetDC(NULL);

int nBitPerPixel = GetDeviceCaps(hdcSrc, BITSPIXEL);

int nWidth = rect.right-rect.left;//GetDeviceCaps(hdcSrc, HORZRES);

int nHeight = rect.bottom-rect.top;//GetDeviceCaps(hdcSrc, VERTRES);

((CImage*)m_pImage)->Create(nWidth, nHeight, nBitPerPixel);

// BitBlt(((CImage*)m_pImage)->GetDC(), 0, 0, nWidth, nHeight, hdcSrc, rect.left, rect.top, SRCCOPY);

StretchBlt(((CImage*)m_pImage)->GetDC(), 0, 0, nWidth, nHeight, hdcSrc, rect.left, rect.top, nWidth, nHeight, SRCCOPY);

::ReleaseDC(NULL, hdcSrc);

((CImage*)m_pImage)->ReleaseDC();

USES_CONVERSION;

((CImage*)m_pImage)->Save(A2T(filename), Gdiplus::ImageFormatJPEG);//Gdiplus::ImageFormatPNG);

}

inline BOOL CImage2010::IsNull()

{

     return ((CImage*)m_pImage)->IsNull();

}

inline BOOL CImage2010::Draw( HDC hDestDC, const RECT& rectDest )

{

     return ((CImage*)m_pImage)->Draw(hDestDC,rectDest );

}

inline  CImage2010::operator HBITMAP()

{

     return ((CImage*)m_pImage)->operator HBITMAP();

}


4 生成 release版本

  注意:尽量使用Realse版本,以防止两种环境的调试信息不同出现问题。
  从顶部菜单栏之下的工具栏的“解决方案配置”下拉列表框中,将Debug 改为Release,
  然后点击菜单栏 生成 -- 生成 Image2010  即可。

 

5 复制相关的文件 .h .dll .lib

  右击 解决方案资源管理器下的方案 Image2010 ,选择最下面的  在Windows资源管理器中打开文件夹
  转至 C:\Users\xxx\Documents\visual studio 2010\Projects\Image2010\Image2010
  复制其中的头文件  Image2010.h

  回退一级文件夹,转到 Release下,
  C:\Users\xxx\Documents\visual studio 2010\Projects\Image2010\Release
  复制其中的头文件  Image2010.lib 和 Image2010.dll

 

三 VC6.0  调用 vs2010编译的DLL

 

1 开启 Microsoft Visual C++ 6.0,创建基于对话框的程序,
2 复制三个文件 Image2010.h 、Image2010.lib 和 Image2010.dll 到自己的工程文件夹下
3 引入头文件和库

 #include "Image2010.h"
 #pragma comment(lib,"Image2010.lib")

4 建立按钮函数调用调入图形,并绘制

void CTcigDlg::OnButton1()
{
 CImage2010 m_image;
 m_image.Load("12.png");
 if (m_image.IsNull())
 {
  MessageBox("找不到图片文件","警告",MB_ICONWARNING);
 }
 else
 {
  CRect rect;
  GetClientRect(&rect);
  CDC *pDC=GetDC();
  m_image.Draw(pDC->m_hDC,rect); 
  ReleaseDC(pDC);
 }

RECT rect;
rect.left=100;
rect.top=100;
rect.right=500;
rect.bottom=400;

m_image.SaveScreen("15.jpg",GetDC()->m_hDC,rect);


}

 

四 附加说明

vs2010  下 的头文件和实现文件

方法一

   1 文件--新建--项目(MyDll)--Visual C++ --Win32--选择Win32控制台应用程序;
      程序类型选择DLL,选择空项目完成;

  2 头文件:为项目添加头文件MyDll.h   内部添加如下代码,

#ifndef MY_DLL_API  
#define MY_DLL_API _declspec(dllexport)  
#else  
#define MY_DLL_API _declspec(dllimport)  
#endif

#include < Windows.h >
MY_DLL_API int add(int x, int y);  

 3 项目添加源文件MyDll.cpp   代码如下

#include "MyDLL.h"

int add(int x, int y)
{
        return x+y;
}
VC6使用方法 同上文

 #include "MyDll.h"
 #pragma comment(lib,"MyDll.lib")
 
int a=add(5,6);
-----------

方法二

1 头文件 testDll.h

#include
using namespace std;
 
extern "C" _declspec(dllexport) int __stdcall MyDll( int i1 );
 

2 cpp文件 testDll.cpp

int __stdcall MyDll( int i1 )
{
     return i1+5;
}


3 vc6.0 下 的 使用

typedef int ( __stdcall *pMyDll)( int i1 );
 pMyDll MyDll2 = NULL;  
 
 const char* dllName = "myDll.dll"; 
 HMODULE g_hDll = LoadLibrary( dllName ); 
 MyDll2= (pMyDll)GetProcAddress(g_hDll, "MyDll"); 
 int i2=MyDll2(2);

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有