为什么lpstrFile在内存中返回地址而不是OPENFILENAMEW结构中的char数组?

时间:2013-01-18 18:57:12

标签: c++ winapi buffer

此代码应该编译时没有错误,您应该将-lcomdlg32链接到对话框。如果我使用指针,程序将返回0x22fcd868。并且应该(我认为)在对话框中返回文件用户类型的名称。

#include <windows.h>
#include <iostream>

int main() {
  wchar_t szFileName[MAX_PATH] = {0};
  OPENFILENAMEW ofn;
  ZeroMemory(&ofn, sizeof(ofn));
  ofn.lStructSize = sizeof(OPENFILENAME);
  ofn.nMaxFile = MAX_PATH;
  ofn.lpstrFile = szFileName;
  GetSaveFileNameW(&ofn);

  using namespace std;
  cout << szFileName << endl;
  cout << *szFileName << endl; // also a number not a string
}

2 个答案:

答案 0 :(得分:6)

如果要将wcout数组作为以null结尾的宽字符串输出,则必须使用wchar_t

答案 1 :(得分:2)

cout不支持wchar_twchar_t*,但它支持intvoid*。编译器最终将wchar_t转换为int,并将wchar_t*降级为void*。这就是为什么您看到cout打印wchar_t的数字值和wchar_t*的内存地址。

请改用wcout。它支持wchar_twchar_t*,因此它可以打印实际数据:

wcout << szFileName << endl;
wcout << *szFileName << endl;