Gracias Rui Pinto (Rapinto)
COBOL Foro
Foro dedicado a COBOL, a la Programación y a la Informática.
Retroceder   COBOL Foro > Programación e Informática > Otros lenguajes de programación > C/C++
C/C++ Compiladores de C y C++. Visual Studio, Embarcadero (Borland), DEV C++ etc.
Noticias y Avisos
Otros temas que te pueden interesar
Tema Autor Foro Respuestas Último post
[Información] Error en dll (DLL does not exist) Josber PowerCOBOL (ActiveX) 5 18 de febrero de 2015 18:39
Respuesta
 
Herramientas

  #1
Antiguo 9 de marzo de 2017, 13:48
IDENTIFICATION DIVISION
Kuk
Administrador
ENVIRONMENT DIVISION
Avatar de Kuk
DATA DIVISION
Forero desde (Registrado)enero 2015
España
UbicaciónMadrid
Edad33 años
Última Actividad13.12.2018 23:01
PROCEDURE DIVISION
PostsPosts: 1.319
Ha dicho GraciasEnviado: 280
Ha recibido agradecimientosRecibido: 480
ReputaciónReputación: 10
Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road
Foto DLL que crea un pantallazo

Adrianeloy, Dasije, aquí está el fuente:

Código CPP:
  1. #include <windows.h>
  2. #include <gdiplus.h>
  3. using namespace Gdiplus;
  4.  
  5. #define DllExport __declspec( dllexport )
  6.  
  7. extern "C" { // Undecorate
  8.  
  9. int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
  10. {
  11.    UINT  num = 0;          // number of image encoders
  12.    UINT  size = 0;         // size of the image encoder array in bytes
  13.  
  14.    ImageCodecInfo* pImageCodecInfo = NULL;
  15.  
  16.    GetImageEncodersSize(&num, &size);
  17.    if(size == 0)
  18.       return -1;  // Failure
  19.  
  20.    pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
  21.    if(pImageCodecInfo == NULL)
  22.       return -1;  // Failure
  23.  
  24.    GetImageEncoders(num, size, pImageCodecInfo);
  25.  
  26.    for(UINT j = 0; j < num; ++j)
  27.    {
  28.       if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
  29.       {
  30.          *pClsid = pImageCodecInfo[j].Clsid;
  31.          free(pImageCodecInfo);
  32.          return j;  // Success
  33.       }
  34.    }
  35.    free(pImageCodecInfo);
  36.    return -1;  // Failure
  37. }
  38.  
  39. DllExport int HazPantallazo(const char* SavePath)
  40. {
  41.     GdiplusStartupInput gdiplusStartupInput;
  42.     ULONG_PTR gdiplusToken;
  43.     GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
  44.  
  45. // get the device context of the screen
  46. HDC hScreenDC = CreateDC("DISPLAY", NULL, NULL, NULL);    
  47. // and a device context to put it in
  48. HDC hMemoryDC = CreateCompatibleDC(hScreenDC);
  49.  
  50. int width = GetDeviceCaps(hScreenDC, HORZRES);
  51. int height = GetDeviceCaps(hScreenDC, VERTRES);
  52.  
  53. // maybe worth checking these are positive values
  54. HBITMAP hBitmap = CreateCompatibleBitmap(hScreenDC, width, height);
  55.  
  56. // get a new bitmap
  57. HBITMAP hOldBitmap = SelectObject(hMemoryDC, (HGDIOBJ)hBitmap);
  58.  
  59. BitBlt(hMemoryDC, 0, 0, width, height, hScreenDC, 0, 0, SRCCOPY);
  60. hBitmap = SelectObject(hMemoryDC, (HGDIOBJ)hOldBitmap);
  61.    
  62.     Bitmap *image = new Bitmap(hBitmap, NULL);
  63.    
  64.     CLSID myClsId;
  65.     int retVal = GetEncoderClsid(L"image/jpg", &myClsId);
  66.    
  67. wchar_t  PATH[512];    
  68. const wchar_t* WSavePath = &PATH[0];    
  69.    
  70. mbstowcs(PATH, SavePath, 512);
  71.    
  72.     image->Save(WSavePath, &myClsId, NULL);
  73.     delete image;
  74.  
  75.     GdiplusShutdown(gdiplusToken);    
  76.     // clean up
  77. DeleteDC(hMemoryDC);
  78. DeleteDC(hScreenDC);
  79.  
  80.     return 0;
  81. }
  82.  
  83. } // Undecorate

Según he leído, se puede indicar la calidad (nivel de compresión) en el 3-er parámetro en la invocación del método save (donde va el NULL) :

Código CPP:
  1. image->Save(WSavePath, &myClsId, NULL);

Pero no sé por qué, no me compila en DevC++ con la estructura EncoderParameter.

Adrianeloy, el formato depende de lo que tú indiques. puede ser:
Código CPP:
  1. int retVal = GetEncoderClsid(L"image/jpg", &myClsId);
  2. int retVal = GetEncoderClsid(L"image/bmp", &myClsId);
  3. int retVal = GetEncoderClsid(L"image/png", &myClsId);

Lo he modificado a JPG porque el BMP por defecto pesa 6 megas cada pantallazo


NORMAS DEL FORO - obligatorias de conocer para TODOS.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale Pinchando en su Nick:

Kuk no ha iniciado sesión   Responder Con Cita
Ha dicho Gracias : 1
Adrianeloy ( 9 de marzo de 2017)
  #2
Antiguo 9 de marzo de 2017, 14:18
IDENTIFICATION DIVISION
Dasije
Novato Senior
ENVIRONMENT DIVISION
Avatar de Dasije
DATA DIVISION
Forero desde (Registrado)noviembre 2015
Reino Unido
UbicaciónJerez De La Frontera (cádiz)
Última Actividad14.12.2018 01:46
PROCEDURE DIVISION
PostsPosts: 162
Ha dicho GraciasEnviado: 0
Ha recibido agradecimientosRecibido: 70
ReputaciónReputación: 10
Dasije is on a distinguished road Dasije is on a distinguished road Dasije is on a distinguished road Dasije is on a distinguished road Dasije is on a distinguished road Dasije is on a distinguished road
Predeterminado

En las rutinas de C++ que tengo realizadas, en su momento leí en los manuales de NetCOBOL de como llamar funciones, y así debes hacerlo para que te envíe o reciba parámetros con un CALL directamente:

Código CPP:
  1. extern "C" _declspec(dllexport) void WINAPI nombre_rutina(long int parametro1, char parametro2[256], char parametro3[256])

Todos los parámetros pueden ser para enviar como para recoger entre ambos ambientes.

Recuerda que el type char, es una string sin fin, y debe convertirse en array limitado el número de ocurrencias haciendo una copia del valor de la variable para que reciba el valor desde NetCOBOL, en caso contrario no llegaría ninguno.


Empresa de desarrollo de aplicaciones en COBOL.

DASIJE INFORMATICA, S.L.
C/ TOMAS BRETON 20
11406 JEREZ DE LA FRONTERA
CADIZ

Teléfono : 956 11 21 11
Web: http://www.dasije.es / DASIJE INFORMATICA
E-m@il: clientes(@)dasije.es
Dasije no ha iniciado sesión   Responder Con Cita
  #3
Antiguo 9 de marzo de 2017, 14:46
IDENTIFICATION DIVISION
Kuk
Administrador
ENVIRONMENT DIVISION
Avatar de Kuk
DATA DIVISION
Forero desde (Registrado)enero 2015
España
UbicaciónMadrid
Edad33 años
Última Actividad13.12.2018 23:01
PROCEDURE DIVISION
PostsPosts: 1.319
Ha dicho GraciasEnviado: 280
Ha recibido agradecimientosRecibido: 480
ReputaciónReputación: 10
Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road
Predeterminado

Dasije, ¿qué es lo que no te gusta exactamente del fuente que he publicado? No entiendo qué tiene que ver tu post. Yo sólo paso un puntero, nada más.
Si simplemente quieres mostrar un ejemplo que no tiene nada que ver con este código publicado por mi, deberías crear un tema nuevo. Si tienes modificaciones a aportar al código publicado, precisa más, dónde exactamente y por qué.

Lo de "directamente", no sé a qué te refieres. Si es por la *.LIB, la que genera el Dev C++ no funciona, no sé por qué y no tengo tiempo de mirarlo. Pero como se puede evitar con LoadLibrary y GetProcAddress (que se hacen automáticamente via fichero COBOL85.CBR) no me he comido mucho el coco con ello.

El extern "C" lo que hace es el famoso "undecorate" que básicamente hace más visibles los nombres de las funciones de acuerdo a las normas del C.

En cuanto a pasar un char en parámetros, aunque la declaración sea así, por detrás se transforma en puntero y se pasa la dirección del array, porque no podemos pasar por parámetro algo que no sea tipo binario. Ah, y por cierto:

Cita del post de Dasije Ver Mensaje
Recuerda que el type char, es una string sin fin
Aquí te has equivocado, el tipo char es de 1 byte, y no infinito. Si lo definimos como array de char y sin especificar la longitud, ahí sí. Es decir:

Código CPP:
  1. char MyCharArray[];


NORMAS DEL FORO - obligatorias de conocer para TODOS.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale Pinchando en su Nick:

Kuk no ha iniciado sesión   Responder Con Cita
  #4
Antiguo 9 de marzo de 2017, 15:59
IDENTIFICATION DIVISION
Dasije
Novato Senior
ENVIRONMENT DIVISION
Avatar de Dasije
DATA DIVISION
Forero desde (Registrado)noviembre 2015
Reino Unido
UbicaciónJerez De La Frontera (cádiz)
Última Actividad14.12.2018 01:46
PROCEDURE DIVISION
PostsPosts: 162
Ha dicho GraciasEnviado: 0
Ha recibido agradecimientosRecibido: 70
ReputaciónReputación: 10
Dasije is on a distinguished road Dasije is on a distinguished road Dasije is on a distinguished road Dasije is on a distinguished road Dasije is on a distinguished road Dasije is on a distinguished road
Predeterminado

Quería dar entender que se puede mejorar para poder usar la LIB, así tratas la rutina como si fuera una API de Windows dentro del procedure donde se ejecute.

Sino te funciona, debe ser la compatibilidad del compilador, en mi caso funciona con MS C++ 6.0.


Empresa de desarrollo de aplicaciones en COBOL.

DASIJE INFORMATICA, S.L.
C/ TOMAS BRETON 20
11406 JEREZ DE LA FRONTERA
CADIZ

Teléfono : 956 11 21 11
Web: http://www.dasije.es / DASIJE INFORMATICA
E-m@il: clientes(@)dasije.es
Dasije no ha iniciado sesión   Responder Con Cita
  #5
Antiguo 9 de marzo de 2017, 16:40
IDENTIFICATION DIVISION
Kuk
Administrador
ENVIRONMENT DIVISION
Avatar de Kuk
DATA DIVISION
Forero desde (Registrado)enero 2015
España
UbicaciónMadrid
Edad33 años
Última Actividad13.12.2018 23:01
PROCEDURE DIVISION
PostsPosts: 1.319
Ha dicho GraciasEnviado: 280
Ha recibido agradecimientosRecibido: 480
ReputaciónReputación: 10
Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road
Predeterminado

Dasije, entonces no es el fuente el que no te gusta sino que no haya facilitado la LIB correspondiente en el tema [Componente] Como generar un PrintScreen - COBOL Foro. No sé, he probado con la que genera el Dev C++ (que es lib*.a) y extrayendo la LIB desde la DLL con la utilidad IMPLIB. Ambas van en el ZIP, probadlas a ver, pero a mi no me han funcionado.
Archivos Adjuntos
Tipo de Archivo: zip LIB_Pantallazo.zip (809 Bytes, 20 descargas)


NORMAS DEL FORO - obligatorias de conocer para TODOS.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale Pinchando en su Nick:

Kuk no ha iniciado sesión   Responder Con Cita
  #6
Antiguo 11 de marzo de 2017, 23:29
IDENTIFICATION DIVISION
Hrmcobol
Guardián del Foro
ENVIRONMENT DIVISION
Avatar de Hrmcobol
DATA DIVISION
Forero desde (Registrado)febrero 2015
Argentina
UbicaciónPuerto Madryn
Edad66 años
Última Actividad25.11.2018 11:07
PROCEDURE DIVISION
PostsPosts: 256
Ha dicho GraciasEnviado: 89
Ha recibido agradecimientosRecibido: 73
Medallas recibidas: 1Medallas: Guardián del Foro: Guardián del espíritu y clima del Foro - Razón: Por implicación en la vida del Foro 
ReputaciónReputación: 10
Hrmcobol is a glorious beacon of light Hrmcobol is a glorious beacon of light Hrmcobol is a glorious beacon of light Hrmcobol is a glorious beacon of light Hrmcobol is a glorious beacon of light Hrmcobol is a glorious beacon of light
Predeterminado

Amigo Kuk, sera posible que la rutina Pantallazo capture solo la pantalla Vigente?
Saludos
Hrmcobol no ha iniciado sesión   Responder Con Cita
  #7
Antiguo 12 de marzo de 2017, 14:15
IDENTIFICATION DIVISION
Kuk
Administrador
ENVIRONMENT DIVISION
Avatar de Kuk
DATA DIVISION
Forero desde (Registrado)enero 2015
España
UbicaciónMadrid
Edad33 años
Última Actividad13.12.2018 23:01
PROCEDURE DIVISION
PostsPosts: 1.319
Ha dicho GraciasEnviado: 280
Ha recibido agradecimientosRecibido: 480
ReputaciónReputación: 10
Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road Kuk is on a distinguished road
Predeterminado

Hrmcobol, aquí va el código y la DLL compilada:

Código CPP:
  1. #include <Windows.h>
  2. #include <Gdiplus.h>
  3.  
  4. #define DllExport __declspec( dllexport )
  5.  
  6. extern "C" {
  7.  
  8. DllExport void __stdcall ScreenShot(char*BmpName, HWND WndHwnd)
  9. {
  10.     RECT DesktopParams;
  11.     HDC DevC = GetDC(WndHwnd);
  12.     GetWindowRect(WndHwnd,&DesktopParams);
  13.     DWORD Width = DesktopParams.right - DesktopParams.left;
  14.     DWORD Height = DesktopParams.bottom - DesktopParams.top;
  15.  
  16.     DWORD FileSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+(sizeof(RGBTRIPLE)+1*(Width*Height*4));
  17.     char *BmpFileData = (char*)GlobalAlloc(0x0040,FileSize);
  18.  
  19.     PBITMAPFILEHEADER BFileHeader = (PBITMAPFILEHEADER)BmpFileData;
  20.     PBITMAPINFOHEADER  BInfoHeader = (PBITMAPINFOHEADER)&BmpFileData[sizeof(BITMAPFILEHEADER)];
  21.  
  22.     BFileHeader->bfType = 0x4D42; // BM
  23.     BFileHeader->bfSize = sizeof(BITMAPFILEHEADER);
  24.     BFileHeader->bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
  25.  
  26.     BInfoHeader->biSize = sizeof(BITMAPINFOHEADER);
  27.     BInfoHeader->biPlanes = 1;
  28.     BInfoHeader->biBitCount = 24;
  29.     BInfoHeader->biCompression = BI_RGB;
  30.     BInfoHeader->biHeight = Height;
  31.     BInfoHeader->biWidth = Width;
  32.  
  33.     RGBTRIPLE *Image = (RGBTRIPLE*)&BmpFileData[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
  34.     RGBTRIPLE color;
  35.  
  36.     HDC CaptureDC = CreateCompatibleDC(DevC);
  37.     HBITMAP CaptureBitmap = CreateCompatibleBitmap(DevC,Width,Height);
  38.     SelectObject(CaptureDC,CaptureBitmap);
  39.     BitBlt(CaptureDC,0,0,Width,Height,DevC,0,0,SRCCOPY|CAPTUREBLT);
  40.     GetDIBits(CaptureDC,CaptureBitmap,0,Height,Image,(LPBITMAPINFO)BInfoHeader, DIB_RGB_COLORS);
  41.  
  42.     DWORD Junk;
  43.     HANDLE FH = CreateFileA(BmpName,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,0,0);
  44.     WriteFile(FH,BmpFileData,FileSize,&Junk,0);
  45.     CloseHandle(FH);
  46.         GlobalFree(BmpFileData);
  47. }
  48.  
  49. } //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:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01  PrinScreen  PIC X(50)  VALUE "ScreenShot".
  5.  01  WsPath      PIC X(250).
  6.  01  FrmHWND     PIC S9(9) COMP-5.
  7.  PROCEDURE       DIVISION.
  8.      
  9.      MOVE "hwnd" OF POW-SELF TO FrmHWND
  10.      MOVE "C:\001.BMP"       TO WsPath
  11.      
  12.      CALL PrinScreen WITH STDCALL USING BY REFERENCE WsPath
  13.                                         BY VALUE FrmHWND
Archivos Adjuntos
Tipo de Archivo: rar PrintScreen.rar (30,8 KB, 18 descargas)


NORMAS DEL FORO - obligatorias de conocer para TODOS.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale Pinchando en su Nick:

Kuk no ha iniciado sesión   Responder Con Cita
Han dicho Gracias: 2
Adrianeloy (14 de marzo de 2017), Nitzer (15 de marzo de 2017)
Respuesta

Tags
bmp , c++ , cpp , dll , jpeg , jpg , pantallazo , png , printscreen


Usuarios activos actualmente viendo este tema: 1 (0 miembros y 1 visitantes)
 
Herramientas

Derechos de Publicación
No puedes publicar nuevos temas
No puedes publicar posts/responder
No puedes adjuntar archivos
No puedes editar tus posts

BB code is habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado



La franja horaria es GMT +1. Ahora son las 18:06.
Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2018, Jelsoft Enterprises Ltd.