2013-04-17 42 views
0

我似乎遇到了問題。我試圖讓C++函數在c代碼中使用。將C++轉換爲C在C中使用C++

我嘗試這些方法

,如果我需要擺脫類的完全的話,我會的,但我不希望失去的下載飼料到控制檯。

這是在C++中工作的代碼,但不在c中。

#include <tchar.h> 
#include <urlmon.h> 
#pragma comment(lib,"urlmon.lib") 
#include <stdio.h> 

class MyCallback : public IBindStatusCallback 
{ 
public: 
    MyCallback() {} 

    ~MyCallback() { } 

    // This one is called by URLDownloadToFile 
    STDMETHOD(OnProgress)(/* [in] */ ULONG ulProgress, /* [in] */ ULONG ulProgressMax, /* [in] */ ULONG ulStatusCode, /* [in] */ LPCWSTR wszStatusText) 
    { 
     printf("Downloaded %i of %i byte(s) Status Code = %i\n",ulProgress, ulProgressMax, ulStatusCode); 
     return S_OK; 
    } 

    // The rest don't do anything... 
    STDMETHOD(OnStartBinding)(/* [in] */ DWORD dwReserved, /* [in] */ IBinding __RPC_FAR *pib) 
    { return E_NOTIMPL; } 

    STDMETHOD(GetPriority)(/* [out] */ LONG __RPC_FAR *pnPriority) 
    { return E_NOTIMPL; } 

    STDMETHOD(OnLowResource)(/* [in] */ DWORD reserved) 
    { return E_NOTIMPL; } 

    STDMETHOD(OnStopBinding)(/* [in] */ HRESULT hresult, /* [unique][in] */ LPCWSTR szError) 
    { return E_NOTIMPL; } 

    STDMETHOD(GetBindInfo)(/* [out] */ DWORD __RPC_FAR *grfBINDF, /* [unique][out][in] */ BINDINFO __RPC_FAR *pbindinfo) 
    { return E_NOTIMPL; } 

    STDMETHOD(OnDataAvailable)(/* [in] */ DWORD grfBSCF, /* [in] */ DWORD dwSize, /* [in] */ FORMATETC __RPC_FAR *pformatetc, /* [in] */ STGMEDIUM __RPC_FAR *pstgmed) 
    { return E_NOTIMPL; } 

    STDMETHOD(OnObjectAvailable)(/* [in] */ REFIID riid, /* [iid_is][in] */ IUnknown __RPC_FAR *punk) 
    { return E_NOTIMPL; } 

    // IUnknown stuff 
    STDMETHOD_(ULONG,AddRef)() 
    { return 0; } 

    STDMETHOD_(ULONG,Release)() 
    { return 0; } 

    STDMETHOD(QueryInterface)(/* [in] */ REFIID riid, /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject) 
    { return E_NOTIMPL; } 
}; 

int main() 
{ 
    MyCallback pCallback; 
    HRESULT url = URLDownloadToFile(NULL,_T("https://dl.dropboxusercontent.com/u/102222417/jediAcademy.zip"),_T("C:\\JKA\\file.zip"),0,&pCallback); 

    if(url == S_OK) 
    { 
     printf("Successful!"); 
     getchar(); 
    } 

    else if(url == E_OUTOFMEMORY) 
    { 
     printf("Not enough memory!"); 
    } 

    else if (url == INET_E_DOWNLOAD_FAILURE) 
    { 
     printf("ERROR: INET invalid resource"); 
    } 
    return 0; 
} 

在C代碼運行時,它提供此錯誤

1> ------構建開始:項目:下載++,配置:調試 的Win32 ------ 2012 \ (101): 錯誤C2061:語法錯誤:標識符'MyCallback' 2012 \ projects \ downloader ++ \ downloader ++ \ main.c(101):錯誤C2059: 語法錯誤:';' 2012 \ projects \ downloader ++ \ downloader ++ \ main.c(101):error C2059: 語法錯誤:':' 2012 \ projects \ downloader ++ \ downloader ++ \ main.c(150):error C2065: 'MyCallback':未聲明的標識符 2012 \ projects \ downloader ++ \ downloader ++ \ main.c(150):錯誤C2146: 語法錯誤:缺少';' (151):錯誤C2065: 'pCallback':未聲明的標識符1> studio 2012 \ projects \ downloader ++ \ downloader ++ \ main.c(151):在標識符'pCallback'錯誤 C2275:'HRESULT':非法使用此類型作爲表達式1>
c:\ program files(x86)\ windows kits \ 8.0 \ include \ um \ winnt.h(556):參見 聲明' HRESULT' 2012 \ projects \ downloader ++ \ downloader ++ \ main.c(151):error C2146: 語法錯誤:缺少';'在標識符'url'之前 1> c:\ users \ gamer \ documents \ visual studio 2012 \ projects \ downloader ++ \ downloader ++ \ main.c(151):error C2065: 'url':未聲明的標識符1> c:\ (151):錯誤C2065: 'pCallback':未聲明的標識符 2012 \ projects \ downloader ++ \ downloader ++ \ main.c(151):用戶\ gamer \文檔\ visual studio 2012 \ projects \ downloader ++ \ downloader ++ \ main.c警告C4133: '功能':不兼容的類型 - 從 '詮釋*' 來 'LPBINDSTATUSCALLBACK' 2012 \項目\下載++ \下載++ \ main.c中(153):錯誤C2065: 'URL':未聲明的標識符 2012 \ projects \ downloader ++ \ downloader ++ \ main.c(159):error C2065: 'url':u ndeclared標識符 2012 \ projects \ downloader ++ \ downloader ++ \ main.c(164):error C2065: 'url':未聲明標識符1>生成代碼... ========== Build:0 succeeded ,1失敗,0上最新,0已跳過==========

謝謝:)

+1

「class」在C代碼中不是有效的關鍵字。 –

+0

有沒有辦法轉換代碼,以便它在C中工作? – Jork449

+2

不是此代碼。你必須實現類之外的所有方法(這將是C中的一個'struct')。用C編寫COM coclass對象並非不可能;只是很乏味,在網上應該有很多這樣的例子。基本癥結在於你提供了函數指針的結構,然後在結構定義之外實現它們。不適用於非C函數指針的心臟佯攻,但可行。 – WhozCraig

回答

0

常用的技術是寫包裝函數,當指針傳遞給C時,您的類實例被視爲void*。然後,你暴露就好說了一個功能:

extern "C" MyClass_OnProgress(/* [in] */ void* instance, /* [in] */ ULONG ulProgress, /* [in] */ ULONG ulProgressMax, /* [in] */ ULONG ulStatusCode, /* [in] */ LPCWSTR wszStatusText) 
{ 
    MyClass* _this = static_cast<MyClass*>(instance); 
    _this->OnProgress(ulProgess, ulProgressMax, ulStatusCode, wszStatusText); 
} 

:上面缺少的返回類型,因爲我不知道什麼STDMETHOD宏聲明作爲返回值。

此外,放棄匈牙利符號。這很煩人,已經失寵了。即使微軟建議不要在新代碼中使用它。

+0

我試過了你的建議,但編譯時編譯器給出了類的錯誤(我把MyClass MyCallback改名爲我的代碼)也試過了這個 extern「C」ULONG MyClass_OnProgress(/ * [in] */void * instance ,/ * [in] */ULONG ulProgress,/ * [in] */ULONG ulProgressMax,/ * [in] */ULONG ulStatusCode,/ * [in] */LPCWSTR wszStatusText \t MyCallback * _this = static_cast (instance); \t _this-> OnProgress(ulProgress,ulProgressMax,ulStatusCode,wszStatusText); } – Jork449