C++ CreatProcess

C++ CreatProcess
2011-07-06T20:08:25+02:00
2011-07-18T21:46:21+02:00
2022-11-22T12:45:39+01:00
Szombati.Peter
Sziasztok

Webböngészőből szeretnék elindítani egy C# alkalmazást string paraméterrel.
A kommunikáció köztes rétege egy NPAPI plugin.

BROWSER javasript (string paraméter) => NPAPI C++ (string paraméter) => ALKALMAZÁS C#

Az npapi plugint legeneráltam Firebreath-tel.
Itt kezdődnek a gondjaim. Nulla c++ tudással nem tudok implementálni egy egyszerű CreatProcess metódust.

A metódus implemetálásához "Step-By-Step tutorial for dummies" –ra lenne szükségem.


A függvényt a következő osztályba kell implementálni. TestPlugin.cpp
Ha valakinek ez segít a következő C# metódust kellene lefordítani C++-ra.


public void CreatProcess(string p) { string filePath = Environment.GetFolderPath(System.Environment.SpecialFolder.CommonProgramFiles); filePath = Path.Combine(filePath, @"\MyProgramm\app.exe"); Process process = new Process(); process.StartInfo.Arguments = p; process.StartInfo.FileName = filePath; process.Start(); }
Mutasd a teljes hozzászólást!
Szia!

Itt van néhány módja a processz indításának:
process start

Te esetedben valahogy így lehetne a függvényedet átírni c++-ra:
void CreatProcess(TCHAR *p) { TCHAR filePath[MAX_PATH]; SHGetSpecialFolderPath(0, filePath, CSIDL_PROGRAM_FILES, FALSE ); _tcsncat(filePath, _T("\MyProgramm\app.exe"), MAX_PATH) ShellExecute(0, _T("open"), filePath, p, 0, SW_SHOW); }

Nem tudom, működik-e, mert nincs itthon visual studiom, hogy kiprobáljam. Érdemes még olvasni ezekről az API-król az MSDN-en. Továbbá a fenti kód nem tartalmaz hibakezelést sem, azt is érdemes még beletenni.
Mutasd a teljes hozzászólást!

  • Szia

    Először is bocsánatot kérek hogy ilyen későn reagálok.

    Sajnos nem működik a plédprogram, és azok sem amiket az általad linkelt oldalon bemutatnak. Ennek egyetlen oka van, hogy teljesen hülye vagyok a c++-hoz. Ez a probléma rávilágít arra, hogy tetszik, nem tetszik, el kell kezdenem tanulni c++-t. Úgyhogy egyelőre jegelem a fenti problémát és visszaülök az "iskolapadba".

    Köszönöm segítségedet
    Üdv Péter.
    Mutasd a teljes hozzászólást!
  • Szia!

    Az hogy "nem működik", miben nyilvánul meg? Fordítási hibák vannak? Vagy a fordítás még megy, de amikor az egészet összerakod, akkor valamiért nem fut le rendesen?

    Esetleg megpróbálhatsz egy konzolos applikációt csinálni a Visual c++ varázslójával, és úgy berakosgatni a függvényeket, és megnézni ott mit csinál, és aztán beletenni ebbe a pluginbe.

    Szólj ha tudok valamit még segíteni!

    Üdv,
    Brokkoli
    Mutasd a teljes hozzászólást!
  • Szia

    Olyan problémák voltak például, hogy a metódusod paraméter típusát TCHAR, nem ismerte fel a fordító. De az a nagyobbik baj, hogy én sem értem ezt a szegyszerű metódust, így bármi probléma van, nem tudok belejavítani. Ezért írtam előbb, hogy nekiállok legalább a c++ alapjait megtanulni, hogy ilyen triviális problémák miatt ne keljen másokat nyaggatnom.
    Mutasd a teljes hozzászólást!
  • Szia!

    Néhány header kell még hozzá:

    SHGetSpecialFolderPath és ShellExecute függvényhez:
    #include "Shlobj.h" #include "Shellapi.h"

    a TCHAR-hoz:
    #include "tchar.h"

    és ez sem árt:
    #include "windows.h"

    Plusz javítás: a "_tcsncat" sor végén nincs pontosvessző, és a directory elválasztáshoz két db \ jel mindenhova, azaz:
    _tcsncat(filePath, _T("\\\MyProgramm\\app.exe"), MAX_PATH);

    Ezután fordulnia kell.

    Amúgy azért tűnik olyan bonyolultnak, mert ez így windowsos. Ennek egyszerűbb, talán kezdők számára érthetőbb változata:

    void CreatProcess(char p[]) { char filePath[MAX_PATH]; SHGetSpecialFolderPath(0, filePath, CSIDL_PROGRAM_FILES, FALSE ); strncat(filePath, "\\MyProgramm\\app.exe", MAX_PATH); ShellExecute(0, "open", filePath, p, 0, SW_SHOW); }

    Ez az egyszerűbb változat azonben unicode esetén nem jó, nem fog működni, ezért kell a másik változat.

    Magyarázat:
    1.sor: deklarálunk egy karakter tömböt (nagyjából string megfelelője csak c-ben)
    2.sor: lekérjük a progam files folder elérését
    3.sor: hozzáfűzzük a program files folderhez az app.exe-t
    4.sor elindítjuk

    Ugyanezt csinálja a bonyolultabb csak unicodeosan.

    Üdv,
    Brokkoli
    Mutasd a teljes hozzászólást!
  • Szia Brokkoli
    Bocsánat, hogy ekkora pinggel dolgozok, de úgy néz ki csak hétvégén tudok foglalkozni a projektemmel.
    Sajnos hibaüzenetet kapok a legutolsó példametódusnál is.

    void PluginTestAPI::Start(char p[])
    {
    char filePath[MAX_PATH];

    //Error1 error C2664: 'SHGetSpecialFolderPathW' : cannot convert parameter 2 from 'char [260]' to 'LPWSTR'
    SHGetSpecialFolderPath(0, filePath, CSIDL_PROGRAM_FILES, FALSE );

    strncat(filePath, "\MyProgramm\app.exe", MAX_PATH);

    //Error2 error C2664: 'ShellExecuteW' : cannot convert parameter 2 from 'const char [5]' to 'LPCWSTR'
    ShellExecute(0, "open", filePath, p, 0, SW_SHOW);
    }

    IntelliSense: argument of type "char *" is incompatible with parameter of type "LPWSTR"
    IntelliSense: argument of type "const char *" is incompatible with parameter of type "LPCWSTR"
    IntelliSense: argument of type "char *" is incompatible with parameter of type "LPCWSTR"
    IntelliSense: argument of type "char *" is incompatible with parameter of type "LPCWSTR"

    LPWSTR rá gugliztam, itt valami char string konverziót reklamál, ha jól értem, de ezzel sem jutottam tovább.

    És itt még egy probléma felvetődik!
    A fenti metódust javascript-ből kell hívnom, és vajon elfogadja a fenti char p[] paramétert?
    A firebreath-ben a példametódusok a következő képen néznek ki.

    // Method echo
    FB::variant PluginTestAPI::echo(const FB::variant& msg)
    {
    static int n(0);
    fire_echo(msg, n++);
    return msg;
    }

    a variant& msg valamiféle tömb vagy list osztály talán nekem is ezt kellene alkalmaznom

    Mutasd a teljes hozzászólást!
  • Szia!

    A 'W' az mindig a unicode-os string kezelésre utal (LPWSTR, SHGetSpecialFolderPathW, ShellExecuteW). Minden függvényből van kettő: az egyik a hagyományos nem unicode-os, pl. ShellExecuteA, és van ami unicode-os stringet kezel, pl. a ShellExecuteW. Valahogy úgy van megoldva, hogy ha unicode-os a projected, akkor a ShellExecute (se nem W, senem A nincs a végén) a ShellExecuteW-t fogja jelenteni, ha pedig nem unicode-os a project, akkor a ShellExecuteA-t fogja jelenteni. Itt most úgy látom, nincs szükség semmilyen string konverzióra.

    Két lehetőséged van a forditási hiba elkerülésére:
    1. kikapcsolod, hogy a projekt unicode-osan forduljon, ha minden igaz, akkor a Project Properties - General - Project Defaults - Character Set (bővebb infó itt: stackoverflow ) Ennek az lesz a hátránya, hogy a pl a "C:\nagybőgő" könyvtárat nem tudod majd megadni neki.
    2. használod azt a példámat, ahol a bemenő paraméter TCHAR *p.
    A kettő közül bármelyik működik, de sajnos nincs visual studiom, csak a melóhelyen, kipróbálni így nem tudom biztosan.

    Bár nem értek nagyon a javascripthez és a Firebreath egyáltalán nem, de a PluginTestAPI::echo(const FB::variant& msg) alapján valószínűleg ezt a CreateProcess eljárást nem tudod meghivni javascriptből. Valószínű az echo analogiajara meg kell a registerMethod-ot hivni erre, de így nem jó, mert a bemenő paraméternek TCHAR *p helyett "const FB::variant& p"-nek kell lennie. Arra kell valahogy rájönni, hogyan lehet TCHAR tömböt (vagy TCHAR* típust, esetleg char[]-t) csinálni az FB::variant-ból, ez a Firebreath doksijából talán kiderül.

    Üdv,
    Brokkoli
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd