צריך עזרה בC++, פתיחת תוכנות - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

צריך עזרה בC++, פתיחת תוכנות


-Sky_Lord-

Recommended Posts

היי,

אני כותב תוכנה כלשהי בC++ בעזרת הWindows API...

באיזה פקודה אני צריך להשתמש על מנת להפעיל קובץ EXE כלשהו? (ולאיזה קובץ אני צריך לעשות Include בשביל זה)?

חיפוש באינטרנט לא הביא לי תשובות...

ועוד שאלה n00bית

התיקיה של הקובץ היא בתוך הPointer בשם המאוד מפתיע: Dir (כלומר אני צריך &Dir)

שם הקובץ לא, זה אפשרי להוסיף את שם הקובץ בתוך פקודת ההרצה או שאני צריך להוסיף אותו מראש לDir ואז להריץ?

קישור לתוכן
שתף באתרים אחרים

קישור לתוכן
שתף באתרים אחרים

תודה :)

עריכה - אוקיי בעיה...

תאמת ראיתי אותה באה אבל החלטתי לנסות בכל מקרה!

הנה חלקים מהקוד:


...

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

קישור לתוכן
שתף באתרים אחרים

השעה מאוחרת ואני הולך לישון, אבל נראה לי שלפני ללואת ה WHILE כדאי לאתחל את המשתנה Dir ע"י

Dir = malloc(DirLength);

וגם ב ShellExecute אולי תעביר את Dir פשוט ככה בלי &

קישור לתוכן
שתף באתרים אחרים

אני ינסה...

בכל מקרה אני לא מכיר את הmalloc בכלל... לכן הנחתי שזה לא יעבוד

הבעיה היא שהמשתנה Dir אמור להיות String..

הפתרון לא עבד, בצורה מפתיעה...

דרך אגב הלולאה עובדת, הבעיה היחידה זה שהמשתנה Dir לא מסוג נכון...

קישור לתוכן
שתף באתרים אחרים

אפשר להשתמש בnew במקום בmalloc', לא?

אם אתה אומר... :)

לא תיכננתי בC++ כבר שנתיים, עכשיו זרקו עלי פרויקט מסובך כזה :)

בכל מקרה אני מתכנן לפתוח את malloc ולחקור את זה קצת, אם אתה חושב שיש דרך אחרת אז אתה מוכן לפרט?

עריכה - חקרתי את malloc.h...

לא גיליתי שם שום דבר מעניין :(

עריכה - ניסיתי משהו... החלפתי את Dir בתיקיה המתאימה והכל עבד בצורה חלקה, כל הScript...

זה אומר שזה הדבר היחיד שמונע ממני לסיים!

קישור לתוכן
שתף באתרים אחרים

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++

קישור לתוכן
שתף באתרים אחרים

חחח, טוב, יש דברים שבשעות נורמליות רואים... התוכנית שלך בכלל לא אמורה לעבוד...

למה אתה משתמש ב PPERF_DATA_BLOCK בכלל ? (כדאי לעשות דברים רק אם מבינים, לא להעתיק קוד סתם ככה)

אתה עושה OPENKEY לפני הקריאה הזו בכלל?

קישור לתוכן
שתף באתרים אחרים

חחח, טוב, יש דברים שבשעות נורמליות רואים... התוכנית שלך בכלל לא אמורה לעבוד...

למה אתה משתמש ב PPERF_DATA_BLOCK בכלל ? (כדאי לעשות דברים רק אם מבינים, לא להעתיק קוד סתם ככה)

אתה עושה OPENKEY לפני הקריאה הזו בכלל?

קודם כל כן אני עושה open key

עכשיו אמרתי אלף פעם שכתבתי את זה בזמן שחשבתי שזה לא יעבוד!!!!

פשוט אם אני מגדיר אותו כchar (יענו string) אז אני מקבל error 234

שזה Buffer Overflow!

הפתרון היחיד שמצאתי זה מה שרשמתי...

עריכה - הפתרון לקוח משם:

עכשיו כמו שאמרתי, ניחשתי שזה לא יעבוד אבל זה היה הדבר היחיד שמצאתי...

קישור לתוכן
שתף באתרים אחרים

כמעט

בו זמנית אני מדבר עם אחי, הוא גם הציע לי לעשות גודל קבוע גדול...

char dir[8192];
DWORD dirLength = 8192;
               ShellExecute(NULL, argv[1], "System\\ArmyOps.exe", argv[2], dir,
                 SW_SHOWNORMAL);

תודה על העזרה

:)

שאלה אחרונה

מה הפקודה בAPI של וינדוס לשלוח מקשים (Keystrokes) לActive Window

אני יודע שיש אחד אבל אני לא מוצא אותו

תודה מראש

עריכה -

לא משנה, עזבו את הטרייד הזה, אני פותח אחד אחר עם שאלה אחרת

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...