2013-12-14 49 views
0

我的想法是檢查這個DLL是否有我需要的版本,或者它是更舊還是更新? 我正在嘗試使用THUNK/Trampoline功能。轉換無效gcc -fpermissive

這裏是我在不同的* .dll文件中的用法。

int FilterVersion(CBaseFilter* pFilter) 
{ 
//this is line 178 
    void* ProgVersion = (CBaseFilter::AbstractProgVersion)(void *)&CBaseFilter::FilterVersionStatic; 
    return (*(CBaseFilter::AbstractProgVersion)ProgVersion)(*pFilter); 
} 

這是我宣佈蹦牀的類的聲明。

class PROG_CORE_API CBaseFilter 
{ 
friend class CProgEngineInternal; 

// Trampoline Design pattern 
// this FilterVersion function will be used on a global function exported from a 
// cpp file exporting the dlls functions (therfore must be: static = global). 
// it will use an arbitrary BaseFilter object - so Pure abstract function will 
// make it possible to use polimorphism to all types of derived classes objects. 

public: 

    typedef int (*AbstractProgVersion)(CBaseFilter&); 

    virtual int FilterVersionAbs() =0 ; 

    // a single spot (static) where all derived implemented filters versions tested. 
    // developer can specify version numbers to prohibit from running 
    // returning 0 should block the filter from loading. 

    static int FilterVersionStatic(CBaseFilter& FilterObj) 
    { 
     // version is 4 bytes 
     return FilterObj.FilterVersionAbs(); 
    } 

    mutable int m_Version; 

private:..... 

我得到的警告是:

GCC Build Error in - AddBorders_F.cpp:178:76: error: invalid conversion from ‘CBaseFilter::AbstractProgVersion {aka int (*)(CBaseFilter&)}’ to ‘void*’ [-fpermissive] 
GCC Build Error in - AddBorders_F.o] Error 1 
GCC Build Error in - make: *** [AddBorders] Error 2 

至於我的搜索去我明白我缺少一個鑄件,但我不明白爲什麼?

+0

線178在哪裏? – ldrumm

+0

這裏的第一行是我的用法void * ProgVersion =(CBaseFilter :: AbstractProgVersion)(void *)&CBaseFilter :: FilterVersionStatic; – Gilad

+2

這將有助於添加註釋到相關的源代碼行,以顯示哪一行是第178行。您應該編輯您的問題以顯示此內容。 – ldrumm

回答

1

我不知道你在這裏試圖做什麼,但它是以更多的方式打破了這一行。 (不,它無關,與任何類型轉換int *。如果沒有int *甚至從何而來?有你的代碼的任何地方沒有int *

在錯綜複雜的轉換序列的最後一個轉換是CBaseFilter::AbstractProgVersion類型,這是一個函數指針類型。但是你試圖用它初始化一個void *變量。函數指針類型不能隱式轉換爲void *。這是你的錯誤。

如果要強制用顯式轉換的轉換,你可以做

void* ProgVersion = (void *) &CBaseFilter::FilterVersionStatic; 

那是什麼額外的轉換CBaseFilter::AbstractProgVersion的地步?

但無論如何,void *是一個數據指針類型,不應該與函數指針類型混合。該語言不支持數據指針和函數指針之間的轉換。整個方法是絕望的破碎。

事實上,爲什麼在地球上你甚至做了所有這些轉換?爲什麼不只是

int FilterVersion(CBaseFilter* pFilter) 
{ 
    return CBaseFilter::FilterVersionStatic(*pFilter); 
} 
+0

好的我的想法是做一個動態加載DLL的靜態函數,以便在使用它之前檢查文件/函數的版本。所以我試圖在這裏做一個蹦牀的設計模式。這是否有任何理由? – Gilad

+0

感謝您的回答,我會稍後再檢查它,並將其標記爲正確的 – Gilad

相關問題