【问题标题】:How to Generate a text file in WinCE 6.0 application using MFC?如何使用 MFC 在 WinCE 6.0 应用程序中生成文本文件?
【发布时间】:2012-11-28 11:55:20
【问题描述】:

我正在尝试通过我的代码创建一个文本文件。该文件已创建,但其扩展名不同(不是 .txt)。然后在搜索时我开始知道这可能是因为 MFC 运行时。

我在我的 C:\program Files\Windows CE 工具\SDK 中搜索了 MFC 运行时,但我在那里找不到 MFC 文件夹。我该怎么办?我应该从哪里包含 MFC 运行时?

这是我正在使用的文本文件生成代码:

 void CFormRight::OnBnClickedButtonTextfile()
 {
    CFile File;
    char cFileAddr[100] = {"My Device\\Label.txt"};
    File.Open((LPCTSTR)cFileAddr, CFile::modeCreate | CFile::typeBinary |CFile::modeWrite | CFile::shareDenyNone);
    File.Write("Hello World", 15);
    File.Close();       
 }

【问题讨论】:

    标签: visual-c++ mfc windows-ce


    【解决方案1】:

    如果您只是在寻找 DLL,请尝试在此处查看您的开发机器:

    %PROGRAM_FILES%\Microsoft Visual Studio 9.0\VC\ce\dll

    这将为您提供实际的库。可以通过多种方式将它们包含在 OS 映像中。通常,您会将它们添加到您的平台或项目 BIB 文件中。

    尽管如此,我认为这并不能解决您的文件扩展名问题。如果您正在创建一个文件并且它显示出来,只是没有扩展名,它与 MFC 是否存在无关,它与您的代码或您确定没有扩展名的方式有关(资源管理器中是否打开了“隐藏文件扩展名”?)。要解决这个问题,我们需要查看代码。

    ** 编辑 **

    Windows CE 严重偏向 Unicode。几乎所有 Win32 API 都只暴露了 Unicode 变体,因此您的代码也应该倾向于 Unicode,这意味着您传递的最终在 API 调用中传递的字符串应该是 Unicode。

    其次,当它抱怨时,你不应该忽略编译器。我敢打赌,您在那里的演员表是由于编译器投诉,这是不正确的。如果你的原始代码是这样的(注意第一个参数没有强制转换):

    File.Open(cFileAddr, CFile::modeCreate | CFile::typeBinary |
                         CFile::modeWrite | CFile::shareDenyNone);
    

    然后你会得到一个编译器错误:

    error C2664: 'CFile::Open' : cannot convert parameter 1 from 'char [100]' to 'LPCTSTR'

    这是因为在 Windows CE 下,Open 正在寻找一个宽 (Unicode) 字符串。你有一个 ANSI 字符串。您不能像以前那样通过简单的直接转换将 ANSI 转换为 Unicode。是的,编译器会停止抱怨,但它会产生不良行为。您也可以将 int 转换为 char[],但这并不意味着它适用于 API。

    因此,更改您的代码以使用宽字符串,一切都会正常工作:

    CFile File;
    CFileException ex;
    wchar_t cFileAddr[100] = TEXT("My Device\\Label.txt");
    if(!File.Open(cFileAddr, CFile::modeCreate | CFile::typeBinary | 
                         CFile::modeWrite | CFile::shareDenyNone))
    {
        wchar_t error[1024];
        ex.GetErrorMessage(error, 1024);
        cout << "Error opening file: ";
        cout << error;
        return;
    }
    
    File.Write("ID Technologies", 15);
    File.Close();       
    

    注意wchar_t 的使用、使用TEXT 宏的初始化以及Open 调用中缺少转换。

    编辑 2

    我在上面的代码中添加了错误处理,但实际上你应该学习read the documentation 以及如何调试。这是一个非常基本的使用场景,知道如何查找错误至关重要。

    【讨论】:

    • cacke 我已经更新了我的问题,请看一下代码。
    • 你是对的。我试图将 mfc 运行时 dll 复制到我的 exe 文件夹中,但没有任何改变。我现在该怎么办?
    • 我得到了你所说的宽(Unicode)字符串,我在我的代码中尝试了同样的方法,但我在 CFie::Write 函数中遇到了调试断言问题
    • ASSERT(m_hFile != INVALID_HANDLE_VALUE)
    • 代码运行没有任何错误,但是当我点击生成文本文件按钮时,我在 Filecore.cpp 中遇到断言问题
    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多