2017-08-04 66 views
1

我最近買了一個.NET項目編譯沒有從以前的開發人員進一步瞭解和修復最錯誤後(我用視覺工作室2017年項目的一個版本是這樣的)錯誤LNK2022元數據操作失敗(8013118D):重複類型不一致佈局信息(ChooseDeviceParam):(0x02000273)

Microsoft Visual Studio Solution File, Format Version 12.00 
# Visual Studio 14 
VisualStudioVersion = 14.0.25420.1 
MinimumVisualStudioVersion = 10.0.40219.1 

我仍然得到錯誤

線在抑制狀態錯誤LNK2022元數據操作失敗(8013118D):重複類型(ChooseDeviceParam)不一致佈局信息: (0x02000273)。

這裏是 「ChooseDeviceParam」 聲明(VideoSourceList.cpp)的部分代碼

struct ChooseDeviceParam 
{ 
    IMFActivate **ppDevices = nullptr; // Array of IMFActivate pointers. 
    UINT32  count = 0;   // Number of elements in the array. 

    ~ChooseDeviceParam() 
    { 
     if (ppDevices != nullptr) 
     { 
      for (UINT32 i = 0; i < count; i++) 
      { 
       SafeRelease(&ppDevices[i]); 
      } 

      CoTaskMemFree(ppDevices); 
     } 
    } 
}; 

HRESULT VideoSourceList::InitVideoDevices() 
{ 
    m_videoDevices.clear(); 

    HRESULT hr = S_OK; 
    ChooseDeviceParam param; 

    CComPtr<IMFAttributes> pAttributes; 
    // Initialize an attribute store to specify enumeration parameters. 
    hr = MFCreateAttributes(&pAttributes, 1); 
    if (!SUCCEEDED(hr)) 
    { 
     return hr; 
    } 

    // Ask for source type = video capture devices. 
    hr = pAttributes->SetGUID(
     MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, 
     MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID 
    ); 
    if (!SUCCEEDED(hr)) 
    { 
     return hr; 
    } 

    // Enumerate devices. 
    hr = MFEnumDeviceSources(pAttributes, &param.ppDevices, &param.count); 
    if (!SUCCEEDED(hr)) 
    { 
     return hr; 
    } 

    for (UINT32 n = 0; n < param.count; ++n) 
    { 
     WCHAR name[1024]; 

     hr=param.ppDevices[n]->GetString(MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME, name, 1024, NULL); 
     if (!SUCCEEDED(hr)) 
     { 
      return hr; 
     } 

     VideoDeviceData data; 
     data.name = name; 
     m_videoDevices.push_back(data); 
    } 

    return S_OK; 
} 

,這裏是VideoSourceList.h

#pragma once 

#include "atlbase.h" 
#include <memory> 
#include <vector> 

class VideoSourceList 
{ 
public: 
    VideoSourceList(); 
    virtual ~VideoSourceList(); 

    HRESULT GetVideoSourceCount(int& count); 
    HRESULT GetVideoSourceName(int index, CComBSTR& name); 

private: 
    struct VideoDeviceData 
    { 
     CComBSTR name; 
     CComPtr<IMoniker> moniker; 
    }; 
    std::vector<VideoDeviceData> m_videoDevices; 

    HRESULT InitVideoDevices(); 
}; 

這裏properties不工作的一部分

謝謝你的幫助。

+0

這是沒有很明顯這種類型可以被定義不是從片段一次。但顯然你不應該排除這種錯誤,這根本不是託管代碼,並且將類型放入元數據中是沒有用的。您需要更好地將項目中的代碼分區,將此代碼移到靜態庫項目中,該項目在編譯時沒有/ clr實際上是一種體面的方式。 –

回答

0

嗯,我認爲這是因爲2個不同的cpp文件有名爲ChooseDeviceParam的結構,因此我重命名了其中的一個(ofc在項目中重命名了此結構的所有實例),現在我不再收到此錯誤了(新錯誤出現了,但我覺得自己沒把這個問題做)

相關問題