نقل قول: QString to LPCWSTR
من فقط سوال اول رو جواب میدم بقیه سوال ها ربطی به 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;
نقل قول: QString to LPCWSTR
ممنون آقا امید بابت پاسخ
من این رو هم تست زدم و حرف شما با مثالتون درسته اما باز دوباره برنامه گیر میده و میگه 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
نقل قول: QString to LPCWSTR
پارامتر 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[] هم بشه .
نقل قول: QString to LPCWSTR
زم ممنون آقا امید از جوابتون ولی یک مشکل کوچیک
طبق فرمایش شما من تست کردم اما آدرس رو میاره[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
باید دوباره تبدیل کنیم به رشته ؟
نقل قول: QString to LPCWSTR
با حالت بایا من قسمت زیر رو اضافه کردم
if(hFtpSession != NULL){
qDebug() << "Loginned!";
}else{
qDebug() << "NOT Loginned";
}
delete info2;
delete tar2;
delete admin2;
InternetCloseHandle(hftp);
InternetCloseHandle(hFtpSession);
اما بز لاگین نمیکنه و حدسم سره اینه که زمانیکه داره تبدیل میکنه دوباره به رشته نمیشه که تابع مذکور اون رو بشناسه و به صورت آدرس اون داره اشاره می کنه !
بخاطر اینه که wchar_t را از نوع اشاره گر تبدیل کردی ؟
نقل قول: QString to LPCWSTR
باید delete[] بنویسی چون آرایه new کردی نه delete
بعد اره بخوای با qdebug نشون بدی باید دوباره تبدلی کنی به رشته یا یک loop بزاری کاراکتر کاراکتر نشون بدی
یعتی چی wchar_t رو از نوع اشاره گر تبدیل کردی اون LPCWSTR هم نوعش wchar_t* هست(typedef شده )
مشکل حتما از جای دیگست
نقل قول: QString to LPCWSTR
خوب الان اگر من بخوام داخل InternetConnect قرار بدم پارامتر هاش بعد از تبدیل باید کار خاصی انجام بدم ؟
چون مثل اینکه به آدرس اون اشاره می کنه و فکر کنم تابع InternetConnect هم آدرس رو میگیره تو پارامتر واسه همینه که لاگین نمیکنه !
فکر کنم متوجه منظور بنده نشدی اقا امید
نقل قول: QString to LPCWSTR
با InternetOpenA و InternetConnectA تست کن ببین وصل میشه ؟ (ورودی اینا char* هست )
نقل قول: QString to LPCWSTR
خوب آره اسکی کردمش ولی ایندفعه میگه QString to LPCSTR
تابع اون رو نداری ؟
آها پیدا کردم
میزارم که شاید بدرد کسی خورد
برای تبدیل بالا از این استفاده کنید :
inf0.toStdString().c_str()
نقل قول: QString to LPCWSTR
نه اون اشتباه هستش
inf0.toStdString(). این یک متغیر موقت میسازه بعد با c_str دارید به دیتا یک مقدار موقت اشاره می کنید این طوری نباید به تابع بفرستید
اول کپی بگیرید بعد :
std::string infoStr=info.toStdString()
infoStr.c_str()
نقل قول: QString to LPCWSTR
ولی قبلیه جواب داد ؟
مگر اینکه بگیم از لحاظ امنیتی و سرعت برنامه جهت تبدیل !
آقا یک سوال : درسته خارج از بحثه ولی درست ندونستم براش یه تاپیک باز کنم
API های مایکروسافت مثل همون Internetconnect که من دارم استفاده می کنم از هدر windows.h لود میشه
آیا در پلتفرم های دیگه مثل لینوکس این توابع کار می کنند یا فقط مخصوص ویندوزه ؟>
منظورم استفاده اون در کیوته!
نقل قول: QString to LPCWSTR
نقل قول:
ولی قبلیه جواب داد ؟
مگر اینکه بگیم از لحاظ امنیتی و سرعت برنامه جهت تبدیل !
ربطی به امنیت و سرعت تبدیل نداره
اونی که شما نوشتید 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 تا کد متفاوت بنویسید