我正在制作一個嚴重依賴于另一個 C 二進制檔案的程式。由于我不想學習如何使用標頭以及尚未學習的內容,因此我想采取簡單的方法,只需從我的 cpp 程式的同一檔案夾中運行預編譯的二進制檔案。
現在,我的檔案夾是這樣設定的:它有main.cpp、CMakeLists.txt和ibootim二進制檔案。在里面main.cpp,我該怎么稱呼ibootim?
從 python 編碼中,它告訴我我應該能夠運行
system("./ibootim");
但這不起作用。終端告訴我沒有找到檔案。顯然,如果我將整個路徑放入該二進制檔案,它將起作用。但是,如果其他用戶要下載此檔案,則對他們不起作用,因為他們沒有與我相同的計算機、用戶名等。
所以我的第一個問題,我主要關心的是:
您如何在 c 程式中運行位于同一目錄中的另一個二進制檔案?
如果由于某種原因這不可能,那么我可以嘗試從源代碼下載 ibootim 并可能使用頭檔案:
如何在 C 程式中從 C 頭檔案執行代碼?
uj5u.com熱心網友回復:
對于 Windows,GetModuleFileNameW()即使作業目錄與 exe 的目錄不同,您也可以使用它來獲取正在運行的 exe 的絕對路徑。然后,您可以使用PathRemoveFileSpecW()從路徑中洗掉檔案名以獲取 exe 的目錄路徑。然后,您可以使用ShellExecuteW()所需的檔案名啟動 exe,同時告訴函式在哪個目錄中查找 exe。
這是一個命令列示例:
#include <windows.h>
#include <shlwapi.h>
#include <iostream>
#include <string>
#include <cwchar>
#include <cstdlib>
#include <cstdint>
#include <stdexcept>
#include <clocale>
using namespace std;
wstring get_exe_dir() {
wchar_t buffer[65537] = {L'\0'};
if (!GetModuleFileNameW(NULL, buffer, sizeof(buffer))) {
MessageBox(NULL, "GetModuleFileNameW length error", "EXE path is too long!", MB_OK);
throw length_error("");
}
wcout << buffer << L'\n';
PathRemoveFileSpecW(buffer);
wcout << buffer << L'\n';
return buffer;
}
int main() {
setlocale(LC_CTYPE, ".OCP");
const wstring exe_dir = get_exe_dir();
const intptr_t result = reinterpret_cast<intptr_t>(ShellExecuteW(NULL, L"open", L"\"other.exe\"", NULL, exe_dir.c_str(), SW_SHOWNORMAL));
if (result < 33) {
MessageBox(NULL, "Error launching other.exe", "Launch error", MB_OK);
return EXIT_FAILURE;
}
}
// g -Wall -Wextra exe_path.cc -o exe_path -O3 -s -lshlwapi
也許 Mac 也有類似的功能。我看到_NSGetExecutablePath()。對于shellExecute(),我看到這個答案可能會有所幫助。但是,system()在 Mac 上可能沒問題,因為它不會像在 Windows 上那樣產生另一個終端視窗。
uj5u.com熱心網友回復:
在 C 中,如果你想使用二進制檔案,你可以使用 std::system() 函式。
但要做到這一點,二進制檔案必須在 PATH 上。如果您的二進制檔案不在路徑上,您可以執行類似的操作。
#include <iostream>
int main(){
#if WIN32
std::system("cmd.exe", "/c", "./mybinarie.exe");
#else
std::system("bash", "-c", "./mybinarie");
#endif
return 0;
}
使用 std::system 啟動 shell 將確保您在作業檔案夾中,并且如果二進制檔案在作業檔案夾中,它應該可以作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/517835.html
