2014-07-16 45 views
0

我的代碼在C++中,我要口在Java中的一部分:移植GetModuleFileName在Java中

GetModuleFileName(AfxGetInstanceHandle(),strPath.GetBuffer(MAX_PATH),MAX_PATH - 1); 
strPath.ReleaseBuffer(); 

我真的不知道如何去了解這一點。我在C++方面沒有太多經驗,特別是在windows函數方面。什麼我試圖創建業務邏輯是這樣的:

我們要創建或編輯HTML文件並將其保存爲:

strPath+"CaseRerorts.htm" 

代碼的C++方面的用途:

ofstream ofile(strPath, ios::trunc|ios::app, filebuf::sh_read);

然後在ofile上寫東西。

如果存在htm文件,則使用新文件覆蓋它。我想我將不得不使用OutputStream和PrinstStream。然而,主要問題是我不知道如何讓strPath與代碼的C++版本中的strPath相同。有任何想法嗎?謝謝。

+0

GetModuleFileName(AfxGetInstanceHandle(),...)只是返回當前可執行文件的標準路徑名。然後在同一個目錄中打開/創建osream(順便說一下,我不確定這是一個好主意,因爲路徑是exes存儲在原則上應該爲標準用戶進行復制保護)。 – Christophe

+0

您應該擁有看看這個現有的答案:http://stackoverflow.com/a/7603444/3723423然後這個工具類:http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html。但我強烈建議不要將該文件放在應用程序目錄中,而是放在用戶目錄或配置變量定義的目錄中。 – Christophe

回答

0

我最終沒有創造這個功能,但是從我發現了什麼,這是一種做的是問是通過使用:

servletRequest.getSession().getServletContext().getRealPath("/");

這不復制GetModuleFileName功能,但東西類似。

0

C++代碼似乎在調用提取當前正在運行的應用程序實例的「模塊文件名」的WinAPI函數。這不會直接轉化爲Java,因此您必須確定您將用作模擬的東西。

如果字符串必須與原始應用程序的某個特定實例生成的字符串完全匹配,那麼您可以簡單地對該值進行硬編碼。如果它必須更一般地複製原始的精神,那麼你將需要找出你想要使用的可執行文件名稱的類比(「java.exe」可能對此沒有用處)。也許main()方法是應用程序的起點的類的名稱是您想要的。如果您的應用程序是單線程的,那麼您可以通過生成並檢查堆棧跟蹤來獲取該信息,但否則可能需要爲保留該信息做一些準備,以便將來可以讀取該信息。