Мне нужно создать надстройку 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;
};
nsModuleComponentInfo
? - person Chris O   schedule 02.08.2012char[x]
- это действительно массив из 1 байта (в большинстве систем)int
s. Так что это могло быть так, что это не в его возможностях. ?? Это тоже всегда полезно! - person ChiefTwoPencils   schedule 02.08.2012components
, похоже, что вам не хватает нескольких фрагментов данных, которые должны быть в начале структуры передMY_COMPONENT_CLASSNAME
. Фактически перед идентификатором контракта стоят 3 переменные-члены. - person Captain Obvlious   schedule 02.08.2012