【问题标题】:How do I pass a LPCSTR to a c++ function convert to string and return a LPCSTR?如何将 LPCSTR 传递给 c++ 函数转换为字符串并返回 LPCSTR?
【发布时间】:2015-08-12 21:49:14
【问题描述】:

我有一个由 Install Shield 通过 InstallScript 调用的 C++ API 函数:

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 并对其执行一些字符串操作。

【问题讨论】:

  • 在真空中我会说他们打算你在这里返回一个字符串文字

标签: c++ string installshield installscript lpcstr


【解决方案1】:

LPCSTRconst char * 相同。

将这样的 C 风格字符串传递给函数调用很好。

返回一个指向局部函数变量的指针是不行的,因为这个局部变量在函数结束后就不再存在了。只要您在main(或调用该函数的任何位置)中使用指针,它就会指向不再属于您的内存,并且值可能已经更改。

有几种可能,每种都有缺点:

  1. 只使用你获得的内存作为参数(例如appNameP,因为这必须是来自外部的东西,并且在函数结束后仍然存在)。缺点:您需要传递适合该目的的东西=>函数签名或至少更改参数的要求,并且您必须检查/更改它的调用方式。

  2. 使用new 分配一些东西。缺点:稍后,在外面,delete[] 必须被调用。

  3. 返回类似std::string 的内容。缺点:和 #1 一样,函数签名发生了变化,你必须改变它的调用方式。

如果 InstallShield 自己调用这个函数:

InstallShield 期望您执行的操作应该在文档中的某处。

【讨论】:

  • 另一种选择是在函数内部声明一个静态对象,这样函数返回时它就不会超出范围。例如:static std::string newAppName;newAppName = std::string("New ") + appNameP;return newAppName.c_str();
  • @DanKorn 如果您的函数是从外部代码调用的,而不是由您控制的,那么这是个坏主意。 a) 多次调用函数,保存每一个返回的指针,然后开始使用数据,是不行的。 b) 多线程...
  • 是的,该选项有其缺点,其他选项也是如此。尽管如此,它仍然是一种选择。至于多线程,绝对没有什么可以阻止指向另一个线程拥有的 char 缓冲区的指针首先传递给函数。但无论如何,从单独的线程调用诸如 InstallShield 安装程序中的此类函数的可能性很小。
  • 尽管如此,您的选项“A”通常被认为是在 C 中处理此类事情的最安全方法。(许多 Windows API 函数都以这种方式工作。)在 C++ 中,回答“C”应该在大多数情况下是安全的。
猜你喜欢
  • 2010-12-11
  • 2012-09-16
  • 2011-12-24
  • 2013-11-05
  • 2012-07-26
  • 2011-07-23
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多