为什么在编译XPCOM代码时会出现错误C2440? 我需要创建一个调用C++代码的Firefox插件。我做了一些研究,发现本教程可以帮助我开始学习:

为什么在编译XPCOM代码时会出现错误C2440? 我需要创建一个调用C++代码的Firefox插件。我做了一些研究,发现本教程可以帮助我开始学习:,c++,firefox,firefox-addon,xpcom,gecko,C++,Firefox,Firefox Addon,Xpcom,Gecko,我遵循了所有的步骤,但在需要使用VS编译代码的部分遇到了问题。我使用的是VS2005 更具体地说,我有一个包含2个头文件(IMyComponent.h&MyComponent.h)和2个cpp文件(MyComponent.cpp&MyComponentModule.cpp) 每个cpp文件都配置为在不支持CLR和不使用预编译头的情况下编译 但是,当我尝试编译时,会收到3条C2440错误消息,它们对应于以下代码行: //MyComponentModule.cpp #include "nsIGen

我遵循了所有的步骤,但在需要使用VS编译代码的部分遇到了问题。我使用的是VS2005

更具体地说,我有一个包含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_
所有其他代码都是使用Gecko SDK附带的xpidl.exe工具生成的

有人能给点提示吗

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

第一个错误是因为您试图传入一个
char*
,而不是所需的类型。本页:

至少提到了如何处理CID参数:

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


第一个错误是因为您试图传入一个
char*
,而不是所需的类型。本页:

至少提到了如何处理CID参数:

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


您还可以发布
nsModuleComponentInfo
的声明吗?您可能需要某种方法来转换数据类型。对不起,我没有更多的帮助,因为我不知道firefox的技术,但这是一个错误代码,我相信你可以看到,如果不言自明。它无法将一种数据类型转换为另一种。
char[x]
实际上是一个1字节的数组(在大多数系统上)
int
s。所以它可能是超出了它的能力。??也总是很有帮助的!当您声明
components
时,您似乎丢失了一些应该位于
MY\u COMPONENT\u CLASSNAME
之前的结构开头的数据。事实上,在合同ID之前有3个成员变量。Chris,请参阅原始帖子。我已经添加了您要求的代码。请注意:如果可能,您最好使用(将您自己的库添加到扩展中,并调用其导出的函数)。每个Firefox版本每6周需要重新编译一个XPCOM组件。您是否也可以发布
nsModuleComponentInfo
的声明?您可能需要某种方法来转换数据类型。对不起,我没有更多的帮助,因为我不知道firefox的技术,但这是一个错误代码,我相信你可以看到,如果不言自明。它无法将一种数据类型转换为另一种。
char[x]
实际上是一个1字节的数组(在大多数系统上)
int
s。所以它可能是超出了它的能力。??也总是很有帮助的!当您声明
components
时,您似乎丢失了一些应该位于
MY\u COMPONENT\u CLASSNAME
之前的结构开头的数据。事实上,在合同ID之前有3个成员变量。Chris,请参阅原始帖子。我已经添加了您要求的代码。请注意:如果可能,您最好使用(将您自己的库添加到扩展中,并调用其导出的函数)。每个Firefox版本每6周需要重新编译一个XPCOM组件。我将我的\u component\u CID设置为与上面格式相同的值,代码现在可以编译了。ThanksI将MY_COMPONENT_CID设置为类似于上述格式的值,代码现在可以编译了。谢谢