PDA

View Full Version : سوال: اجرای فایل اجرایی در backround



alimahboobi
شنبه 29 شهریور 1393, 15:16 عصر
سلام به همگی خسته نباشی
د می خواستم توی ++C یه برنامه exe ای که اجرا کردم در پشت زمینه اجرا بشه
​می شه کمکم کنید ؟؟؟

مسعود اقدسی فام
شنبه 29 شهریور 1393, 18:12 عصر
یه راه می‌تونه استفاده از thread باشه.

http://www.cplusplus.com/reference/thread/thread/

dasssnj
شنبه 29 شهریور 1393, 19:26 عصر
یه راه می‌تونه استفاده از thread باشه.

http://www.cplusplus.com/reference/thread/thread/



یعنی اینجوری اصلا پنجره ی کنسول باز نمیشه؟

مسعود اقدسی فام
شنبه 29 شهریور 1393, 21:42 عصر
یعنی اینجوری اصلا پنجره ی کنسول باز نمیشه؟

خودم امتحان نکردم. صرفا یه نظر و پیشنهاد بود و آدرس دادم که اگه لازم بود خودشون پیگیر بشن.

rahnema1
شنبه 29 شهریور 1393, 22:03 عصر
با استفاده از win32api و تابع CreateProcess برنامه مورد نظر را اجرا کنید و پارامتر lpStartupInfo اون را به این صورت تنظیم کنید

STARTUPINFO startup;
startup.wShowWindow = SW_HIDE;

pe32_64
شنبه 29 شهریور 1393, 23:03 عصر
یه راه می‌تونه استفاده از thread باشه.

http://www.cplusplus.com/reference/thread/thread/


ببخشید این "ترد" در درون همین برنامه ی جاری ایجاد میشه و اصلا به موضوع سوال که در مورد باز کردن یک برنامه ی جداست ربطی نداره.
------
باید خود برنامه ی ثانویه محیط کاربری نداشته باشه و البته برا اجرای برنامه ثانویه از درون برنامه جاری به صورت مخفی امکاناتی وجود داره گه در توابع مربوطه توضیحات لازم هستش.

negative60
شنبه 29 شهریور 1393, 23:24 عصر
سلام به همگی خسته نباشی
د می خواستم توی ++C یه برنامه exe ای که اجرا کردم در پشت زمینه اجرا بشه
​می شه کمکم کنید ؟؟؟

زمان ساخت پروژه بجای win32 project, win32 console رو انتخاب کنيد و بجای main از WinMain استفاده کنيد


#include <windows.h>
int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmd, int show)
{
//start
return 0;
}

one hacker alone
یک شنبه 30 شهریور 1393, 02:22 صبح
سلام سوالتون یکم گنگ هست
1- برنامه ای که خودتون نوشتید میخواید مخفی باشه؟ (جوابش رو دادن جناب negative60 (http://barnamenevis.org/member.php?311130-negative60))
2- در برنامه تون میخواید به برنامه دیگه مثل ماشین حساب رو اجرا کنید؟ ( rahnema1 (http://barnamenevis.org/member.php?305905-rahnema1) اشاره کردن)
3- در برنامه میخواید دستورات خط فرمان رو اجرا کنید؟ باید از تابع system یا shellexecute استفاده کنید.
4- در برنامه یک فایل اجرایی رو از قبل ساختید و دارید و اون رو بیند کردین به برنامه حالا میخواید اون اجرا بشه مخفی باشه؟ ( شاید روش مسعود اقدسی فام (http://barnamenevis.org/member.php?87209-%D9%85%D8%B3%D8%B9%D9%88%D8%AF-%D8%A7%D9%82%D8%AF%D8%B3%DB%8C-%D9%81%D8%A7%D9%85)) و اینکه از قبل باید فکر به حال اون فایل بکنید و اون باید مخفی اجرا بشه که البته در این حالت باز روش 2 میشه استفاده کرد

alimahboobi
سه شنبه 01 مهر 1393, 16:19 عصر
خیلی ممنون از همگی ...
بهتره دوباره سوال رو توضیح بدم
من دو تا سرور دارم در واقع دو تا فایل exe که سرور هستند ...
می خوام این دو تا سرور (یا در واقع دو تا process) اجرا بشه وقتی من برنامه ای که با c نوشتم رو اجرا کنم ...
یعنی یه فایل exe داشته باشم که وقتی روش کلیک می کنم دو تا سرور در پس زمینه اش اجرا بشه...

#target
سه شنبه 01 مهر 1393, 19:27 عصر
با همون CreateProcess و پارامتر SW_HIDE مگه نشد ؟

omid_kma
سه شنبه 01 مهر 1393, 19:29 عصر
خیلی ممنون از همگی ...
بهتره دوباره سوال رو توضیح بدم
من دو تا سرور دارم در واقع دو تا فایل exe که سرور هستند ...
می خوام این دو تا سرور (یا در واقع دو تا process) اجرا بشه وقتی من برنامه ای که با c نوشتم رو اجرا کنم ...
یعنی یه فایل exe داشته باشم که وقتی روش کلیک می کنم دو تا سرور در پس زمینه اش اجرا بشه...
من با جست و جو کردن ظرف ۱۰ ثانیه جواب سوالتون +‌ n تا مثال رو پیدا کردم ...
https://www.google.com/?gws_rd=ssl#q=create+a+process+in+c%2B%2B+on+windo ws
مثلا این :‌ http://mssqlwiki.com/2011/12/31/how-to-create-process-int-c-createprocess-function/

rahnema1
سه شنبه 01 مهر 1393, 20:02 عصر
این جوری برنامه به صورت مخفی اجرا می شه

#include <windows.h>

PROCESS_INFORMATION StartNewProcess(const char program[])
{
STARTUPINFO startup;
memset(&startup, 0, sizeof(STARTUPINFO));
startup.dwFlags = STARTF_USESHOWWINDOW;
startup.wShowWindow = SW_HIDE;
PROCESS_INFORMATION process;
memset(&process, 0, sizeof(PROCESS_INFORMATION));
CreateProcess(program, NULL,
NULL, NULL,
FALSE,
0 ,
NULL,
NULL,
&startup,
&process);
return process;
}

int main()
{
PROCESS_INFORMATION p1 = StartNewProcess("C:/windows/notepad.exe");
//TerminateProcess(p1.hProcess,0); CloseHandle(p1.hProcess); CloseHandle(p1.hThread);
}

one hacker alone
چهارشنبه 02 مهر 1393, 18:00 عصر
خیلی ممنون از همگی ...
بهتره دوباره سوال رو توضیح بدم
من دو تا سرور دارم در واقع دو تا فایل exe که سرور هستند ...
می خوام این دو تا سرور (یا در واقع دو تا process) اجرا بشه وقتی من برنامه ای که با c نوشتم رو اجرا کنم ...
یعنی یه فایل exe داشته باشم که وقتی روش کلیک می کنم دو تا سرور در پس زمینه اش اجرا بشه...

خب خدا خیرتون بده این که شد حالت چهارمی که من توضیح دادم دیگه مگه به غیر از اینه؟ با این تفاوت که به جای یه فایل دو فایل دارید

alimahboobi
پنج شنبه 03 مهر 1393, 12:29 عصر
با همون CreateProcess و پارامتر SW_HIDE مگه نشد ؟
نه متاسفانه تست کردم مشکل اینجاست که فایل های من که قراره اجرا بشن دو تا سرور هستن. که یکیش مثلا کاره ذخیره سازی انجام میده
که اینا با Process اجرا نمیشن

alimahboobi
پنج شنبه 03 مهر 1393, 12:31 عصر
من با جست و جو کردن ظرف ۱۰ ثانیه جواب سوالتون +‌ n تا مثال رو پیدا کردم ...
https://www.google.com/?gws_rd=ssl#q=create+a+process+in+c%2B%2B+on+windo ws
مثلا این :‌ http://mssqlwiki.com/2011/12/31/how-to-create-process-int-c-createprocess-function/

خیلی ممنونم از سرچتون ... بنده در این حد سرچ رو میدونم و کمتر از تایم شما بهشم میرسم مثلا 9 ثانیه :چشمک::لبخندساده:

مشکل اینجاست که فایل های من که قراره اجرا بشن دو تا سرور هستن که اینا با Process اجرا نمیشن

rahnema1
پنج شنبه 03 مهر 1393, 12:34 عصر
نه متاسفانه تست کردم مشکل اینجاست که فایل های من که قراره اجرا بشن دو تا سرور هستن. که یکیش مثلا کاره ذخیره سازی انجام میده
که اینا با Process اجرا نمیشن

اگه فایل exe باشه که با همون createprocess اجرا میشه
اگه سرویس باشه که روش اجرا طور دیگه هست
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686315(v%3Dvs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686315(=vs.85).aspx

alimahboobi
پنج شنبه 03 مهر 1393, 12:38 عصر
این جوری برنامه به صورت مخفی اجرا می شه

#include <windows.h>

PROCESS_INFORMATION StartNewProcess(const char program[])
{
STARTUPINFO startup;
memset(&startup, 0, sizeof(STARTUPINFO));
startup.dwFlags = STARTF_USESHOWWINDOW;
startup.wShowWindow = SW_HIDE;
PROCESS_INFORMATION process;
memset(&process, 0, sizeof(PROCESS_INFORMATION));
CreateProcess(program, NULL,
NULL, NULL,
FALSE,
0 ,
NULL,
NULL,
&startup,
&process);
return process;
}

int main()
{
PROCESS_INFORMATION p1 = StartNewProcess("C:/windows/notepad.exe");
//TerminateProcess(p1.hProcess,0); CloseHandle(p1.hProcess); CloseHandle(p1.hThread);
}


واقعا ازتون ممنونم مرسی که اینقدر خوب این کد را در اختیار قرار دارید ولی من دو تا سرورم رو نمی تونم با process اجراشون کنم
البته با کد زیر تونستم اجراشون کنم ولی متاسفانه نمی تونم hide اشون کنم :((
_beginthread( myFunction, 0, 0);
با کد بالا دو تا تابع درست می کنم بعد توی تابع هام از کد زیر استفاده می کنم
void myFunction(void* dummy){

system("server.exe -parameter");
_endthread();


}
ولی مشکل اینجاست که با اجرای برنامه اینا مخفی نمیش :((
ممنون میشم کمکم کنی

rahnema1
پنج شنبه 03 مهر 1393, 12:47 عصر
چند تا سوال:
1. اسم این 2 تا فایل server چیه و در چه فولدری قرار دارند ( لطفا مسیر کامل این فایلها را دقیقا بگویید)
2. بدون برنامه نویسی این server ها را چه جوری اجرا می کنید

alimahboobi
پنج شنبه 03 مهر 1393, 12:53 عصر
1- توی آدرس دهی شون مشکل ندارم و به صورت زیر آدرس دهی می کنم هر جا که باشند زیاد مهم نیست:
C:\\MYfiles\\Server.exe
2-سرور ها رو قبلا نوشتم که با یکسری پارامتری که از client ها براش ارسال میشه کار میکنه و عمل مورد نظر شو انجام میده

rahnema1
پنج شنبه 03 مهر 1393, 13:39 عصر
در هر صورت اگه خودتون می خواهید پارامتر به سرور ارسال کنید متغیر parameters را از کامنت خارج کنید و پارامترهای مورد نظر را در اون بذارید

#include <windows.h>
#include <stdio.h>

PROCESS_INFORMATION StartNewProcess( const char program[], const char parameters[]="\0")
{
char par[32768]={};
sprintf(par ,"%s %s",program,parameters);
STARTUPINFO startup;
memset(&startup, 0, sizeof(STARTUPINFO));
startup.dwFlags = STARTF_USESHOWWINDOW;
startup.wShowWindow = SW_HIDE;
PROCESS_INFORMATION process;
memset(&process, 0, sizeof(PROCESS_INFORMATION));
CreateProcess(NULL, par,
NULL, NULL,
FALSE,
0 ,
NULL,
NULL,
&startup,
&process);
return process;
}

int main()
{
//char parameters[] ="parameterss from cilents";
PROCESS_INFORMATION p1 = StartNewProcess("C:/MYfiles/Server.exe",parameters);
//TerminateProcess(p1.hProcess,0);CloseHandle(p1.hPr ocess);CloseHandle(p1.hThread);
}

اگه taskmanager را باز کنید می بینید که اسم server در لیست هست اما پنجره برنامه مخفی هست

alimahboobi
پنج شنبه 03 مهر 1393, 23:15 عصر
در هر صورت اگه خودتون می خواهید پارامتر به سرور ارسال کنید متغیر parameters را از کامنت خارج کنید و پارامترهای مورد نظر را در اون بذارید

#include <windows.h>
#include <stdio.h>

PROCESS_INFORMATION StartNewProcess( const char program[], const char parameters[]="\0")
{
char par[32768]={};
sprintf(par ,"%s %s",program,parameters);
STARTUPINFO startup;
memset(&startup, 0, sizeof(STARTUPINFO));
startup.dwFlags = STARTF_USESHOWWINDOW;
startup.wShowWindow = SW_HIDE;
PROCESS_INFORMATION process;
memset(&process, 0, sizeof(PROCESS_INFORMATION));
CreateProcess(NULL, par,
NULL, NULL,
FALSE,
0 ,
NULL,
NULL,
&startup,
&process);
return process;
}

int main()
{
//char parameters[] ="parameterss from cilents";
PROCESS_INFORMATION p1 = StartNewProcess("C:/MYfiles/Server.exe",parameters);
//TerminateProcess(p1.hProcess,0);CloseHandle(p1.hPr ocess);CloseHandle(p1.hThread);
}

اگه taskmanager را باز کنید می بینید که اسم server در لیست هست اما پنجره برنامه مخفی هست

دست گلت درد نکنه تا حد عظیمی حل شد فقط دو تا نکته دیگه
اونم اینکه وقتی از توی codeblocks قسمت run برنامه ام رو اجرا میکنم جفت سرور ها اجرا میشن ولی وقتی از فولدر debug فایل exe رو اجرا میکنم فقط یکیشون اجرا میشه....(به نظر شما دلیل خاصی می تونه داشته باشه؟؟!!!!1)
دومین نکته این که وقتی فایل exe رو اجرا میکنم صفحه ای باز میشه برای خود برنامه exe که نوشته شده می خواستم اون هم نشون داده نشد...(در واقع وقتی روی فایل exe که با کد بالا نوشته شده کلیک میشه فقط دو تا سرور اجرا بشن و دیگه چیزی از خود برنامه نشون داده نشه و دیده هم نشه که مثلا تابع main چه چیزی رو return کرده یا چقدر طول کشیده تا برنامه جرا بشه )*

rahnema1
جمعه 04 مهر 1393, 08:04 صبح
اینکه در فولدر debug اجرا نمیشه برای حلش در انتهای برنامه این را بذارید شاید درست بشه
Sleep(10000);
اینکه خود برنامه هم مخفی اجرا بشه معلومه پستهای بالا را اصلا مطالعه نکردید وگرنه جوابش را دوستان به خوبی دادند

alimahboobi
جمعه 04 مهر 1393, 19:22 عصر
اینکه در فولدر debug اجرا نمیشه برای حلش در انتهای برنامه این را بذارید شاید درست بشه
Sleep(10000);
اینکه خود برنامه هم مخفی اجرا بشه معلومه پستهای بالا را اصلا مطالعه نکردید وگرنه جوابش را دوستان به خوبی دادند
سلام خیلی ممنون از پاسخگوییتون ...
ولی در مورد مخفی اجرا شدن برنامه بگم که من پست ها رو می خونم و از چیزی که
negative60 (http://barnamenevis.org/member.php?311130-negative60)

گفته استفاده کردم ولی جواب نگرفتم به خاطر همین کمک خواستم :لبخندساده::لبخندساده::لبخن ساده:

#target
جمعه 04 مهر 1393, 19:51 عصر
سلام خیلی ممنون از پاسخگوییتون ...
ولی در مورد مخفی اجرا شدن برنامه بگم که من پست ها رو می خونم و از چیزی که
negative60 (http://barnamenevis.org/member.php?311130-negative60)

گفته استفاده کردم ولی جواب نگرفتم به خاطر همین کمک خواستم :لبخندساده::لبخندساده::لبخن ساده:


در مورد codeBlock اطلاع ندارم ولی ضمن گذاشتن WinMain اگر همچنان صفحه کنسول میاد، احتمالا باید به لینکر بگی که SubSystem رو GUI کنه !(البته دستی هم میشه این کارو کرد با تغییر در Header فایل اجرایی، مثلا برای فایل های که به سورس دسترسی نداری و فقط فایل اجراییه)

در Visual Studio مسیرش Project Properties > Linker > System مقدار SubSystem رو به Windows (/SUBSYSTEM:WINDOWS) تغییر داده و از تابع winMainطبق بالا بعنوان شروع برنامه استفاده کن

alimahboobi
پنج شنبه 10 مهر 1393, 09:22 صبح
در مورد codeBlock اطلاع ندارم ولی ضمن گذاشتن WinMain اگر همچنان صفحه کنسول میاد، احتمالا باید به لینکر بگی که SubSystem رو GUI کنه !(البته دستی هم میشه این کارو کرد با تغییر در Header فایل اجرایی، مثلا برای فایل های که به سورس دسترسی نداری و فقط فایل اجراییه)

در Visual Studio مسیرش Project Properties > Linker > System مقدار SubSystem رو به Windows (/SUBSYSTEM:WINDOWS) تغییر داده و از تابع winMainطبق بالا بعنوان شروع برنامه استفاده کن

آقا هر کاری کردم نشد که نشد راه دیگه ای به نظرتون نمیرسه!!:افسرده::افسرده: