time-killer-games Ответов: 1

Проблемы с созданием функции mac DYLIB for system()


Я пытаюсь написать DYLIB (в коде:: Blocks), который должен быть вызван из приложения Mac, которое просто вызывает стандартную функцию C system (), давая при этом возможность дождаться завершения во втором аргументе (1 или 0).

#import <pthread.h>
#import <stdlib.h>
#include <unistd.h>

extern "C"
{
    char *tfname;

    void *system_async(void *arg)
    {
        system(tfname);

        return NULL;
    }

    double ExecuteShell(char *fname,double wait)
    {
        pthread_t tID;
        tfname = fname;

        if (wait>=1)
        {
            system(fname);
        }
        else
        {
            pthread_create(&tID,NULL,&system_async,NULL);
            usleep(5000);
        }

        return 0;
    }
}

Теперь при вызове DYLIB (я не помню, какой компилятор я использовал, GCC или LLVM) я использую этот код в GameMaker Studio:

ExecuteShell('open /Applications/Calculator.app',0);

Однако калькулятор не запускается. Пытаюсь изменить второй аргумент на 1, и получаю тот же результат. Калькулятор не запускается. Никакая ошибка. Похоже, он игнорирует мой код все вместе, поэтому мне было интересно, не было ли что-то не так с тем, как я написал свой DYLIB.

Я смотрю на этот вопрос у кого-то еще был: ссылка.

string command = "open " + filePath;
system(command.c_str());

Я вижу, что они использовали .c_str (). Должен ли я использовать .c_str()? В этом-то и проблема? Код, который я использую прямо сейчас, - system (fname);. Должен ли я изменить это на system(fname.c_str ());? Это нормально, что я использую тип char * для аргумента fname? Или из-за того, что я использую этот тип, мне нужно привести/преобразовать его в строку типа?

Я использую чужой Mac, чтобы перенести этот мой небольшой проект для работы на Mac, во всяком случае, я пытаюсь получить помощь здесь, прежде чем пытаться построить его снова, потому что я пытаюсь свести к минимуму то, сколько я прошу использовать компьютер Mac моего друга. Надеюсь, что следующая сборка, которую я сделаю, с очень небольшой настройкой, наконец-то заработает и запустит калькулятор.

Заранее спасибо!

Что я уже пробовал:

#import <pthread.h>
#import <stdlib.h>
#include <unistd.h>

extern "C"
{
    char *tfname;

    void *system_async(void *arg)
    {
        system(tfname);

        return NULL;
    }

    double ExecuteShell(char *fname,double wait)
    {
        pthread_t tID;
        tfname = fname;

        if (wait>=1)
        {
            system(fname);
        }
        else
        {
            pthread_create(&tID,NULL,&system_async,NULL);
            usleep(5000);
        }

        return 0;
    }
}

1 Ответов

Рейтинг:
6

KarstenK

У тебя в сумке было правильное решение:

string command = "open " + filePath;
system(command.c_str());

должно быть, это правильно.

Вы должны указать правильный входной параметр для системного вызова. В конце концов, каждый указатель - это только область памяти. И такая память должна представлять правильные данные в правильном типе данных для функции. И есть разница между строкой Unicode и строкой ANSI. (Также в UTF-8). Посмотрите его в каком-нибудь виде памяти.

Читайте о функция c_str() чтобы понять, что он возвращает символ*.

Если вам нравится кодирование, купите Mac. Самый дешевый способ-это Mac mini. Дешевле при использовании. ;-)


time-killer-games

Спасибо! У меня было чувство, что это все, что мне нужно. Теперь, когда я это подтвердил, я обновлю сборку. Спасибо за все!