Hrmcobol, aquí va el código y la DLL compilada:
Código CPP:
#include <Windows.h>
#include <Gdiplus.h>
#define DllExport __declspec( dllexport )
extern "C" {
DllExport void __stdcall ScreenShot(char*BmpName, HWND WndHwnd)
{
RECT DesktopParams;
HDC DevC = GetDC(WndHwnd);
DWORD Width = DesktopParams.right - DesktopParams.left;
DWORD Height = DesktopParams.bottom - DesktopParams.top;
DWORD FileSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+(sizeof(RGBTRIPLE)+1*(Width*Height*4));
char *BmpFileData
= (char*)GlobalAlloc(0x0040,FileSize
);
PBITMAPFILEHEADER BFileHeader = (PBITMAPFILEHEADER)BmpFileData;
PBITMAPINFOHEADER BInfoHeader = (PBITMAPINFOHEADER)&BmpFileData[sizeof(BITMAPFILEHEADER)];
BFileHeader->bfType = 0x4D42; // BM
BFileHeader->bfSize = sizeof(BITMAPFILEHEADER);
BFileHeader->bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
BInfoHeader->biSize = sizeof(BITMAPINFOHEADER);
BInfoHeader->biPlanes = 1;
BInfoHeader->biBitCount = 24;
BInfoHeader->biCompression = BI_RGB;
BInfoHeader->biHeight = Height;
BInfoHeader->biWidth = Width;
RGBTRIPLE *Image = (RGBTRIPLE*)&BmpFileData[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
RGBTRIPLE color;
HBITMAP CaptureBitmap = CreateCompatibleBitmap(DevC,Width,Height);
BitBlt(CaptureDC,0,0,Width,Height,DevC,0,0,SRCCOPY|CAPTUREBLT);
GetDIBits(CaptureDC,CaptureBitmap,0,Height,Image,(LPBITMAPINFO)BInfoHeader, DIB_RGB_COLORS);
DWORD Junk;
HANDLE FH
= CreateFileA(BmpName,GENERIC_WRITE,FILE_SHARE_WRITE,
0,CREATE_ALWAYS,
0,
0);}
} //undecorate
Para llamar la función desde PowerCOBOL, en el fichero COBOL85.CBR ponemos:
Código:
[MainForm.Entry]
ScreenShot=PrintScreen.dll
En el código:
Código COBOL:
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 PrinScreen PIC X(50) VALUE "ScreenShot".
01 WsPath PIC X(250).
01 FrmHWND PIC S9(9) COMP-5.
PROCEDURE DIVISION.
MOVE "hwnd" OF POW-SELF TO FrmHWND
MOVE "C:\001.BMP" TO WsPath
CALL PrinScreen WITH STDCALL USING BY REFERENCE WsPath
BY VALUE FrmHWND