0

我在 Program Files 的文件夹中安装了一个自注册 COM 可见 dll (C++),以及一个指向单击一次应用程序的 appref-ms 文件。此 dll 的目的是允许单击一次应用程序从 Windows 资源管理器中的右键菜单启动。

我正在修改专门使用 wchar_t* 来保存字符串的现有代码,而且我对 C++ 的经验非常有限。我正在使用以下内容获取包含 dll 和 appref-ms 的文件夹的路径。

std::wstring DllFolder() {
    wchar_t buffer[MAX_PATH];
    GetModuleFileName( (HINSTANCE)&__ImageBase, buffer, MAX_PATH );
    std::wstring::size_type pos = std::wstring( buffer ).find_last_of( L"\\/" );
    return std::wstring( buffer ).substr( 0, pos);
}

...

const wchar_t* folder = DllFolder().c_str();

这几乎可以工作,但驱动器号每次都不同。例子:

{:\Projects\MyAppName\x64\Release e:\Projects\MyAppName\x64\Release O:\Projects\MyAppName\x64\Release

有时在 : 之后有一个新行并且没有字母。

另一个问题:我将启动字符串保存在 class memberwchar_t m_Launch[MAX_PATH*10]中。由于我不知道用户会选择多少个文件,有没有办法动态调整它的大小?

4

1 回答 1

1

函数DLLFolder()返回临时对象。当你得到一个指向它的数据的指针(通过folder = DLLFolder().c_str())你得到一个指向符号数组的指针,当调用析构函数时它将被销毁wstring(它将在下一行)。解决方案是:

  1. 不要获得指针,而是使用以下副本wstring

    std::wstring folder = DLLFolder();

  2. 在同一个调用中转发指向需要它的函数的指针:

    do_smth_with_dll_folder( DllFolder().c_str() )

于 2013-04-30T09:46:32.737 回答