3 / 3 / 1
Регистрация: 05.07.2013
Сообщений: 39
1

Ошибка в DLL 800401F9

16.03.2015, 12:14. Показов 1957. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Изучаю технологию COM, возникли некоторые проблемы. Есть код:

IFace.h
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <objbase.h>
#include <initguid.h>
extern "C" 
{
 
    // {BA84A25E-EFF5-4AB7-9A0E-133551BCA8EC}
    extern const IID IID_IX = 
    { 0xba84a25e, 0xeff5, 0x4ab7, { 0x9a, 0xe, 0x13, 0x35, 0x51, 0xbc, 0xa8, 0xec } };
 
    // {6E2E4941-FEE3-4135-9DEC-8C0F23928662}
    extern const CLSID CLSID_Component1 = 
    { 0x6e2e4941, 0xfee3, 0x4135, { 0x9d, 0xec, 0x8c, 0xf, 0x23, 0x92, 0x86, 0x62 } };
 
}
 
interface IX : IUnknown
{
    virtual int __stdcall Fx() = 0 ;
} ;


Сам компонент:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <objbase.h>
#include "REGISTRY.H"
#include "Iface.h"
 
 
void trace(const char* msg) { std::cout << "Component 1:\t" << msg << std::endl ;}
 
 
class CA : public IX
{
    
    virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv) ;          
    virtual ULONG __stdcall AddRef() ;
    virtual ULONG __stdcall Release() ;
 
    
    virtual int __stdcall Fx() { return 0;}
 
public:
    
    CA() { m_cRef=0;}
 
 
    ~CA() { }
 
private:
    long m_cRef ;
} ;
 
HRESULT __stdcall CA::QueryInterface(const IID& iid, void** ppv)
{   
    if (iid == IID_IUnknown)
    {
        //trace("Return pointer to IUnknown.") ;
        *ppv = static_cast<IUnknown*>(this) ;
    } 
    else if (iid == IID_IX)
    {
    //  trace("Return pointer to IX.") ;
        *ppv = static_cast<IX*>(this) ;
    }
    else
    {      
        //trace("Interface not supported.") ;
        *ppv = NULL ;
        return E_NOINTERFACE ;
    }
    reinterpret_cast<IUnknown*>(*ppv)->AddRef() ; 
    return S_OK ;
}
 
ULONG __stdcall CA::AddRef()
{
    return InterlockedIncrement(&m_cRef) ;
}
 
ULONG __stdcall CA::Release() 
{
    if (InterlockedDecrement(&m_cRef) == 0)
    {
        delete this ;
        return 0 ;
    }
    return m_cRef ;
}
 
//
// Creation function
//
extern "C" IUnknown* CreateInstance()
{
    IUnknown* pI = static_cast<IX*>(new CA) ;
    pI->AddRef() ;
    return pI ;
}


IDL
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import "oaidl.idl";
import "ocidl.idl";
 
 
[ 
 object, 
 uuid(BA84A25E-EFF5-4AB7-9A0E-133551BCA8EC), 
 helpstring("IX Interface"), 
 pointer_default(unique) 
] 
interface IX : IUnknown 
{ 
  HRESULT Fx(); 
}; 
 
[ 
uuid(CF40076E-C9E5-46F0-88A7-C7971D737474), 
version(1.0), 
helpstring("ПопыткаCOM") 
] 
library COMLIBEPTA
{ 
importlib("stdole32.tlb"); 
 
[ 
uuid(6E2E4941-FEE3-4135-9DEC-8C0F23928662), 
helpstring("CAкласс10")
] 
coclass CA 
{ 
 [default] interface IX;  }; 
};


На выходе получаю dll и tlb. Без проблем регистрируется в системе. Но, при попытке использовать в программе, вываливается с ошибкой:

Не удалось получить фабрику класса COM для компонента с CLSID {6E2E4941-FEE3-4135-9DEC-8C0F23928662} из-за следующей ошибки: 800401f9 Ошибка в библиотеке DLL (Исключение из HRESULT: 0x800401F9 (CO_E_ERRORINDLL)).
Подскажите, пожалуйста, в чем проблема. Уже столько времени с этим бьюсь. Заранее спасибо.

Код тестовой программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// ConsoleApplication12.cpp: главный файл проекта.
 
#include "stdafx.h"
 
using namespace System;
 
int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"Здравствуй, мир!");
    COMLIBEPTA::IX^ test;
    test=gcnew COMLIBEPTA::CAClass;
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.03.2015, 12:14
Ответы с готовыми решениями:

Что за ошибка: ошибка '800401f9' ?
Люди добрые помогите пожалуйста. При обращении к БД (MS Access) возникает такое: ошибка '800401f9'...

Ошибка об отсутствии MSVCP140D.dll, ucrtbased.dll, CONCRT140D.dll, VCRUNTIME140D.dll
Добрый день, товарищи. Возникла проблема. Делаю программу с использованием openCV 3.1 на Visual...

Visual Basic + VC++ DLL = ошибка Bad DLL calling convertation
Попытался я написать DLL-ку на VC++, для последующего использования ее в VB. Но поскольку я в VC++...

Ошибка Can't find DLL entry point CryptEnumProvidersA in advapi32.dll
Проблема вот в чем. Объявляем CryptEnumProviderTypesA Private Declare Function...

3
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
16.03.2015, 12:57 2
Цитата Сообщение от Jester-X Посмотреть сообщение
Подскажите
а где собственно фабрика классов в вашем коде?

Добавлено через 54 секунды
...и код DLL на всякий случай где?
0
3 / 3 / 1
Регистрация: 05.07.2013
Сообщений: 39
16.03.2015, 13:01  [ТС] 3
То есть для того, что бы использовать библиотеку типов, обязательно нужна фабрика классов? Упс...
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
16.03.2015, 13:14 4
Лучший ответ Сообщение было отмечено Jester-X как решение

Решение

Цитата Сообщение от Jester-X Посмотреть сообщение
для того, что бы использовать библиотеку типов, обязательно нужна фабрика классов?
нужно определить фабрику и собрать DLL с соответствующими экспортами

Добавлено через 1 минуту
...иначе что создаст для вас объект?
1
16.03.2015, 13:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.03.2015, 13:14
Помогаю со студенческими работами здесь

EXE & DLL, DLL не запускается, 500 ошибка
Делаю EXE, скрипт простой, всё работает, на Apache и FPServer. Компилирую в DLL, закидываю на...

Слетели библиотеки .dll При запуске любых приложений на компьютере вылетает ошибка с расширением .dll
Не запускается приложения на windows 8. А также удалились точки доступа Восстановления Системы и...

Spell Checker ошибка: Word cannot find the spelling file mssp3RU.dll or mssp232.dll for Russian (Russia).
object nothing = Missing.Value; Pitayus ispolzivat Spell Checker Word-a tolko vot chto...

При запуске Nero ошибка "Точка входа в процедуру не найдена в библиотеке DLL uNeroErr.dll
Доброй ночи! Помогите пожалуйста чайнику! При запуске Nero выскакивает ошибка: Точка входа в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru