domingo, 6 de fevereiro de 2022

Retornando matriz de string em dll

Passado muitos dias sem programar,
por falta de tempo e por principalmente
por um problema que nos forçou a parar,
resolvi no tempo curto verificar alguns
fóruns de programação, e me vi motivado
por uma pergunta feita por um membro que
pedia um exemplo de retorno de uma matriz
de string para uso em outros arquivos.
Mesmo não respondendo, resolvi criar uma 
versão, mas diferente do que ele pediu,
nesta versão a matriz de string é retornada
numa dll, e o programa usado para criar a dll
foi o Visual studio 2019 na opção:
Biblioteca de Vínculo Dinâmico (DLL).
Mas nós poderíamos usar até mesmo o bloco
de notas para fazer isto e compilar com
uma linha de comando utilizando o gcc.
Segue os códigos para criação da dll,
como para sua chamada no link abaixo,
o que para nós não é nenhuma novidade
para outros que estão iniciando pode ser 
de grande ajuda, então tudo em seu tempo,
porque quem de nós nunca passou por isto?





Códigos para criação da dll:
#include "pch.h"
#include <Windows.h>
#include <iostream>

#define tam 12

using namespace std;

#ifdef RETMATSTRINGDLL_EXPORTS
#define RETMATSTRINGDLL_API extern "C" __declspec(dllexport)
#else
#define RETMATSTRINGDLLDLL_API __declspec(dllimport)
#endif

//===================================================================================
RETMATSTRINGDLL_API const char** Retorna_Matriz_SWtring ( int* len ) {

    CString str_1 = _T ( "" );
    const char** arr;
    arr = ( const char** ) malloc ( tam * sizeof ( const char* ) );

    const char* ve_t [ ] = {
            "No Meio do Caminho",
            "Carlos Drummond de Andrade",
            "No meio do caminho tinha uma pedra",
            "Tinha uma pedra no meio do caminho",
            "Tinha uma pedra",
            "No meio do caminho tinha uma pedra.",
            "Nunca me esquecerei desse acontecimento",
            "Na vida de minhas retinas tão fatigadas.",
            "Nunca me esquecerei que no meio do caminho",
            "Tinha uma pedra teste teste teste",
            "Tinha uma pedra no meio do caminho",
            "No meio do caminho tinha uma pedra." };

    int i, j;

    for ( i = 0; i < tam; i++ ) {
        arr [ i ] = ( char* ) malloc ( tam );
        arr [ i ] = ve_t [ i ];
        *len = *len + 1;
    }
    return arr;
}
//===================================================================================

Códigos para chamar a dll


#include <windows.h>
#include <iostream>
#include <conio.h>

#define tam 12
#define MYDLL "Ret_Mat_String_DLL.dll"

void Janela ( ) {
	 int l, c;
	 for ( l = 1; l <= 30 ; l++ ) {
         for ( c = 1; c < 80 ; c++ ) {
              gotoxy ( c , l );
			  if ( l == 2 ) {
				   cprintf ( " " );
			  }
			  if ( c == 1 ) {
				   cprintf ( "  " );
              }
              if ( c == 79 ) {
				   textattr ( 200 );
				   cprintf ( "  " );
			  }
		 }
	 }
}

//------------------------------------------------------------------------------
void Informe ( ) {
     textbackground ( BLACK );
     textcolor ( LIGHTBLUE );
	 gotoxy ( 26, 19 );
	 cprintf ( "Por: " );
	 textcolor ( LIGHTMAGENTA );
	 cprintf ( "Samuel Lima" );
     textcolor ( WHITE );
	 gotoxy ( 26, 20 );
	 cprintf ( "sa_sp10@hotmail.com" );
     Sleep ( 1800 );
	 textcolor ( LIGHTRED );
	 gotoxy ( 37, 23 );
	 cprintf ( "MUITO OBRIGADO" );
}
//------------------------------------------------------------------------------
int main ( ) {
    system ( "title RETORNANDO MATRIZ DE STRING EM DLL" );
    
     textcolor ( LIGHTRED );
	 gotoxy ( 20 , 3 );
	 cprintf ( "RETORNANDO MATRIZ DE STRING EM DLL" );

    int i, len = 0;
    const char **( WINAPI * Retorna_Matriz_SWtring ) ( int *len );

    HINSTANCE hDll;
    hDll = LoadLibrary ( MYDLL );
    if ( !hDll ) {
        printf ( "Não foi possível carregar a dll" );
        exit ( 1 );
    }
    Retorna_Matriz_SWtring = ( const char ** ( WINAPI* ) ( int *len ) ) GetProcAddress ( hDll, "Retorna_Matriz_SWtring" );

    const char** arr = Retorna_Matriz_SWtring ( &len );
    std::cout << std::endl;

    for ( i = 0; i < len; i++ ) {
        gotoxy ( 20, i + 5 );
        std::cout << arr [ i ] << std::endl;
    }
    
    Janela ( );
    Informe ( );
    
    getche ( );
    
    return 0;
}

//===================================================================================