Мне нужно создать аддон Firefox, который вызывает код C++. Я провел некоторое исследование и нашел этот урок, чтобы начать работу: http://briankrausz.com/building-a-c-xpcom-component-in-windows/Почему я получаю ошибку C2440 при попытке скомпилировать код XPCOM?
Я выполнил все шаги, но застрял в той части, где мне нужно скомпилировать код с помощью VS. Я использую VS 2005.
Чтобы быть более конкретным, у меня есть проект, который содержит 2 файла заголовка (IMyComponent.h
& MyComponent.h
), а также 2 файлы CPP (MyComponent.cpp
& MyComponentModule.cpp
).
Каждый файл cpp настроен на компиляцию без поддержки CLR и без предварительно скомпилированных заголовков.
Однако, когда я пытаюсь скомпилировать, я получаю 3 C2440 сообщений об ошибках, которые соответствуют следующим строкам коды:
//MyComponentModule.cpp
#include "nsIGenericFactory.h"
#include "MyComponent.h"
NS_GENERIC_FACTORY_CONSTRUCTOR(MyComponent)
static nsModuleComponentInfo components[] =
{
{
MY_COMPONENT_CLASSNAME,
MY_COMPONENT_CID, //'initializing': cannot convert from const char[37] to PRUint32
MY_COMPONENT_CONTRACTID, //'initializing': cannot convert from const char[39] to PRUint16
MyComponentConstructor, //'initializing': cannot convert from nsresult (__stdcall *)(nsISupports *, const nsIID &, void **) to PRUint16
}
};
NS_IMPL_NSGETMODULE("MyComponentsModule", components)
В файле заголовок соответствует У меня есть следующий код:
//MyComponent.h
#ifndef _MY_COMPONENT_H_
#define _MY_COMPONENT_H_
#include "IMyComponent.h"
#define MY_COMPONENT_CONTRACTID "@example.com/XPCOMSample/MyComponent;1"
#define MY_COMPONENT_CLASSNAME "A Simple XPCOM Sample"
#define MY_COMPONENT_CID "4c6f45e0-6366-4c69-Ab68-bb3c75cdada3"
class MyComponent : public IMyComponent
{
public:
NS_DECL_ISUPPORTS
NS_DECL_IMYCOMPONENT
MyComponent();
private:
~MyComponent();
protected:
/* additional members */
};
#endif //_MY_COMPONENT_H_
Весь другой код был сгенерирован с использованием инструмента xpidl.exe, включенного в SDK Gecko.
Может кто-нибудь прокомментировать некоторые подсказки?
PS: Вот nsModuleComponentInfo:
struct nsModuleComponentInfo {
const char* mDescription;
nsCID mCID;
const char* mContractID;
NSConstructorProcPtr mConstructor;
NSRegisterSelfProcPtr mRegisterSelfProc;
NSUnregisterSelfProcPtr mUnregisterSelfProc;
NSFactoryDestructorProcPtr mFactoryDestructor;
NSGetInterfacesProcPtr mGetInterfacesProc;
NSGetLanguageHelperProcPtr mGetLanguageHelperProc;
nsIClassInfo ** mClassInfoGlobal;
PRUint32 mFlags;
};
Вы можете также разместить объявление о 'nsModuleComponentInfo'? –
Возможно, вам нужно каким-то образом применить типы данных. Извините, я не более полезен, потому что я не знаю о методе firefox, но это код ошибки, который, я уверен, вы можете увидеть, если я сам объясню. Он не может преобразовать один тип данных в другой. Символ 'char [x]' действительно представляет собой массив из 1 байта (в большинстве систем) 'int'. Так что, возможно, это из-за его возможностей. [Это] (http://msdn.microsoft.com/en-us/library/sy5tsf8z (v = vs.80) .aspx) всегда полезно! – ChiefTwoPencils
Когда вы объявляете «компоненты», похоже, что вам не хватает нескольких частей данных, которые должны быть в начале структуры до «MY_COMPONENT_CLASSNAME». Фактически перед ID контракта есть 3 члена. –