Autor Wątek: Niezalezne od platformy uruchamianie aplikacji  (Przeczytany 1420 razy)

Offline rastabaddon

  • Użytkownik

# Styczeń 19, 2013, 19:40:12
Ponieważ jestem strasznym leniem, i podczas pisania kodu mulit-platformowego strasznie mnie irytowało ze za każdym razem aby uruchomić kod pod dana platformę musiałem wchodzić do odpowiedniego katalogu z aplikacja napisana na dana platformę i stamtąd ja uruchamiać. Pomyślałem sobie ze fajnie by było jak bym mógł uruchamiać aplikacje z jednego folderu i jednego plik. np. run.cmd i skrypt by rozpoznawał jaka to platforma i uruchamiał odpowiednia wersje dla windows/linuxa etc.

Tak wiec, pomysł wydal mi się ciekawy, wiec zacząłem grzebać w internecie nad jakimś miedzy-platformowym sposobem uruchamiania aplikacji i niestety nic ciekawego nie znalazłem.

Szukałem dalej, wiedziałem ze mogę korzystać tylko z dostępnego zestawu aplikacji na każdą platformę bez zmuszania użytkownika do instalacji czegokolwiek.

Związku z tym Java  odpada bo trzeba mieć ja zainstalowana.

I rozwiązałem to w następujący sposób który publikuje tutaj, bo być może się on komuś przyda, np wrzucamy plik na cd, i bez względu na jakim platformie zostanie to odpalone skrypt uruchomi odpowiednie binarki lub może ktoś ma lepszy pomysł.

A wiec przejdźmy do sedna:

Tworzymy 3 pliki w katalogu glownym naszego pakietu

run.cmd
#!/bin/sh
./.linux.sh
%cp%=for /f %%i in ("%0") do set curpath=%%~dpi
call=%curpath%.windows.cmd %curpath%

.linux.sh
#!/bin/sh
clear
cd bin/linux/
./run
exit

.windows.cmd
cls
cd /d %1%/bin/windows
CALL  %1%bin\windows\run.exe
exit

Nastepnie tworzymy i kompilujemy to dla windowsa i lunuxa:

plik: run.cpp

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <cstring>

using namespace std;



#ifdef _WIN32

#include <windows.h>
#include <tchar.h>

#include <direct.h>
#define GetCurrentDir _getcwd

typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);

LPFN_ISWOW64PROCESS fnIsWow64Process;

BOOL is64()
{
BOOL bIsWow64 = false;

fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
GetModuleHandle(TEXT("kernel32")),"IsWow64Process");

if(NULL != fnIsWow64Process)
{
if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
{
//handle error
bIsWow64 = false;
}
} else {
bIsWow64 = false;
}

return bIsWow64;
}

static bool setLibPath(const char * path)
{
return true;
}

#define _32BITEXE "32\\plik_32.exe"
#define _64BITEXE "64\\plik_64.exe"
#define _64BITLIB "64\\"
#define _32BITLIB "32\\"

#else

#include <unistd.h>
#define GetCurrentDir getcwd

static bool is64(void)
{
    FILE *fp=NULL;
    char cb64[3];

    fp = popen ("getconf LONG_BIT", "r");
    if (!fp)
       return false;

    if (!fgets(cb64, 3, fp))
        return false;

    if (!strncmp (cb64, "64", 3)) {
        return true;
    }
    else {
        return false;
    }
}

static bool setLibPath(const char * path)
{

setenv("LD_LIBRARY_PATH",path, 1);
return true;
}

#define _32BITEXE "32/plik_32"
#define _64BITEXE "64/plik_64"
#define _64BITLIB "64/"
#define _32BITLIB "32/"

#endif


int main(int argc, char *argv[]) {

cout << "Running..." << endl;


char cCurrentPath[FILENAME_MAX];
GetCurrentDir(cCurrentPath, sizeof(cCurrentPath));
cCurrentPath[sizeof(cCurrentPath) - 1] = '\0';
chdir (cCurrentPath);


if(is64())
{


setLibPath(_64BITLIB);

system(_64BITEXE);

} else {

setLibPath(_32BITLIB);
system(_32BITEXE);
}
return 0;
}

Uwagi:
- Plik run.cmd musi mieć zaznaczone do wykonania pod linuxem
- Plik run.exe/run wykrywa wersje systemu 32/64 i (run) ustawia ścieżkę dla bibliotek linuxa
- pliki zaczynajace sie od . nie sa wyswietlane pod windows7 i linuxem (nie jestem pewien jak to wyglada na innych wersjach windowsa)

To jest strasznie pisane na brudno, w celu sprawdzenia czy tak mozna i zademonstowania pomyslu.
Ciekaw jestem co o tym myślicie.


Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Rokuzo

  • Użytkownik
    • Masz na sprzedaż klucze do cs go?

# Styczeń 19, 2013, 20:50:30
Dużo zachodu, lepiej zrobić już aplikacje w Javie i przygotować tak instalator programu, że pozwala zainstalować od razu jej środowisko :)

Offline Shusty

  • Użytkownik

# Styczeń 20, 2013, 00:53:43
c++ redistributable 2008 Też trzeba zainstalować.

Java wg mnie to bardzo dobry pomysł, zrzucasz na nią wieloplatformowość i korzystasz z języka, którym należy się posłużyć w takim przypadku.

Offline nembutal

  • Użytkownik

# Styczeń 20, 2013, 03:33:51
c++ redistributable 2008 Też trzeba zainstalować.
Nie trzeba. Można statycznie linkować.

Java wg mnie to bardzo dobry pomysł, zrzucasz na nią wieloplatformowość i korzystasz z języka, którym należy się posłużyć w takim przypadku.
Zmiana języka z takiego powodu jak sposób uruchomienia aplikacji to jakiś koszmar.

Dużo zachodu, lepiej zrobić już aplikacje w Javie i przygotować tak instalator programu, że pozwala zainstalować od razu jej środowisko :)
Chyba nigdy nie pisałeś instalatorów. Samo zapoznanie się z pisaniem instalatora do Windows to cholernie dużo czasu, a dla Linuxa wypadałoby przygotować pakiety dla kilku najważniejszych dystrybucji.

Cytat: rastabaddon link=topic=26751.msg308702#msg308702
Ciekaw jestem co o tym myślicie.
Nie siedzę w temacie ale takie podejście ma swoje zastosowania:
http://blog.linuxgamepublishing.com/2009/11/24/playing-well-with-distros/