Hello, everyone, Could you please take a look at the problem I encountered while compiling WebLock.cpp? I have a class myEnumerator in the same file. When I compile, I got the following errors. I looked at the Appendix in your book and couldn't figure out why. > I attached all the files needed to compile. If you need more info, pls let me know. Thank you.
myEnumerator.cpp: In instantiation of `nsDerivedSafe<nsIComponentManager>':
myEnumerator.cpp:75: instantiated from here
myEnumerator.cpp:75: base class `nsIComponentManager' has incomplete type
myEnumerator.cpp: In member function `virtual nsresult
myEnumerator::GetNext(nsISupports**)':
myEnumerator.cpp:78: no matching function for call to `
nsDerivedSafe<nsIComponentManager>::CreateInstance(const nsCID&, int, const
nsID&, void**)'
Adele
CXX = c++
CPPFLAGS += -fno-rtti \
-fno-exceptions \
-shared
# Change this to point at your Gecko SDK directory.
GECKO_SDK_PATH = /home/adele/gecko-sdk
# GCC only define which allows us to not have to #include mozilla-config
# in every .cpp file. If your not using GCC remove this line and add
# #include "mozilla-config.h" to each of your .cpp files.
GECKO_CONFIG_INCLUDE = -include mozilla-config.h
GECKO_DEFINES = -DXPCOM_GLUE -DMOZILLA_STRICT_API
GECKO_INCLUDES = -I $(GECKO_SDK_PATH) \
-I $(GECKO_SDK_PATH)/xpcom/include \
-I $(GECKO_SDK_PATH)/nspr/include \
-I $(GECKO_SDK_PATH)/string/include \
-I $(GECKO_SDK_PATH)/embedstring/include \
-I .
GECKO_LDFLAGS = -L $(GECKO_SDK_PATH)/xpcom/bin -lxpcomglue \
-L $(GECKO_SDK_PATH)/nspr/bin -lnspr4 \
-L $(GECKO_SDK_PATH)/nspr/bin -lplds4 \
-L $(GECKO_SDK_PATH)/embedstring/bin/ -lembedstring
build:
$(CXX) -c $(GECKO_CONFIG_INCLUDE) $(GECKO_DEFINES) $(GECKO_INCLUDES)
$(GECKO_LDFLAGS) $(CPPFLAGS) $(CXXFLAGS) myEnumerator.cpp
clean:
#include "nsIGenericFactory.h"
#include "nsCOMPtr.h"
#include "nsXPCOM.h"
#include "nsIServiceManager.h"
#include "nsICategoryManager.h"
#include "nsIObserver.h"
#include "nsEmbedString.h"
#include "nsMemory.h"
#include "nsXPCOMCID.h"
#include "nsISupportsPrimitives.h"
#include <stdlib.h>
static NS_DEFINE_CID(kSupportsCStringCID, NS_SUPPORTS_CSTRING_CID);
// a simple link list.
struct urlNode
{
char* urlString;
struct urlNode* next;
};
class myEnumerator : public nsISimpleEnumerator
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSISIMPLEENUMERATOR
myEnumerator(urlNode* node) { mNode = node; }
virtual ~myEnumerator(void) {}
protected:
urlNode* mNode;
nsCOMPtr<nsIComponentManager> mCompMgr;
};
NS_IMETHODIMP
myEnumerator::HasMoreElements(PRBool* aResult)
{
if (!aResult)
return NS_ERROR_NULL_POINTER;
if (!mNode) {
*aResult = PR_FALSE;
return NS_OK;
}
*aResult = PR_TRUE;
return NS_OK;
}
NS_IMETHODIMP
myEnumerator::GetNext(nsISupports** aResult)
{
if (! aResult)
return NS_ERROR_NULL_POINTER;
*aResult = nsnull;
if (!mNode)
return NS_ERROR_FAILURE;
if (!mCompMgr) {
NS_GetComponentManager(getter_AddRefs(mCompMgr));
if (!mCompMgr)
return NS_ERROR_UNEXPECTED;
}
nsISupportsCString* stringSupports;
mCompMgr->CreateInstance(kSupportsCStringCID,
nsnull,
NS_GET_IID(nsISupportsCString),
(void**)&stringSupports);
if (!stringSupports)
return NS_ERROR_UNEXPECTED;
nsEmbedCString str(mNode->urlString);
stringSupports->SetData(str);
*aResult = stringSupports; // addref'ed above.
mNode = mNode->next;
return NS_OK;
}
