Почему я получаю ошибку C2440 при попытке скомпилировать код XPCOM?

Мне нужно создать надстройку Firefox, которая вызывает код C ++. Я провел небольшое исследование и нашел этот учебник, который поможет мне начать: http://briankrausz.com/building-ac-xpcom-component-in-windows/.

Я выполнил все шаги, но застрял в той части, где мне нужно скомпилировать код с помощью 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, включенного в Gecko SDK.

Может кто-нибудь подскажет?

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;
 };

person John Smith    schedule 01.08.2012    source источник
comment
Вы также можете разместить объявление nsModuleComponentInfo?   -  person Chris O    schedule 02.08.2012
comment
Возможно, вам понадобится как-то преобразовать типы данных. Извините, я не более полезен, потому что я не знаю о технике firefox, но это код ошибки, который, я уверен, вы можете увидеть, если он не требует пояснений. Он не может преобразовать один тип данных в другой. char[x] - это действительно массив из 1 байта (в большинстве систем) ints. Так что это могло быть так, что это не в его возможностях. ?? Это тоже всегда полезно!   -  person ChiefTwoPencils    schedule 02.08.2012
comment
Когда вы объявляете components, похоже, что вам не хватает нескольких фрагментов данных, которые должны быть в начале структуры перед MY_COMPONENT_CLASSNAME. Фактически перед идентификатором контракта стоят 3 переменные-члены.   -  person Captain Obvlious    schedule 02.08.2012
comment
Крис, пожалуйста, посмотрите исходный пост. Я добавил код, который вы запрашивали.   -  person John Smith    schedule 02.08.2012
comment
Просто примечание: вам лучше использовать js-ctypes, если это возможно (добавьте свой собственную библиотеку для расширения и вызывать ее экспортируемые функции). Компонент XPCOM необходимо перекомпилировать для каждого выпуска Firefox, который выполняется каждые 6 недель.   -  person Wladimir Palant    schedule 08.08.2012


Ответы (1)


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

хотя бы упоминает, как работать с параметром CID:

{ "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}}
person Chris O    schedule 01.08.2012
comment
Я установил для MY_COMPONENT_CID значение, отформатированное как указано выше, и теперь код компилируется. Спасибо - person John Smith; 02.08.2012