نمایش نتایج 1 تا 13 از 13

نام تاپیک: QString to LPCWSTR

  1. #1

    QString to LPCWSTR

    سلام دوستان
    می خوام تو یه حلقه فور پسورد های زیاد و یوزر ثابت به 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?
    ممنون و منتظر پاسختان هستم

  2. #2

    نقل قول: 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;

  3. #3

    نقل قول: 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

  4. #4

    نقل قول: 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[] هم بشه .
    آخرین ویرایش به وسیله omid_kma : سه شنبه 18 شهریور 1393 در 16:20 عصر

  5. #5

    نقل قول: 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




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

  6. #6

    نقل قول: QString to LPCWSTR

    با حالت بایا من قسمت زیر رو اضافه کردم

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

    delete info2;
    delete tar2;
    delete admin2;

    InternetCloseHandle(hftp);
    InternetCloseHandle(hFtpSession);


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

  7. #7

    نقل قول: QString to LPCWSTR

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

  8. #8

    نقل قول: QString to LPCWSTR

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

  9. #9

    نقل قول: QString to LPCWSTR

    با InternetOpenA و InternetConnectA تست کن ببین وصل میشه ؟ (ورودی اینا char* هست )

  10. #10

    نقل قول: QString to LPCWSTR

    خوب آره اسکی کردمش ولی ایندفعه میگه QString to LPCSTR
    تابع اون رو نداری ؟

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


  11. #11

    نقل قول: QString to LPCWSTR

    نه اون اشتباه هستش
    inf0.toStdString(). این یک متغیر موقت میسازه بعد با c_str دارید به دیتا یک مقدار موقت اشاره می کنید این طوری نباید به تابع بفرستید
    اول کپی بگیرید بعد :

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

  12. #12

    نقل قول: QString to LPCWSTR

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

  13. #13

    نقل قول: 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 تا کد متفاوت بنویسید
    آخرین ویرایش به وسیله omid_kma : چهارشنبه 19 شهریور 1393 در 22:54 عصر

تاپیک های مشابه

  1. مبتدی: تبدیل Qstring به std::string
    نوشته شده توسط raminlich در بخش برنامه نویسی در محیط QT و هم خانواده هایش
    پاسخ: 2
    آخرین پست: شنبه 18 مرداد 1393, 22:16 عصر
  2. تبدیل QByteArray به QString و بالعکس
    نوشته شده توسط alireza es در بخش برنامه نویسی در محیط QT و هم خانواده هایش
    پاسخ: 1
    آخرین پست: یک شنبه 08 دی 1392, 10:06 صبح
  3. سوال: تبدیل از نوع const char به LPCWSTR
    نوشته شده توسط A_Salimi در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 7
    آخرین پست: شنبه 18 خرداد 1387, 18:47 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •