1

我正在尝试通过我的代码创建一个文本文件。该文件已创建,但其扩展名不同(不是 .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();       
 }
4

1 回答 1

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。是的,编译器会停止抱怨,但它会产生不良行为。您也可以将 anint转换为 a 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

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

于 2012-11-28T14:01:27.230 回答