פורסם 2005 במרץ 320 שנים היי,אני כותב תוכנה כלשהי בC++ בעזרת הWindows API...באיזה פקודה אני צריך להשתמש על מנת להפעיל קובץ EXE כלשהו? (ולאיזה קובץ אני צריך לעשות Include בשביל זה)?חיפוש באינטרנט לא הביא לי תשובות...ועוד שאלה n00bיתהתיקיה של הקובץ היא בתוך הPointer בשם המאוד מפתיע: Dir (כלומר אני צריך &Dir)שם הקובץ לא, זה אפשרי להוסיף את שם הקובץ בתוך פקודת ההרצה או שאני צריך להוסיף אותו מראש לDir ואז להריץ?
פורסם 2005 במרץ 320 שנים אפשר עם http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shellexecute.aspאוhttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createprocess.aspלמשלShellExecute(this->m_hWnd,"open","calc.exe","","you can put the directory here", SW_SHOW );
פורסם 2005 במרץ 420 שנים מחבר תודה עריכה - אוקיי בעיה... תאמת ראיתי אותה באה אבל החלטתי לנסות בכל מקרה! הנה חלקים מהקוד: ...PPERF_DATA_BLOCK Dir = NULL;DWORD DirLength = TOTALBYTES;... while( RegQueryValueEx(Key, "InstallDir", NULL, NULL, (LPBYTE) Dir, &DirLength) == ERROR_MORE_DATA ) { DirLength += BYTEINCREMENT; Dir = (PPERF_DATA_BLOCK) realloc(Dir, DirLength); } ... ShellExecute(NULL, argv[1], "\\System\\ArmyOps.exe", argv[2], &Dir, SW_SHOWNORMAL);... שלוש נקודות מסמנות קוד לא חשוב. נתחיל מהמקור של הבעיה... שאני לוקח את התיקייה מהRegistrey אני לא יודע את הגודל שלה, זה יכול ליצור Buffer Overflow... חיפשתי תשובה ובסוף ראיתי שכולם כותבים את הקוד שכתוב בMSDN... השתמשתי בו אפילו שידעתי שבסוף זה לא יעבוד לקחתי את הקוד משם: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/regqueryvalueex.asp כמו שאתה רואה פה המשתנה מגדיל את עצמו כל פעם על מנת שהמידע יכנס פנימה. הבעיה היא שאז המידע לא נכנס בסוג משתנה לא נכון... אתה רואה את הבעיה? יש למישהו רעיון? דרך אגב, הדפסה של &Dir מביאה: 0x443010
פורסם 2005 במרץ 420 שנים השעה מאוחרת ואני הולך לישון, אבל נראה לי שלפני ללואת ה WHILE כדאי לאתחל את המשתנה Dir ע"יDir = malloc(DirLength);וגם ב ShellExecute אולי תעביר את Dir פשוט ככה בלי &
פורסם 2005 במרץ 420 שנים מחבר אני ינסה...בכל מקרה אני לא מכיר את הmalloc בכלל... לכן הנחתי שזה לא יעבודהבעיה היא שהמשתנה Dir אמור להיות String..הפתרון לא עבד, בצורה מפתיעה...דרך אגב הלולאה עובדת, הבעיה היחידה זה שהמשתנה Dir לא מסוג נכון...
פורסם 2005 במרץ 420 שנים מחבר אפשר להשתמש בnew במקום בmalloc', לא? אם אתה אומר... לא תיכננתי בC++ כבר שנתיים, עכשיו זרקו עלי פרויקט מסובך כזה בכל מקרה אני מתכנן לפתוח את malloc ולחקור את זה קצת, אם אתה חושב שיש דרך אחרת אז אתה מוכן לפרט? עריכה - חקרתי את malloc.h... לא גיליתי שם שום דבר מעניין עריכה - ניסיתי משהו... החלפתי את Dir בתיקיה המתאימה והכל עבד בצורה חלקה, כל הScript... זה אומר שזה הדבר היחיד שמונע ממני לסיים!
פורסם 2005 במרץ 420 שנים מחבר 56 C:\Documents and Settings\Yoav2\My Documents\C++\run.cpp cannot convert `_PERF_DATA_BLOCK*' to `const CHAR*' for argument `5' to `HINSTANCE__* ShellExecuteA(HWND__*, const CHAR*, const CHAR*, const CHAR*, const CHAR*, INT)'המספר בהתחלה זו השורה...אני משתמש בDev C++
פורסם 2005 במרץ 420 שנים חחח, טוב, יש דברים שבשעות נורמליות רואים... התוכנית שלך בכלל לא אמורה לעבוד...למה אתה משתמש ב PPERF_DATA_BLOCK בכלל ? (כדאי לעשות דברים רק אם מבינים, לא להעתיק קוד סתם ככה)אתה עושה OPENKEY לפני הקריאה הזו בכלל?
פורסם 2005 במרץ 420 שנים מחבר חחח, טוב, יש דברים שבשעות נורמליות רואים... התוכנית שלך בכלל לא אמורה לעבוד...למה אתה משתמש ב PPERF_DATA_BLOCK בכלל ? (כדאי לעשות דברים רק אם מבינים, לא להעתיק קוד סתם ככה)אתה עושה OPENKEY לפני הקריאה הזו בכלל?קודם כל כן אני עושה open keyעכשיו אמרתי אלף פעם שכתבתי את זה בזמן שחשבתי שזה לא יעבוד!!!!פשוט אם אני מגדיר אותו כchar (יענו string) אז אני מקבל error 234שזה Buffer Overflow!הפתרון היחיד שמצאתי זה מה שרשמתי...עריכה - הפתרון לקוח משם:עכשיו כמו שאמרתי, ניחשתי שזה לא יעבוד אבל זה היה הדבר היחיד שמצאתי...
פורסם 2005 במרץ 420 שנים סתם תנסה רגע:DWORD MaxLen = 64000;char Dir[64000];RegQueryValueEx(Key, "InstallDir", NULL, NULL, (LPSTR)Dir, &MaxLen);ShellExecute(NULL, argv[1], "\\System\\ArmyOps.exe", argv[2], Dir, SW_SHOWNORMAL);עובד?
פורסם 2005 במרץ 420 שנים מחבר כמעט בו זמנית אני מדבר עם אחי, הוא גם הציע לי לעשות גודל קבוע גדול... char dir[8192];DWORD dirLength = 8192; ShellExecute(NULL, argv[1], "System\\ArmyOps.exe", argv[2], dir, SW_SHOWNORMAL); תודה על העזרה שאלה אחרונה מה הפקודה בAPI של וינדוס לשלוח מקשים (Keystrokes) לActive Window אני יודע שיש אחד אבל אני לא מוצא אותו תודה מראש עריכה - לא משנה, עזבו את הטרייד הזה, אני פותח אחד אחר עם שאלה אחרת
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.