PDA

View Full Version : تحليل كد1



one hacker alone
پنج شنبه 10 فروردین 1391, 15:17 عصر
با ياد خدا
سلام من تابعي براي گرفتن عنوان پنجره فعال نوشتم كه بعد تو اينترنت كد زير رو پيدا كردم جالب بود اما متوجه نشدم دقيقا چكار كرده دوستان اگه كسي آشنايي داره ممنون ميشم توضيح بدين البته منظورم چارچوب برنامه هست نه خود كد ها چون كد مشخص هندل رو ميگيره بعد اندازه و در نهايت بعد از گرفتن عنوان با پيغام نشون ميده

#include "stdafx.h"
#include <string>
#include <windows.h>
#include <stdio.h>
#include <iostream>

using namespace std;

wstring GetActiveWindowTitle()
{
wstring title;
HWND handle = GetForegroundWindow();
int len = GetWindowTextLengthW( handle )+1;
wchar_t * omgtitle = new wchar_t[len];
GetWindowTextW(handle,omgtitle,len);
title += omgtitle;
return title;
}

int main()
{
wstring loltitle;
loltitle = L"Title is: ";
loltitle += GetActiveWindowTitle();
MessageBoxW(NULL,loltitle.c_str(),L"hi",0);
return 0;
}


خطوط بزرگ رو اشكال دارم wstring نوعي داده هستن؟ خط اول چيه و چرا اينجوري تعريف شده؟


من خواستم به جاي messagebox اون رو تو همون كنسول چاپ كنم اما اين پيغام رو ميده و نميتونم cout<<loltitle رو انجام بدم


error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned
short> >' (or there is no acceptable conversion)


و در آخر اينكه من انتظار داشتم اين كار به شكل زير هم انجام بشه اما برنامه حين اجرا خطا ميده

#include "stdafx.h"
#include <string>
#include <windows.h>
#include <stdio.h>
using namespace std;

int main()
{
HWND handle = GetForegroundWindow();
int len = GetWindowTextLengthW( handle )+1;
string title;
GetWindowTextW(handle, title, len );
printf("%s",title);
return 0;
}

one hacker alone
دوشنبه 14 فروردین 1391, 11:37 صبح
كسي نيست راهنمايي كنه؟

V0RTEX
دوشنبه 14 فروردین 1391, 19:22 عصر
wstring در واقع مثل string هست فقط unicode رو ساپورت میکنه cout چون تو console هست و cmd هم فقط ANSI ساپورت می کنه error می ده
GetForegroundWindow هم کار اصلی انجام می ده و handle پنجره ی فعال رو می گیره و بعدش با استفاده از GetWindowTextW میاد از رو handle که از تابع قبلی به دست اومده عنوان برنامه رو return می کنه و چون یه پارامتر که باید به GetWindowTextW بدیم طول رشته ی عنوان هست با استفاده از GetWindowTextLengthW می گیره.GetWindowTextW هم چون باید به عنوان ورودی wstring بدی به string احتمالا error می ده

one hacker alone
سه شنبه 15 فروردین 1391, 02:11 صبح
ممنون من نميتونم wstring رو با cout چاپ كنم چون شما ميگين ابن براي كنسول نيست پس من براي چاپ wstring چكار كنم؟ تبديل؟ يا تابع ديگه اي براي چاپ استفاده كنم؟

==========
ببینید خروجی این تابع داده ای از نوع wstring هست که من هر کاری خواستم باهاش بکنم نتونستم مثلا خواستم بریزم تو یه ارایه یا اینکه تبدیل به یه نوع دیگه کنم یا چاپ کنم نشد که نشد
چجوری با این نوع داده کار کنم

pe32_64
سه شنبه 15 فروردین 1391, 23:36 عصر
چرا به اسکی تبدیل نمی کنید؟

one hacker alone
چهارشنبه 16 فروردین 1391, 00:36 صبح
دوست عزيز منظورتون چيه؟
من از wstring استفاده كردم چون يونيكد رو ساپورت ميكنه و نياز به تبديل هاي اضافي نباشه
اما منظورتون رو متوجه نشدم كه كجا از asci استفاده كنم؟

V0RTEX
پنج شنبه 17 فروردین 1391, 09:12 صبح
الان شما 2 راه داری:
1-wstring رو به string تبدیل کنی
#include <iostream>
#include <AtlStr.h>
using namespace std;
int main()
{
wstring wstr=L"hello";
string str=CW2A(wstr.c_str());
cout << str.c_str() << endl;
return 0;
}
2-wstring رو نشون بدی با wcout که مثل همون cout هست

one hacker alone
شنبه 19 فروردین 1391, 21:16 عصر
حالا اگه من بخوام wstring رو تو فايل بريزم چكار كنم چون مثل بقيه نميشه باهاش كار كرد خطا گرفت