2012-08-01 4 views
1

Мне нужно создать аддон 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; 
}; 
+0

Вы можете также разместить объявление о 'nsModuleComponentInfo'? –

+0

Возможно, вам нужно каким-то образом применить типы данных. Извините, я не более полезен, потому что я не знаю о методе firefox, но это код ошибки, который, я уверен, вы можете увидеть, если я сам объясню. Он не может преобразовать один тип данных в другой. Символ 'char [x]' действительно представляет собой массив из 1 байта (в большинстве систем) 'int'. Так что, возможно, это из-за его возможностей. [Это] (http://msdn.microsoft.com/en-us/library/sy5tsf8z (v = vs.80) .aspx) всегда полезно! – ChiefTwoPencils

+0

Когда вы объявляете «компоненты», похоже, что вам не хватает нескольких частей данных, которые должны быть в начале структуры до «MY_COMPONENT_CLASSNAME». Фактически перед ID контракта есть 3 члена. –

ответ

1

Первая ошибка в том, что вы пытаетесь передать в char * вместо требуемого типа. Эта страница: https://developer.mozilla.org/en/Adding_XPCOM_components_to_Mozilla_build_system

по крайней мере упоминает, как иметь дело с РТВ парам:

{ "Friendly class description for people to read", 
YOUR_CLASS_CID, 
YOUR_CLASS_CONTRACTID, 
nsYourConcreteClassNameConstructor } 

и

/* 2d96b3d0-c051-11d1-a827-0040959a28c9 */ 
#define NS_WINDOW_CID \ 
{ 0x2d96b3d0, 0xc051, 0x11d1, \ 
{0xa8, 0x27, 0x00, 0x40, 0x95, 0x9a, 0x28, 0xc9}} 
+0

Я установил MY_COMPONENT_CID на значение, отформатированное как выше, и код теперь компилируется. благодаря –

Смежные вопросы