PDA

View Full Version : سوال: فراخوانی فایل exe از طریق ++c



vertionality
یک شنبه 04 شهریور 1397, 12:36 عصر
سلام

یک فایل exe دارم ، 2 ورودی دارد . چه جوری می تونم یک کد ++c بنویسم که هر وقت خواستم فایل exe را با ورودی های دلخواه

از طریق کد اجرا کنم بعد خروجی هایش را برگردونم ؟

اگر ورودی خروجی هم نبود اشکال ندارد فقط چه جوری باید از طریق کد ، دستور اجرای فایل exe را بدیم به صورت hidden .

ممنون

farhad_shiri_ex
یک شنبه 04 شهریور 1397, 13:50 عصر
سلام

یک فایل exe دارم ، 2 ورودی دارد . چه جوری می تونم یک کد ++c بنویسم که هر وقت خواستم فایل exe را با ورودی های دلخواه

از طریق کد اجرا کنم بعد خروجی هایش را برگردونم ؟

اگر ورودی خروجی هم نبود اشکال ندارد فقط چه جوری باید از طریق کد ، دستور اجرای فایل exe را بدیم به صورت hidden .

ممنون


#include <windows.h>
using namespace std;
int main()
{
system ("start C:\\Users\\Folder\\chrome.exe https://www.google.com"); ..
return 0;
}

البته فقط در ویندوز و ویژوال استودیو قابل استفاده است.
البته استفاده از این روش از نظر امنیت بسیار ضعیف هست! به راحتی می تونه برنامه شما را قابل هک کردن کنه ویا حتی آنتی ویروس ها هم میتونن به عنوان یک فایل مخرب شناسایی کنن!

روش دیگه خیلی امنتر و بهتر است...

#include <windows.h>

VOID startup(LPCTSTR lpApplicationName)
{
// additional information
STARTUPINFO si;
PROCESS_INFORMATION pi;

// set the size of the structures
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

// start the program up
CreateProcess( lpApplicationName, // the path
argv[1], // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi // Pointer to PROCESS_INFORMATION structure (removed extra parentheses)
);
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}


البته این روش هم باز در ویندوز و ویژوال استودیو قابل استفاده است.
در این روش هم سعی کنید برای امنیت بیشتر مقدار پارامتر lpApplicationName را null ست نکنید اگر هم خواستید که null ست کنید حتما در رشته ای که در پارامتر دوم به عنوان آرگومان خط فرمان برای نام برنامه وارد میکنید حتما نام فایل را در دابل کوتیشن قرار بدید.

و این روش هم هست...

#include <iostream>
#include <windows.h>

int main() {
ShellExecute(NULL, "open", "path\\to\\file.exe", NULL, NULL, SW_SHOWDEFAULT);
}

vertionality
شنبه 17 شهریور 1397, 17:40 عصر
اینا خیلی خوب بودن ، فقط ورودی هم میشه داد .

مثلا اگر برنامه 2 تا input میگیره ، بگیم وقتی اجرا میشه این 2 تا ورودی هم بهش بده .

ممنون ، بسیار عالی بودند

farhad_shiri_ex
شنبه 17 شهریور 1397, 18:01 عصر
اینا خیلی خوب بودن ، فقط ورودی هم میشه داد .

مثلا اگر برنامه 2 تا input میگیره ، بگیم وقتی اجرا میشه این 2 تا ورودی هم بهش بده .

ممنون ، بسیار عالی بودند

بله به دستورات ShellExecute و system که به راحتی می تونید پارامترهاتون را پاس بدید و CreateProcess هم که میتونید با استفاده از یک ساختار پارامترهاتون را پاس بدید

vertionality
شنبه 24 شهریور 1397, 14:38 عصر
من از روش سوم توی QT استفاده کردم ارور زیر را داد ،

خط سوم ارور هم کدی که نوشتم را نوشته :






D:\Project\QT\pj\res.cpp:11: error: cannot convert 'const char*' to 'LPCWSTR {aka const wchar_t*}' for argument '2' to 'HINSTANCE__* ShellExecuteW(HWND, LPCWSTR, LPCWSTR, LPCWSTR, LPCWSTR, INT)'
ShellExecute(NULL, "open", "qrc://C:/Users/Desktop/a.exe", NULL, NULL, SW_SHOWDEFAULT);

^




در روش دوم هم چون من می خواهم در یک فایل دیگه از این تابع استفاده کنم int main ندارم ( بک اند ) پس argv[1] توی روش دوم ( commend line ) را نمی شناسه

چون تعریف نشده .

روش سوم را بیشتر دوست دارم ولی هر کدوم امنیتش بیشتره . من نتونستم ورودی بفرستم به برنامه ولی آیا میشه خروجی اش را هم گرفت ؟

بسیار ممنون

farhad_shiri_ex
شنبه 24 شهریور 1397, 15:27 عصر
من از روش سوم توی QT استفاده کردم ارور زیر را داد ،

خط سوم ارور هم کدی که نوشتم را نوشته :






در روش دوم هم چون من می خواهم در یک فایل دیگه از این تابع استفاده کنم int main ندارم ( بک اند ) پس argv[1] توی روش دوم ( commend line ) را نمی شناسه

چون تعریف نشده .

روش سوم را بیشتر دوست دارم ولی هر کدوم امنیتش بیشتره . من نتونستم ورودی بفرستم به برنامه ولی آیا میشه خروجی اش را هم گرفت ؟

بسیار ممنون

دوست عزیز عرض کردم روشهایی که عرض کردم برای کامپایلر ویژوال سی مایکروسافت هست پس در فریم وورک کیوت نمی تونی استفاده کنید. برای استفاده در کیوت دوتا راه دارید.!
1- تو سایت iostream.ir بری و سوال اونجا هم مطرح کن یا من یا دوستان دیگه اونجا سوال تون جواب میدیم.
2- تو داکیومنت های کیوت دنبال روش call other process in main thread بگردید کلا روش استفاده اش متفاوت هست.