0

我有一个项目,我需要在 Windows 7 下的 VS2010 中使用 C++ 工作。该项目最初是为在 WinCE 上运行而开发的。它是用 VC++ 开发的,但链接到 WinCE 开发环境中使用的一些库。

该项目使用 ::VirtualCopy 无法编译,因为我相信它在 Coredll.lib 中。在 WinCE 环境中。 https://msdn.microsoft.com/en-us/library/aa450977.aspx

error LNK2028: unresolved token (0A000B85) "extern "C" int __cdecl VirtualCopy(void *,void *,unsigned long,unsigned long)" (?VirtualCopy@@$$J0YAHPAX0KK@Z) referenced in ..
error LNK2019: unresolved external symbol "extern "C" int __cdecl VirtualCopy(void *,void *,unsigned long,unsigned long)" (?VirtualCopy@@$$J0YAHPAX0KK@Z) referenced in ..

我的代码中的函数是通过以下方式引用的:

extern "C" 
{
BOOL VirtualCopy(LPVOID lpvDest, LPVOID lpvSrc, DWORD cbSize, DWORD fdwProtect);
}

然后使用:

if( ! ::VirtualCopy(pVMem, reinterpret_cast<void *>(dwASIC_REGISTERS_BASE), tSystemInfo.dwPageSize, PAGE_READWRITE | PAGE_NOCACHE) )
{
    DWORD dwError = ::GetLastError();

    TRACE1("Failed ", dwError);
    return;
}

项目使用:

  • 共享 dll 中的 MFC
  • 到 ATL 的静态链接
  • 公共语言运行时支持 (/clr)

我有几个问题:

  1. 有替代方案吗?
  2. 有什么办法可以导入一些旧的 winCE 库并链接到这些库,让我可以使用这个功能?

任何帮助将不胜感激

非常感谢

4

1 回答 1

0

我不是 WinCE 编程方面的专家,但以下是一些想法:

似乎这个函数用于将程序代码中可访问的指针(虚拟地址)映射到某些设备寄存器(物理地址)。在嵌入式编程中,这种方法用于直接驱动设备(例如点亮连接到 SoC 的 LED)。

  1. 我相信在 Win32 中无法访问此类功能,因为直接设置/读取寄存器是为设备驱动程序保留的,而不是应用程序代码。

  2. 我相信在 Win32 环境中没有办法链接到 WinCE 库。但更重要的是,即使有办法实现这一点,您也将一无所获——寄存器(物理地址)特定于嵌入式设备。在 PC 上,这个特定的物理地址可能指向 RAM,因此您将写入其他应用程序的地址空间。

  3. 您不应该绕过缺少 VirtualCopy 功能。您应该了解代码在设备上的作用,然后将其删除(如果应用程序行为不需要)或以适合 Win32 环境的方式实现它。

于 2015-04-30T09:39:47.770 回答