У меня есть функция API C ++, которая вызывается Install Shield через InstallScript:
SQLHELPER_API LPCSTR GetAvailableAppName(LPCSTR appNameP)
{
//return "this works just fine";
std::string newAppName = "I work, maybe?";
LPCSTR returnVal = newAppName.c_str();
return returnVal;
}
Единственное, что возвращает, это пустая строка. Если я просто верну значение, переданное в переменную «appNameP», то это тоже хорошо.
Моя главная проблема заключается в том, что мне нужно передать LPCSTR и выполнить с ним некоторые строковые операции.
LPCSTR
такой же как const char *
,
Передача строки в стиле C в виде вызова функции — это нормально.
Возврат указателя на локальную переменную функции не подходит, потому что эта локальная переменная больше не существует после завершения функции. Как только вы используете указатель в main
(или там, где функция была вызвана), она указывает на память, которая больше не принадлежит вам, и значение, возможно, уже изменилось.
Есть несколько возможностей, каждая из которых имеет свои недостатки:
Использование только памяти, которую вы получили в качестве параметра (например, appNameP
потому что это должно быть что-то извне и все еще будет существовать после завершения функции). Недостаток: вам нужно передать что-то подходящее для этой цели => сигнатуру функции или, по крайней мере, изменить требования к параметрам, и вы должны проверить / изменить способ его вызова.
Выделение чего-либо с new
, Недостаток: где-то позже, снаружи, delete[]
должен быть вызван.
Возвращая что-то вроде std::string
, Недостаток: как в # 1, сигнатура функции меняется, и вы должны изменить, как она вызывается.
Если InstallShield сам вызывает эту функцию:
То, что InstallShield ожидает от вас, должно быть где-то в документации.