2013-04-30 48 views
0

我有一個自我註冊安裝在程序文件的文件夾中的COM可見dll(C++)以及appref-ms文件,該文件指向一次點擊應用程序。這個DLL的目的是允許從Windows資源管理器中的右鍵單擊菜單啓動一次點擊應用程序。獲取DLL路徑/字符串問題(C++初學者)

我正在修改現有代碼,它只使用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(); 

這幾乎可以工作,但驅動器號每次都是不同的。例子:

{:\項目\ MyAppName \ 64 \發佈 E:\項目\ MyAppName \ 64 \發佈 ○:\項目\ MyAppName \ 64 \發佈

有時是一個新行後:沒有信。

另一個問題:我持有啓動字符串在類成員wchar_t m_Launch[MAX_PATH*10]。由於我不知道用戶會選擇多少文件,有沒有辦法動態調整它的大小?

回答

1

函數DLLFolder()返回臨時對象。當你得到一個指向它的數據的指針時(通過folder = DLLFolder().c_str()),你得到了一個指向符號數組的指針,當將調用wstring的析構函數(它將在下一行)時,它將被銷燬。該解決方案是:

  1. 不要一個指針,但使用的wstring副本:

    std::wstring folder = DLLFolder();

  2. 轉發函數指針,需要它,在同一呼叫:

    do_smth_with_dll_folder(DllFolder().c_str())

+0

謝謝您已經很清楚的解釋,這解決了這個問題。 – Coder1095 2013-04-30 10:04:22