Alright, so I’ve been messing around with some Microsoft Windows Update APIs and am attempting to have some asynchronous downloading. The API class class for a callback reference for a class that uses the IDownloadProgressChangedCallback interface More Info About The API Can Be Found Here. What I have done so far is just a shot in the dark (I’ve never messed with callbacks or asynchronous code, or Microsoft API’s for that matter). I keep getting issues with having the same methods being “already defined”. Here is what I have so far:
Relevent code in main method:
IDownloadJob *_DownloadJob = NULL;
tagVARIANT NodeValue ; \\>>PS<< HOW DO I SET THIS TO A DEFUALT VALUE?
hr = _UpdateDownloader->BeginDownload(new DownloadProgressChangedCallback ,new DownloadCompletedCallback, NodeValue,&_DownloadJob);
DownloadProgressChange.h:
#include <Wuapi.h>
#pragma once
class DownloadProgressChangedCallback : public IDownloadProgressChangedCallback
{
public:
HRESULT STDMETHODCALLTYPE Invoke( IDownloadJob *downloadJob, IDownloadProgressChangedCallbackArgs *callbackArgs);
HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid, __RPC__deref_out void __RPC_FAR *__RPC_FAR *ppvObject);
ULONG STDMETHODCALLTYPE AddRef( void) ;
ULONG STDMETHODCALLTYPE Release( void);
};
DownloadProgressChange.cpp:
#include "StdAfx.h"
#include "DownloadProgressChange.h"
HRESULT STDMETHODCALLTYPE Invoke( IDownloadJob *downloadJob, IDownloadProgressChangedCallbackArgs *callbackArgs)
{
return NULL;
}
HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid, __RPC__deref_out void __RPC_FAR *__RPC_FAR *ppvObject)
{
return NULL;
}
ULONG STDMETHODCALLTYPE AddRef( void)
{
return NULL;
}
ULONG STDMETHODCALLTYPE Release( void)
{
return NULL;
}
DownloadCompletedCallback.h
#include <Wuapi.h>
#pragma once
class DownloadCompletedCallback : public IDownloadCompletedCallback
{
public:
HRESULT STDMETHODCALLTYPE Invoke( IDownloadJob *searchJob, IDownloadCompletedCallbackArgs *callbackArgs);
HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid, __RPC__deref_out void __RPC_FAR *__RPC_FAR *ppvObject);
ULONG STDMETHODCALLTYPE AddRef( void) ;
ULONG STDMETHODCALLTYPE Release( void);
};
DownloadCompletedCallback.cpp
#include "StdAfx.h"
#include "DownloadCompletedCallback.h"
HRESULT STDMETHODCALLTYPE Invoke( IDownloadJob *searchJob, IDownloadCompletedCallbackArgs *callbackArgs)
{
return NULL;
}
HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid, __RPC__deref_out void __RPC_FAR *__RPC_FAR *ppvObject)
{
return NULL;
}
ULONG STDMETHODCALLTYPE AddRef( void)
{
return NULL;
}
ULONG STDMETHODCALLTYPE Release( void)
{
return NULL;
}
And Here Is The Response From The Build Output:
1>------ Build started: Project: WinGet, Configuration: Debug Win32 ------
1>Build started 5/29/2011 10:29:15 PM.
1>InitializeBuildStatus:
1> Touching "Debug\WinGet.unsuccessfulbuild".
1>ClCompile:
1> All outputs are up-to-date.
1> All outputs are up-to-date.
1>ManifestResourceCompile:
1> All outputs are up-to-date.
1>DownloadProgressChange.obj : error LNK2005: "long __stdcall QueryInterface(struct _GUID const &,void * *)" (?QueryInterface@@YGJABU_GUID@@PAPAX@Z) already defined in DownloadCompletedCallback.obj
1>DownloadProgressChange.obj : error LNK2005: "unsigned long __stdcall AddRef(void)" (?AddRef@@YGKXZ) already defined in DownloadCompletedCallback.obj
1>DownloadProgressChange.obj : error LNK2005: "unsigned long __stdcall Release(void)" (?Release@@YGKXZ) already defined in DownloadCompletedCallback.obj
1>WinGet.obj : error LNK2001: unresolved external symbol "private: virtual long __stdcall DownloadCompletedCallback::QueryInterface(struct _GUID const &,void * *)" (?QueryInterface@DownloadCompletedCallback@@EAGJABU_GUID@@PAPAX@Z)
1>WinGet.obj : error LNK2001: unresolved external symbol "private: virtual unsigned long __stdcall DownloadCompletedCallback::AddRef(void)" (?AddRef@DownloadCompletedCallback@@EAGKXZ)
1>WinGet.obj : error LNK2001: unresolved external symbol "private: virtual unsigned long __stdcall DownloadCompletedCallback::Release(void)" (?Release@DownloadCompletedCallback@@EAGKXZ)
1>WinGet.obj : error LNK2001: unresolved external symbol "public: virtual long __stdcall DownloadCompletedCallback::Invoke(struct IDownloadJob *,struct IDownloadCompletedCallbackArgs *)" (?Invoke@DownloadCompletedCallback@@UAGJPAUIDownloadJob@@PAUIDownloadCompletedCallbackArgs@@@Z)
1>WinGet.obj : error LNK2001: unresolved external symbol "public: virtual long __stdcall DownloadProgressChangedCallback::QueryInterface(struct _GUID const &,void * *)" (?QueryInterface@DownloadProgressChangedCallback@@UAGJABU_GUID@@PAPAX@Z)
1>WinGet.obj : error LNK2001: unresolved external symbol "public: virtual unsigned long __stdcall DownloadProgressChangedCallback::AddRef(void)" (?AddRef@DownloadProgressChangedCallback@@UAGKXZ)
1>WinGet.obj : error LNK2001: unresolved external symbol "public: virtual unsigned long __stdcall DownloadProgressChangedCallback::Release(void)" (?Release@DownloadProgressChangedCallback@@UAGKXZ)
1>WinGet.obj : error LNK2001: unresolved external symbol "public: virtual long __stdcall DownloadProgressChangedCallback::Invoke(struct IDownloadJob *,struct IDownloadProgressChangedCallbackArgs *)" (?Invoke@DownloadProgressChangedCallback@@UAGJPAUIDownloadJob@@PAUIDownloadProgressChangedCallbackArgs@@@Z)
1>C:\Users\Nathan\Documents\Visual Studio 2010\Projects\WinGet\Debug\WinGet.exe : fatal error LNK1120: 8 unresolved externals
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:01.04
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Thanks in advance!
In your .cpp files, you need to specify the fully-qualified name of the member function you are defining:
[etc.]
Without the
DownloadProgressChangedCallback::prefix, you are just defining a global function named “Invoke”. The linker is complaining because (a) you have done that twice and (b) you have not defined the actual member functions you declared.