PDA

View Full Version : حرفه ای: QString to LPCWSTR



ciph3r
دوشنبه 17 شهریور 1393, 20:42 عصر
سلام دوستان
می خوام تو یه حلقه فور پسورد های زیاد و یوزر ثابت به FTP وصل بشم جهت تست پسورد درست
حالا بحث این رو نمی کنم که چقد این QFTP دهن من رو صاف کرده و اومدم سر وقت API های مایکروسافت
کد زیر رو نگاه کنید


hftp = InternetOpenA(NULL,INTERNET_OPEN_TYPE_DIRECT,NULL, NULL,0);
hFtpSession = InternetConnect(hftp,tar, INTERNET_DEFAULT_FTP_PORT, "admin", loadlist2.at(u), INTERNET_SERVICE_FTP, 0, 0 );
bFtpSession = TRUE;

ارور زیر رو میده :

C:\Qt\Qt5.3.1\Tools\QtCreator\bin\FTP_brute-build-desktop-Qt_4_8_1_for_Desktop_-_MSVC2010__Qt_SDK__Debug\..\FTP_brute\mainwindow.c pp:156: error: C2664: 'InternetConnectW' : cannot convert parameter 2 from 'QString' to 'LPCWSTR'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

هرچی گشتم تو اینترنت راه های زیادی رو گفته بودن اما تست کردم هیچ کدوم من رو به جواب نرسوند!
حالا چیکار کنم واسه تبدیل ؟
دوم اینکه آیا راه دیگری هست برای تست اف تی پی با پسورد های زیاد خارج از 2 روش بالا ؟ (برای اینکه تاپیک دیگه باز نشه اینجا پرسیدم)
سوم اینکه آیا Qt مثل ویژوال استدیو قسمتی داره برای انتخاب Multibytetostdchar?
ممنون و منتظر پاسختان هستم

omid_kma
دوشنبه 17 شهریور 1393, 21:38 عصر
من فقط سوال اول رو جواب میدم بقیه سوال ها ربطی به title ندارن

wchar_t* convertQStringToLPCWSTR(const QString& str)
{
std::wstring temp = str.toStdWString();
wchar_t* result = new wchar_t[temp.size()];
std::copy(temp.begin(), temp.end(), result);
return result;
}

مثال از نحوه استفاده :

QString str("qwe");
LPCWSTR converted = convertQStringToLPCWSTR(str);
//.....
delete[] converted;

ciph3r
سه شنبه 18 شهریور 1393, 15:23 عصر
ممنون آقا امید بابت پاسخ
من این رو هم تست زدم و حرف شما با مثالتون درسته اما باز دوباره برنامه گیر میده و میگه const char to LPCWSTR


QString tar = "192.168.1.1";
LPCWSTR tar2 = convertQStringToLPCWSTR(tar);
hftp = InternetOpenA(NULL,INTERNET_OPEN_TYPE_DIRECT,NULL, NULL,0);
hFtpSession = InternetConnect(hftp,tar2, INTERNET_DEFAULT_FTP_PORT, "admin", loadlist2.at(u), INTERNET_SERVICE_FTP, 0, 0 );


C:\Qt\Qt5.3.1\Tools\QtCreator\bin\FTP_brute-build-desktop-Qt_4_8_1_for_Desktop_-_MSVC2010__Qt_SDK__Debug\..\FTP_brute\mainwindow.c pp:164: error: C2664: 'InternetConnectW' : cannot convert parameter 4 from 'const char [6]' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

omid_kma
سه شنبه 18 شهریور 1393, 15:52 عصر
پارامتر 4 ام یعتی "admin" رو نمیتونه به LPCWSTR تبدیل بشه
روی اونم باید از اون تابع استفاده کنید.
البته نیازی هم به تبدیل به QString ندارید میتونید از این مدل تابع برای تبدیل const char* به LPCWSTR هم استفاده کنید :

#include <cstring>
#include <windows.h>
wchar_t* convertCStringToLPCWSTR(const char* str)
{
const int size=std::strlen(str)+1;
wchar_t* result = new wchar_t[size];
memcpy(result,str,size);
return result;
}
int main()
{
LPCWSTR convertedStr=convertCStringToLPCWSTR("QWE");
}




ضمنا مقدار بازگشتی از تابع حتما باید delete[] هم بشه .

ciph3r
سه شنبه 18 شهریور 1393, 16:21 عصر
زم ممنون آقا امید از جوابتون ولی یک مشکل کوچیک
طبق فرمایش شما من تست کردم اما آدرس رو میاره
[PHP]
QString tar = "192.168.1.1";
QString admin = "admin";
LPCWSTR tar2 = convertQStringToLPCWSTR(tar);
LPCWSTR admin2 = convertQStringToLPCWSTR(admin);



bFtpSession = TRUE;

qDebug() << tar2;
qDebug() << admin2;
hftp = InternetOpen(NULL,INTERNET_OPEN_TYPE_DIRECT,NULL,N ULL,0);
hFtpSession = InternetConnect(hftp,tar2, INTERNET_DEFAULT_FTP_PORT, admin2, info2, INTERNET_SERVICE_FTP, 0, 0 );

دیباگ کردم 3 تا رشته رو :
0x22680b0 0x2268020
0x609fd0




باید دوباره تبدیل کنیم به رشته ؟

ciph3r
سه شنبه 18 شهریور 1393, 16:35 عصر
با حالت بایا من قسمت زیر رو اضافه کردم


if(hFtpSession != NULL){
qDebug() << "Loginned!";
}else{
qDebug() << "NOT Loginned";
}

delete info2;
delete tar2;
delete admin2;

InternetCloseHandle(hftp);
InternetCloseHandle(hFtpSession);


اما بز لاگین نمیکنه و حدسم سره اینه که زمانیکه داره تبدیل میکنه دوباره به رشته نمیشه که تابع مذکور اون رو بشناسه و به صورت آدرس اون داره اشاره می کنه !
بخاطر اینه که wchar_t را از نوع اشاره گر تبدیل کردی ؟

omid_kma
سه شنبه 18 شهریور 1393, 17:49 عصر
باید delete[] بنویسی چون آرایه new کردی نه delete
بعد اره بخوای با qdebug نشون بدی باید دوباره تبدلی کنی به رشته یا یک loop بزاری کاراکتر کاراکتر نشون بدی
یعتی چی wchar_t رو از نوع اشاره گر تبدیل کردی اون LPCWSTR هم نوعش wchar_t* هست(typedef شده )
مشکل حتما از جای دیگست

ciph3r
سه شنبه 18 شهریور 1393, 19:19 عصر
خوب الان اگر من بخوام داخل InternetConnect قرار بدم پارامتر هاش بعد از تبدیل باید کار خاصی انجام بدم ؟
چون مثل اینکه به آدرس اون اشاره می کنه و فکر کنم تابع InternetConnect هم آدرس رو میگیره تو پارامتر واسه همینه که لاگین نمیکنه !
فکر کنم متوجه منظور بنده نشدی اقا امید

omid_kma
چهارشنبه 19 شهریور 1393, 11:27 صبح
با InternetOpenA و InternetConnectA تست کن ببین وصل میشه ؟ (ورودی اینا char* هست )

ciph3r
چهارشنبه 19 شهریور 1393, 16:33 عصر
خوب آره اسکی کردمش ولی ایندفعه میگه QString to LPCSTR
تابع اون رو نداری ؟

آها پیدا کردم
میزارم که شاید بدرد کسی خورد
برای تبدیل بالا از این استفاده کنید :
inf0.toStdString().c_str()

omid_kma
چهارشنبه 19 شهریور 1393, 18:48 عصر
نه اون اشتباه هستش
inf0.toStdString(). این یک متغیر موقت میسازه بعد با c_str دارید به دیتا یک مقدار موقت اشاره می کنید این طوری نباید به تابع بفرستید
اول کپی بگیرید بعد :

std::string infoStr=info.toStdString()
infoStr.c_str()

ciph3r
چهارشنبه 19 شهریور 1393, 20:56 عصر
ولی قبلیه جواب داد ؟
مگر اینکه بگیم از لحاظ امنیتی و سرعت برنامه جهت تبدیل !
آقا یک سوال : درسته خارج از بحثه ولی درست ندونستم براش یه تاپیک باز کنم
API های مایکروسافت مثل همون Internetconnect که من دارم استفاده می کنم از هدر windows.h لود میشه
آیا در پلتفرم های دیگه مثل لینوکس این توابع کار می کنند یا فقط مخصوص ویندوزه ؟>
منظورم استفاده اون در کیوته!

omid_kma
چهارشنبه 19 شهریور 1393, 22:43 عصر
ولی قبلیه جواب داد ؟
مگر اینکه بگیم از لحاظ امنیتی و سرعت برنامه جهت تبدیل !
ربطی به امنیت و سرعت تبدیل نداره
اونی که شما نوشتید undefined behavior هست چون دارید به مقداری از حافظه که موقت هست دست میزنید یعنی هر اتفاقی ممکنه بیفته احتمالا یکم کدتون عوض بشه یا همین کد رو مثلا بزارید توی dll ارور بده .

int foo(const char* str){
//inja str be mahali az hafeze eshare mikone ke pak shode
str[0];//undefine behavior
}
QString str;
//be mahze seda zade shodan foo meghdar bazgashti az str.toStdString() pak mishe
//inja c_str() ham esharegar be aval data dakhel str.toStdString()mide
foo(str.toStdString().c_str());




API های مایکروسافت مثل همون Internetconnect که من دارم استفاده می کنم از هدر windows.h لود میشه
آیا در پلتفرم های دیگه مثل لینوکس این توابع کار می کنند یا فقط مخصوص ویندوزه ؟>
منظورم استفاده اون در کیوته!
چیزایی که از windows.h استفاده می کنین مربوط به API ویندوز هستن و فقط هم داخل ویندوز قابل استفاده ان داخل لینوکس توابع کاملا متفاوتن . اگر می خواهید داخل هر 2 سیستم عامل کدتون کار کنه باید 2 تا کد متفاوت بنویسید