[ idb @ 25.11.2003. 13:56 ] @
Potrebno mi je da iz Windows aplikacije, pozovem program Sodipodi koji bi trebao da ucita neki SVF fajl i da ga prikaze.
Mogu to da uradim uz pomoc Internet Explorera, ali on ima problema kod stampanja....
Sodipodi je pisan uz pomoc Gtk+, pa ne znam kako da mu prosledim parametar (ovde bi to bilo ime fajle).
Probao sam direktno iz komandne linije, medjutim Sodipodi izgleda uopste ne uzima u obzir argumente koji mu se proslede, jer sta god da mu stavis kao argument on samo otvori glavni widget i nista vise (cak ni gresku ne prijavi).

Iz mog programa sam probao fje ShellExecute i CreateProcess, ali ni to ne pomaze.

Ima li neki iskusni Gtk+ programer da mi ponudi neko resenje?

Ako se neko pita zasto koristim bas Sodipodi, tri su glavna razloga:
- editor vektorske grafike, pa korisnik moze doda i nesto svoje na vec gotov crtez
- License: GNU General Public License (GPL), Public Domain (znaci moze se besplatno koristiti)

Sledi deo koda test aplikacije, koja bi trebala da pozove Sodipodi i ucita fajlu MojaSVG.SVG.

Code:

//Dlg_Test.cpp
#include <windows.h>
#include "dlg_test.h" 
using namespace std;
char SvgFile[256], SodipodiPath[256], ExtProg[256];
BOOL CALLBACK DlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
  switch(Message)
  {
    case WM_INITDIALOG:
      strcpy(SvgFile,"D:\\CppRadni\\DLG_Test\\MojaSVG.SVG");
      strcpy(SodipodiPath,"C:\\Program Files\\Sodipodi\\bin\\");
      strcpy(ExtProg,SodipodiPath);  strcat(ExtProg,"Sodipodi.exe");  
    break;
    case WM_COMMAND:
      switch(LOWORD(wParam))
      {
        case IDC_BUTT1:
        {
          ShellExecute(hwnd, "open", "IEXPLORE.EXE", SvgFile,NULL,SW_SHOWNORMAL);
          // ovo radi kako treba
        }
        break;
        case IDC_BUTT2:
        {
          SetCurrentDirectory(SodipodiPath); // da bi se glavni Widget pravilno iscrtao
          ShellExecute(hwnd, NULL, ExtProg, NULL,NULL,SW_SHOWNORMAL);
          //ovo samo startuje Sodipodi, bez obzira sta mu stavim za cetvrti argument
        }
        break;
        case IDC_BUTT3:
          SetCurrentDirectory(SodipodiPath); // da bi se glavni Widget pravilno iscrtao
          { // ovo parce je modifikovani kod sa MSDN:
            // http://msdn.microsoft.com/libr...oc/base/creating_processes.asp
              STARTUPINFO si;
              PROCESS_INFORMATION pi;
              ZeroMemory( &si, sizeof(si) );
              si.cb = sizeof(si);
              ZeroMemory( &pi, sizeof(pi) );
              // Start the child process. 
              if( !CreateProcess(ExtProg, NULL, NULL, NULL, false, 0, NULL, NULL, &si, &pi )) 
                  MessageBox(hwnd, "NESTO SAM POGRESIO", "PORUKA", MB_OK);
          
              // Wait until child process exits.
                //WaitForSingleObject( pi.hProcess, INFINITE );
              // Close process and thread handles. 
              CloseHandle( pi.hProcess );
              CloseHandle( pi.hThread );
              //ovo samo startuje Sodipodi, bez obzira sta mu stavim za drugi argument
          }
        break;
      }
    break;
    case WM_CLOSE:
      EndDialog(hwnd, 0);
    break;
    default:
      return false;
  }
  return true;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
  return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc);
}


Inace radim pod Windows2000 i sa Dev-Cpp 4.9.8.4 with Mingw/GCC 3.2
[ leka @ 25.11.2003. 14:48 ] @
Sodipodi je IMHO jedan od najboljih SVG editora. Ali to je sada nebitno. Ja sedoh malopre Za ovu Windows masinu i pokusah da startujem sodipodi sa opcijama (Windows 2000). Izgleda da ne radi! Na sajtu sam nasao da sodipodi --help daje spisak opcija - ali ne... sodipodi --help prosto startuje sodipodi!

Da to radi onda bi radilo i nesto tipa
Code:

#include <windows.h>
#include <process.h>
int main(int argc, char** argv)
{
  execlp("C:\\GNU\\sodipodi\\sodipodi.exe", "sodipodi.exe", "U:\\art\\rtk.svg", NULL);
  return 0;
}
[ idb @ 25.11.2003. 15:00 ] @
Citat:
Izgleda da ne radi! Na sajtu sam nasao da sodipodi --help daje spisak opcija - ali ne... sodipodi --help prosto startuje sodipodi!

Tako je Leko i ja sam to bio nasao i obradovao se, ali mrka kapa.
[ leka @ 26.11.2003. 13:37 ] @
Nije "izgleda" vec 100% ne radi. :)
[ idb @ 16.12.2003. 10:18 ] @
Po onoj narodnoj "Kad se ja veselim, neka se svi vesele"
Izašla je nova verzija Sodipodi 0.33beta. Za mene je najvažnija novina je da podržava Unicode i da mogu programu da prosledim argument sa imenom fajle koju treba da otvori!
Treba preuzeti Windows 2000/XP binary package (http://sourceforge.net/project/showfiles.php?group_id=4054), on podrzava Unicode
Program koji sam predhodno napisao pretrpeo je manje izmene:
Code:

.
.
case WM_INITDIALOG:
   strcpy(SvgFile,"D:\\CppRadni\\DLG_Test\\MojaSVG.SVG"); 
   strcpy(SodipodiPath,"C:\\Program Files\\Sodipodi\\");   // PROMENJENO! Nov Path izvrsnog fajle sodipodi.exe
   strcpy(ExtProg,SodipodiPath);  strcat(ExtProg,"Sodipodi.exe");  
break;
.
.
.
   case IDC_BUTT2:
   {
      SetCurrentDirectory(SodipodiPath); // da bi se glavni Widget pravilno iscrtao
      ShellExecute(hwnd, "open", ExtProg, SvgFile,NULL,SW_SHOWNORMAL);    // PROMENJENO!
   }
   break;
.
.
.

opciju case IDC_BUTT3: nisam proveravao.

Predpostavljem da se problem mogao resiti kao u programu gimp-win-remote (http://sourceforge.net/projects/gimp-win-remote/) koji poktece GIMP i prosledjuje mu ime fajle koju treba otvoriti (Predpostavljam posto su oba radjena u Gtk).

Deo ekipe koji je razvijao Sodipodi se odvojio i radi novi projekt Inkscape http://www.inkscape.org/
Zasto su to uradili moze se videti na njihovom sajtu, ali programi izgledaju veoma slicno, mada Inkscape jos uvek ne podrzava Unicode.
[ leka @ 17.12.2003. 08:07 ] @
Kako tipicno... Nikako narod da skapira da je forkovanje projekata najveci neprijatelj opensource razvoja... Naravno, nekad je to dobro, ali uglavnom nije.