Win32应用程序编程C ++,参数类型为LPCWSTR的错误

时间:2014-02-18 20:07:24

标签: c++ winapi

我正在使用Visual Studio 2013上的Win32应用程序构建一个程序。从我读过的教程中,我知道以下代码是正确的,但我不知道在哪里更改参数类型以阅读以下内容: / p>

case WM_CREATE:
{
    hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", "",
        WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_AUTOHSCROLL |
        ES_AUTOVSCROLL, 50, 100, 300, 300, hWnd, (HMENU)IDC_EDIT_BOX, 
        NULL, NULL);

编译器突出显示“编辑”并给出了这个错误:

  

错误1错误C2664:'HWND CreateWindowExW(DWORD,LPCWSTR,LPCWSTR,DWORD,int,int,int,int,HWND,HMENU,HINSTANCE,LPVOID)':无法从'const char转换参数2 5]'到'LPCWSTR'

4 个答案:

答案 0 :(得分:8)

您正在使用已定义的UNICODE进行编译。这意味着CreateWindowExCreateWindowExW的别名,宽字符版本。之一:

  1. 提供宽字符文字或
  2. 致电CreateWindowExA
  3. 编译ANSI。
  4. 我个人建议选项1.您的代码将成为:

    CreateWindowEx(WS_EX_CLIENTEDGE, L"Edit", L"",
      WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 
      50, 100, 300, 300, hWnd, (HMENU)IDC_EDIT_BOX, NULL, NULL);
    

    字符串文字的L前缀用于指定宽字符文字。

答案 1 :(得分:1)

错误消息抱怨CreateWindowExW(),但您的代码正在调用CreateWindowEx()。这意味着您的项目正在编译时定义了UNICODE。在这种情况下,CreateWindowEx()映射到CreateWindowExW(),它需要宽(wchar_t*)数据,但是您传递的是窄(char*)数据,因此错误。< / p>

您需要:

  1. 直接致电CreateWindowExW(),并在文字前加上L,使其宽而不是缩小:

    hEdit = CreateWindowExW(WS_EX_CLIENTEDGE, L"Edit", L"", ...);
    
  2. 继续调用CreateWindowEx(),但用TEXT()宏包装文字,这样根据是否定义UNICODE,它会使它们变窄或变宽:

    hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("Edit"), TEXT(""), ...);
    

答案 2 :(得分:0)

首先,您需要确定您尝试在字符集方面创建的项目类型。项目类型至少有四个选项

  1. 仅使用常规(窄)字符的项目(char
  2. 仅使用宽字符的项目(wchar_t
  3. “Transformer”项目,可以通过项目设置的简单更改轻松编译为类型1或类型2
  4. 自由混合窄字和宽字的项目
  5. 这是您必须先做出的决定。在做出决定之前,没有必要继续进行。

    现在,根据您所做的选择,您应该按照以下步骤进行操作

    1. 常规char项目

      • 转到项目设置并将“字符集”设置为“使用多字节字符集”
      • 在您的代码中使用常规(窄)字符串和字符文字:"Edit"'A'等。
      • 使用常规charchar [N]char *std::string类型来处理字符和字符串
      • 使用标准库函数的窄版本:printfstrcpy等。
      • 使用“普通”名称来调用Windows API函数:CreateWindowEx或其缩小的名称:CreateWindowExA(无论您更喜欢哪个)
    2. 广wchar_t个项目

      • 转到项目设置并将“字符集”设置为“使用Unicode字符集”
      • 在您的代码中明确使用宽字符串和字符文字:L"Edit"L'A'等。
      • 使用广泛的wchar_twchar_t [N]wchar_t *std::wstring类型来处理字符和字符串
      • 使用广泛版本的标准库函数:wprintfwcscpy等。
      • 使用“普通”名称来调用Windows API函数:CreateWindowEx或其广泛的名称:CreateWindowExW(您更喜欢哪个)
    3. “变形金刚”项目

      • 在每个翻译单元中加入<tchar.h>
      • 在您的代码中,始终明确使用带有字符串和字符文字的宏_T_T("Edit")_T('A')等。
      • 使用TCHARTCHAR [N]TCHAR *std::basic_string<TCHAR>类型处理字符和字符串
      • 使用标准库函数的“transformer”版本:_tprintf_tcscpy等。
      • 使用“普通”名称来调用Windows API函数:CreateWindowEx

        通过这种项目,如果您正确地执行所有操作,只需更改项目设置中的“字符集”设置,即可自动在类型1和类型2之间切换。
    4. 混合搭配项目

      • 在每个特定上下文中使用您喜欢的任何类型的字符(窄或宽),但请记住为每种字符类型调用适当版本的标准库和Windows API函数。在某些情况下,当狭义和广泛的上下文相遇时,您必须在窄字符和宽字符类型之间执行转换。
    5. 当然,如果您启动了类型1或类型2的项目,则可以始终通过混合字符类型将其转换为类型4的项目。但是如果你需要一个3型项目,从一开始就坚持其原则是个好主意(后来转换为3型是一个非常费力的过程)。

      您在项目中尝试做的事情并不是很明显。但一个疯狂的猜测是你正在尝试建立一个类型1项目。在这种情况下,您需要做的就是解决问题,转到项目设置并将“字符集”设置为“使用多字节字符集”。

答案 3 :(得分:0)

package com.myapper.hasee.server;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
import android.widget.EditText;
import android.widget.Button;


import java.util.HashMap;
import java.util.Map;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class MainActivity extends AppCompatActivity {

    // Creating EditText.
    EditText FirstName, LastName, Email ;

    // Creating button;
    Button InsertButton;

    // Creating Volley RequestQueue.
    RequestQueue requestQueue;

    // Create string variable to hold the EditText Value.
    String FirstNameHolder, LastNameHolder, EmailHolder ;

    // Creating Progress dialog.
    ProgressDialog progressDialog;

    // Storing server url into String variable.
    String HttpUrl = "https://bomvibe.com/folder_name/myfile.php";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Assigning ID's to EditText.
        FirstName = (EditText) findViewById(R.id.editTextFirstName);
        LastName = (EditText) findViewById(R.id.editTextLastName);
        Email = (EditText) findViewById(R.id.editTextEmail);

        // Assigning ID's to Button.
        InsertButton = (Button) findViewById(R.id.ButtonInsert);

        // Creating Volley newRequestQueue .
        requestQueue = Volley.newRequestQueue(MainActivity.this);

        progressDialog = new ProgressDialog(MainActivity.this);
        // Adding click listener to button.
        InsertButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                // Showing progress dialog at user registration time.
                progressDialog.setMessage("Please Wait, We are Inserting Your Data on Server");
                progressDialog.show();

                // Calling method to get value from EditText.
                GetValueFromEditText();

                // Creating string request with post method.
                StringRequest stringRequest = new StringRequest(Request.Method.POST, HttpUrl,
                        new Response.Listener<String>() {
                            @Override
                            public void onResponse(String ServerResponse) {

                                // Hiding the progress dialog after all task complete.
                                progressDialog.dismiss();

                                // Showing response message coming from server.
                                Toast.makeText(MainActivity.this, ServerResponse, Toast.LENGTH_LONG).show();
                            }
                        },
                        new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError volleyError) {

                                // Hiding the progress dialog after all task complete.
                                progressDialog.dismiss();

                                // Showing error message if something goes wrong.
                                Toast.makeText(MainActivity.this, volleyError.toString(), Toast.LENGTH_LONG).show();
                            }
                        }) {
                    @Override
                    protected Map<String, String> getParams() {

                        // Creating Map String Params.
                        Map<String, String> params = new HashMap<String, String>();

                        // Adding All values to Params.
                        params.put("first_name", FirstNameHolder);
                        params.put("last_name", LastNameHolder);
                        params.put("email", EmailHolder);

                        return params;
                    }

                };

                // Creating RequestQueue.
                RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);

                // Adding the StringRequest object into requestQueue.
                requestQueue.add(stringRequest);

            }
        });

    }

    // Creating method to get value from EditText.
    public void GetValueFromEditText(){

        FirstNameHolder = FirstName.getText().toString().trim();
        LastNameHolder = LastName.getText().toString().trim();
        EmailHolder = Email.getText().toString().trim();

    }

}