Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Odpalanie programu B(z przekazną tablicą) przez program A (przekazujący tablice)

Ostatnio zmodyfikowano 2014-12-06 14:52
Autor Wiadomość
Hexbinary
Temat założony przez niniejszego użytkownika
Odpalanie programu B(z przekazną tablicą) przez program A (przekazujący tablice)
» 2014-11-29 20:50:03
Mój problem wygląda następująco. Chce po prostu wywołać inny program z tablicą przekazaną przez obecnie działający program.

C/C++
//PROGRAM A
#include <iostream>
#include <stdlib.h>
#include <windows.h>
int main() {
    char * str = "ZNAKIWTABLICY";
    char * a =( char * ) malloc( sizeof( char * 20 );
    memcpy( a, str, strlen( str ) );
    //wywołanie programu B umiem tylko bez przekazywania tablicy ShellExecute(0,0,0,"B.exe",0,0)
    //na linuxsie robiło się to jakoś chyba przy pomocy execl() ale mi chodzi o rozwiązanie pod windows
    return 0;
}
//PROGRAM B
#include <iostream>
int main( int argc, char * argv[], char * MojaTablica ) {
    std::cout << MojaTablica << "\n";
    return 0;
}
P-121713
NiceFox
» 2014-11-29 22:46:35
Może zapisz do pliku i odczytaj plik w B.
P-121722
Hexbinary
Temat założony przez niniejszego użytkownika
» 2014-11-30 11:27:59
To oczywiste rozwiązanie, lepiej by było użyć jakiegoś łącza miedzy procesami.
Ale mi nie o to chodzi na pewno da się wywołać jakoś funkcje z bufforem na linuxsie to leci tak. Przejrzałem archiwa.
C/C++
AAAAAAAAAAAAAAAAAAA
#include <stdlib.h>
int main( int argc, int * argv[] ) {
    char * buff = new char[ 20 ]; // to czymś tam wypłeniamy oczywiście
    execl( "./B", "B", buff, 0 );
}
BBBBBBBBBBBBBBBBBBBBB
#include <stdlib.h> // to chyba zbedne
#include <string.h> // tu jest chyba memcpy
int main( int argc, char * argv[] )
{
    char * buff = new char[ 500 ];
    memcpy( buff, argv[ 1 ], strlen( argv[ 1 ] ) );
    return 0;
}

Jak to zrobić na windows ????
P-121731
CodeMeister
» 2014-12-05 14:57:21
możesz użyć system() zamiast execl(), co prawda każdy odradza jego stosowanie ale do jakiegoś małego programiku nie zaszkodzi.
P-122256
Hexbinary
Temat założony przez niniejszego użytkownika
» 2014-12-05 19:55:21
Nie za bardzo wiem jak to przerobić na funkcje system ,bo nie znam poleceń systemowych windows.

doc
int system( const char * cmd )
http://cpp0x.pl/dokumentacja​/standard-C/system/458

A co jest w niej takiego złego. Twórcy softa boją się ,że jak ktoś znajdzie funkcje system() w programie, a potem jakimś cudem przejmie kontrole nad bufforem przekazanym do cmd, zapanuje nad system bo będzie mógł wywołać każde polecenie windows ??
P-122269
Kaikso
» 2014-12-05 22:07:33
Z funkcją system będzie to mniej więcej tak wyglądało:
C/C++
//Program A
#include <stdlib.h>
#include <stdio.h>
int main( int argc, int * argv[] ) {
    char * buff = new char[ 20 ];
   
    char * cmdline = new char[ 64 ];
    sprintf( cmdline, "B %s", buff );
    system( cmdline );
}
C/C++
//Program B
#include <string.h>
int main( int argc, char * argv[] )
{
    char * buff = new char[ 500 ];
    memcpy( buff, argv[ 1 ], strlen( argv[ 1 ] ) );
    return 0;
}
P-122286
Hexbinary
Temat założony przez niniejszego użytkownika
» 2014-12-06 10:09:06
Działa elegancko, a to innym pomoże zrozumieć czym jest argv.
C/C++
//Program A
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main( int argc, int * argv[] ) {
    printf( "Program A\n" );
    char * buff = new char[ 20 ];
    buff = "Przekaz mysli";
    char * cmdline = new char[ 64 ];
    * cmdline = 'B';
    ++cmdline;
    * cmdline = ' ';
    ++cmdline;
    memcpy( cmdline, buff, strlen( buff ) );
    cmdline--;
    cmdline--;
    printf( "%s\n", cmdline );
    //sprintf( cmdline, "B %s", buff );
    system( cmdline );
    return 0;
}

C/C++
//Program B
#include <string.h>
#include <stdio.h>
int main( int argc, char * argv[] )
{
    printf( "Program B\n" );
    char * buff = new char[ 500 ];
    memcpy( buff, argv[ 1 ], strlen( argv[ 1 ] ) );
    for( int i = 0; i < 4; i++ )
         printf( "argv[%d] %s\n", i, argv[ i ] );
   
    printf( "buff %s\n", buff );
    return 0;
}
P-122316
Kaikso
» 2014-12-06 14:52:41
Jeszcze poprawie trochę twój kod ;)

C/C++
//Program A
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main( int argc, char * argv[] ) {
    printf( "Program A\n" );
    char * buff = new char[ 20 ];
    //buff = "Przekaz mysli";
    //nie tak nadpisujesz buff wskaźnikiem do str
    strcpy( buff, "Przekaz mysli" ); //tak poprawnie :)
    char * cmdline = new char[ 64 ];
    * cmdline = 'B';
    ++cmdline;
    * cmdline = ' ';
    ++cmdline;
    //memcpy( cmdline, buff, strlen( buff ) );
    //tu też można użyć strcpy zamiast memcpy
    strcpy( cmdline, buff ); //bardziej czytelne i szybciej działa
    cmdline--;
    cmdline--;
    printf( "%s\n", cmdline );
    //sprintf( cmdline, "B %s", buff );
    system( cmdline );
    return 0;
}
P-122350
« 1 »
  Strona 1 z 1