51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 7641|回复: 14
打印 上一主题 下一主题

在WR中调用DLL 截屏函数的问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2006-7-12 15:08:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用VC弄了个关于截屏的Dll程序,但是在WR中运行时总是跑不通,希望高手指点,具体代码如下:
// CutScreenDll.cpp : Defines the initialization routines for the DLL.
//

#include "stdafx.h"
#include <afxdllx.h>
#include<iostream>
#include <string>
using namespace std;

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


static AFX_EXTENSION_MODULE CutScreenDllDLL = { NULL, NULL };

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
        // Remove this if you use lpReserved
        UNREFERENCED_PARAMETER(lpReserved);

        if (dwReason == DLL_PROCESS_ATTACH)
        {
                TRACE0("CUTSCREENDLL.DLL Initializing!\n");
               
                // Extension DLL one-time initialization
                if (!AfxInitExtensionModule(CutScreenDllDLL, hInstance))
                        return 0;

                // Insert this DLL into the resource chain
                // NOTE: If this Extension DLL is being implicitly linked to by
                //  an MFC Regular DLL (such as an ActiveX Control)
                //  instead of an MFC application, then you will want to
                //  remove this line from DllMain and put it in a separate
                //  function exported from this Extension DLL.  The Regular DLL
                //  that uses this Extension DLL should then explicitly call that
                //  function to initialize this Extension DLL.  Otherwise,
                //  the CDynLinkLibrary object will not be attached to the
                //  Regular DLL's resource chain, and serious problems will
                //  result.

                new CDynLinkLibrary(CutScreenDllDLL);
        }
        else if (dwReason == DLL_PROCESS_DETACH)
        {
                TRACE0("CUTSCREENDLL.DLL Terminating!\n");
                // Terminate the library before destructors are called
                AfxTermExtensionModule(CutScreenDllDLL);
        }
        return 1;   // ok
}


void Screen(char filename[])
{

CDC *pDC;//屏幕DC
pDC = CDC::FromHandle(GetDC(NULL));//获取当前整个屏幕DC
int BitPerPixel = pDC->GetDeviceCaps(BITSPIXEL);//获得颜色模式
int Width = pDC->GetDeviceCaps(HORZRES);
int Height = pDC->GetDeviceCaps(VERTRES);

cout << "当前屏幕色彩模式为" << BitPerPixel << "位色彩" << endl
<< "屏幕宽度:" << Width << endl
<< "屏幕高度:" << Height << endl << endl;

CDC memDC;//内存DC
memDC.CreateCompatibleDC(pDC);

CBitmap memBitmap, *oldmemBitmap;//建立和屏幕兼容的bitmap
memBitmap.CreateCompatibleBitmap(pDC, Width, Height);

oldmemBitmap = memDC.SelectObject(&memBitmap);//将memBitmap选入内存DC
memDC.BitBlt(0, 0, Width, Height, pDC, 0, 0, SRCCOPY);//复制屏幕图像到内存DC

//以下代码保存memDC中的位图到文件
BITMAP bmp;
memBitmap.GetBitmap(&bmp);//获得位图信息

FILE *fp = fopen(filename, "w+b");

BITMAPINFOHEADER bih = {0};//位图信息头
bih.biBitCount = bmp.bmBitsPixel;//每个像素字节大小
bih.biCompression = BI_RGB;
bih.biHeight = bmp.bmHeight;//高度
bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;//图像数据大小
bih.biWidth = bmp.bmWidth;//宽度

BITMAPFILEHEADER bfh = {0};//位图文件头
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;//文件总的大小
bfh.bfType = (WORD)0x4d42;

fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);//写入位图文件头

fwrite(&bih, 1, sizeof(BITMAPINFOHEADER), fp);//写入位图信息头

byte * p = new byte[bmp.bmWidthBytes * bmp.bmHeight];//申请内存保存位图数据

GetDIBits(memDC.m_hDC, (HBITMAP) memBitmap.m_hObject, 0, Height, p,
(LPBITMAPINFO) &bih, DIB_RGB_COLORS);//获取位图数据

fwrite(p, 1, bmp.bmWidthBytes * bmp.bmHeight, fp);//写入位图数据

delete [] p;

fclose(fp);

memDC.SelectObject(oldmemBitmap);
}




wr中的代码
load_dll("E:\\VC\\CutScreenDll\\Debug\\CutScreenDll.dll");
filename[0]="a";
extern int Screen(filename);#跑到这里出现如图所示提示框


Screen(filename);//调用Screen函数


unload_dll("E:\\VC\\CutScreenDll\\Debug\\CutScreenDll.dll");

G:\Snap3.bmp

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2006-7-13 14:31:26 | 只看该作者
各位啊,有知道的吗?这边着急啊
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2006-7-18 09:52:10 | 只看该作者
怎么还没有人回复啊,是不是我说的不清楚啊
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2006-7-18 11:10:18 | 只看该作者
一、
你的C++ 函数是void型的
你的Wr调用返回是Int型的

二、最好不要使用MFC的DLL方式写

三、不要传数组作为参数

还有这段代码不是楼主自己写的吧,肯定是哪儿Copy过来的,哈哈
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2006-7-18 11:36:43 | 只看该作者

报错的原因可能是函数定义错误,没有描述函数参数的类型

还有,dll里的相关函数要是int型的
同时对这种dll能否调用成功表示怀疑。
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2006-7-18 20:32:39 | 只看该作者
如果DLL没问题那把WR 的 extern函数改下:
extern extern int Screen(in string); // 如果不修改, 如果要输出, inout 代替 in
给个链接:
http://bbs.51testing.com/viewthr ... p;highlight=shyfish

MFC写的DLL完全可用, 而且简单(导出函数使用引用都可以). 用作辅助WR很好啊

[ 本帖最后由 51Testing论坛 于 2008-4-22 23:08 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

7#
发表于 2006-7-18 22:07:31 | 只看该作者
楼上的,再你的wr中重新声名你的函数 extern int Screen( in string filename);
回复 支持 反对

使用道具 举报

该用户从未签到

8#
发表于 2006-7-18 22:11:44 | 只看该作者
另外,你的filename因该是个文件名吧,在WR不能像你那样调用
你应该这样
static filename;
filename="c:\1.bmp"
然后调用函数
回复 支持 反对

使用道具 举报

该用户从未签到

9#
 楼主| 发表于 2006-7-20 11:27:39 | 只看该作者
谢谢大家啊 ,我先调试一下,要是好使这段代码大家就可以一起使用了啊
回复 支持 反对

使用道具 举报

该用户从未签到

10#
 楼主| 发表于 2006-7-21 13:42:56 | 只看该作者
通过大家的帮助,代码这下子可以 用了sdlkfj2,
// CutScreenDll.cpp : Defines the initialization routines for the DLL.
//

#include "stdafx.h"
#include <afxdllx.h>
#include<iostream>
#include <string>
using namespace std;

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


static AFX_EXTENSION_MODULE CutScreenDllDLL = { NULL, NULL };

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
        // Remove this if you use lpReserved
        UNREFERENCED_PARAMETER(lpReserved);

        if (dwReason == DLL_PROCESS_ATTACH)
        {
                TRACE0("CUTSCREENDLL.DLL Initializing!\n");
               
                // Extension DLL one-time initialization
                if (!AfxInitExtensionModule(CutScreenDllDLL, hInstance))
                        return 0;

                // Insert this DLL into the resource chain
                // NOTE: If this Extension DLL is being implicitly linked to by
                //  an MFC Regular DLL (such as an ActiveX Control)
                //  instead of an MFC application, then you will want to
                //  remove this line from DllMain and put it in a separate
                //  function exported from this Extension DLL.  The Regular DLL
                //  that uses this Extension DLL should then explicitly call that
                //  function to initialize this Extension DLL.  Otherwise,
                //  the CDynLinkLibrary object will not be attached to the
                //  Regular DLL's resource chain, and serious problems will
                //  result.

                new CDynLinkLibrary(CutScreenDllDLL);
        }
        else if (dwReason == DLL_PROCESS_DETACH)
        {
                TRACE0("CUTSCREENDLL.DLL Terminating!\n");
                // Terminate the library before destructors are called
                AfxTermExtensionModule(CutScreenDllDLL);
        }
        return 1;   // ok
}


extern"C" __declspec(dllexport) void Screen(char *filename)
{

CDC *pDC;//屏幕DC
pDC = CDC::FromHandle(GetDC(NULL));//获取当前整个屏幕DC
int BitPerPixel = pDC->GetDeviceCaps(BITSPIXEL);//获得颜色模式
int Width = pDC->GetDeviceCaps(HORZRES);
int Height = pDC->GetDeviceCaps(VERTRES);

CDC memDC;//内存DC
memDC.CreateCompatibleDC(pDC);

CBitmap memBitmap, *oldmemBitmap;//建立和屏幕兼容的bitmap
memBitmap.CreateCompatibleBitmap(pDC, Width, Height);

oldmemBitmap = memDC.SelectObject(&memBitmap);//将memBitmap选入内存DC
memDC.BitBlt(0, 0, Width, Height, pDC, 0, 0, SRCCOPY);//复制屏幕图像到内存DC

//以下代码保存memDC中的位图到文件
BITMAP bmp;
memBitmap.GetBitmap(&bmp);//获得位图信息

FILE *fp = fopen(filename, "w+b");

BITMAPINFOHEADER bih = {0};//位图信息头
bih.biBitCount = bmp.bmBitsPixel;//每个像素字节大小
bih.biCompression = BI_RGB;
bih.biHeight = bmp.bmHeight;//高度
bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;//图像数据大小
bih.biWidth = bmp.bmWidth;//宽度

BITMAPFILEHEADER bfh = {0};//位图文件头
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;//文件总的大小
bfh.bfType = (WORD)0x4d42;

fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);//写入位图文件头

fwrite(&bih, 1, sizeof(BITMAPINFOHEADER), fp);//写入位图信息头

byte * p = new byte[bmp.bmWidthBytes * bmp.bmHeight];//申请内存保存位图数据

GetDIBits(memDC.m_hDC, (HBITMAP) memBitmap.m_hObject, 0, Height, p,
(LPBITMAPINFO) &bih, DIB_RGB_COLORS);//获取位图数据

fwrite(p, 1, bmp.bmWidthBytes * bmp.bmHeight, fp);//写入位图数据

delete [] p;

fclose(fp);

memDC.SelectObject(oldmemBitmap);

}


WR中的代码:
extern  int Screen(string filename);
load_dll("E:\\VC\\CutScreenDll\\Debug\\CutScreenDll.dll");
Screen("d:\\bmp.bmp");

unload_dll("E:\\VC\\CutScreenDll\\Debug\\CutScreenDll.dll");
回复 支持 反对

使用道具 举报

该用户从未签到

11#
发表于 2008-3-21 16:47:29 | 只看该作者
我把DLL編譯了
看看能不能用

[ 本帖最后由 byya 于 2008-3-21 17:09 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
回复 支持 反对

使用道具 举报

该用户从未签到

12#
发表于 2008-3-21 16:53:31 | 只看该作者
的確可以用..不借..速度很快...這樣有錯誤時可以自動截圖...這功能好
回复 支持 反对

使用道具 举报

该用户从未签到

13#
发表于 2008-4-7 10:13:14 | 只看该作者
好东西
回复 支持 反对

使用道具 举报

该用户从未签到

14#
发表于 2009-11-23 15:28:11 | 只看该作者
我是自己录制了一个脚本,在测试软件的时候同时激活红蜻蜓抓图精灵,用这个软件的截屏功能来截屏
回复 支持 反对

使用道具 举报

该用户从未签到

15#
发表于 2010-11-9 13:01:26 | 只看该作者
有人提到: 为什么不用自带的WR函数win_capture_bitmap呢?
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-17 17:24 , Processed in 0.077346 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

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