2015-01-31 93 views
1

我想从C#调用一些Windows基本功能,特别是this之一。 因为此刻我想学习C++/CLI语言也一样,我写下来这样的代码:包装C#CLI类为C#


#pragma once 

#include <string> 
#include <Windows.h> 

using namespace System; 

namespace InformazioniSchermo { 

    public class Native_InformazioniDaSistema 
    { 
    public: 
     int m_nAltezzaPannello; 
     int m_nLarghezzaPannello; 

     Native_InformazioniDaSistema(void) 
     { 
      DISPLAY_DEVICE dd; 
      DWORD dev = 0; 

      dd.cb = sizeof(dd); 
      EnumDisplayDevices(0, dev, &dd, 0); 
      m_nAltezzaPannello = 100; 
      m_nLarghezzaPannello = 100; 
     } 
    }; 

    public ref class InformazioniDaSistema 
    { 
    public: 
     InformazioniDaSistema(); 
     ~InformazioniDaSistema(); 

    public: 
     int m_nHeight; 
     int m_nWidth; 
    }; 

    InformazioniDaSistema::InformazioniDaSistema() 
    { 
     Native_InformazioniDaSistema foo; 

     m_nHeight = foo.m_nAltezzaPannello; 
     m_nWidth = foo.m_nLarghezzaPannello; 
    } 

    InformazioniDaSistema::~InformazioniDaSistema() 
    { 
    } 
} 

但是当我编译,我得到这个错误:

Error 3 error LNK2028: at unresolved token (0A0003B4) "extern "C" int __stdcall EnumDisplayDevicesW(wchar_t const *,unsigned long,struct _DISPLAY_DEVICEW *,unsigned long)" ([email protected]@[email protected]@[email protected]) referencing in function "public: __thiscall InformazioniSchermo::Native_InformazioniDaSistema::Native_InformazioniDaSistema(void)" ([email protected]@@[email protected]) c:\Users\massimiliano\documents\visual studio 2013\Projects\InformazioniSchermo\InformazioniSchermo\InformazioniSchermo.obj InformazioniSchermo 

我在哪里做错了?

回答

3

您需要链接到user32.libEnumDisplayDevices函数的库,如您在链接到的MSDN页面中所见)。

您可以通过转到项目属性 - >连接器 - >输入并将user32.lib添加到“附加相关性”列表中来执行此操作。

我注意到,对于C++/CLI默认的Visual Studio项目设置不包括默认常用的Windows API库(常规的C++项目kernel32.libuser32.libshell32.lib和其他人加入到新项目的项目库的依赖)所以你必须自己添加这些库,如果你使用它们。

2
error LNK2028: ... ([email protected]@[email protected]@[email protected]) ... 

这是链接器正在寻找的名称。这是而不是它的名称,它是一个C函数,并没有C++名称的变形。很不清楚你是怎么做到的,尤其是因为你混淆了你的#包括。但唯一合理的猜测是你自己声明了这个函数,而不是在SDK头中使用它的声明。

绝对不要这样做。而是使用:

#include <Windows.h> 
    #pragma comment(lib, "user32.lib") 

将#pragma有帮助,所以你不能忘记链接到USER32