我似乎遇到了問題。我試圖讓C++函數在c代碼中使用。將C++轉換爲C在C中使用C++
我嘗試這些方法
- http://www.olivierlanglois.net/idioms_for_using_cpp_in_c_programs.html
- Calling "C++" class member function from "C" code
,如果我需要擺脫類的完全的話,我會的,但我不希望失去的下載飼料到控制檯。
這是在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已跳過==========
謝謝:)
「class」在C代碼中不是有效的關鍵字。 –
有沒有辦法轉換代碼,以便它在C中工作? – Jork449
不是此代碼。你必須實現類之外的所有方法(這將是C中的一個'struct')。用C編寫COM coclass對象並非不可能;只是很乏味,在網上應該有很多這樣的例子。基本癥結在於你提供了函數指針的結構,然後在結構定義之外實現它們。不適用於非C函數指針的心臟佯攻,但可行。 – WhozCraig