С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
3 / 3 / 1
Регистрация: 05.07.2013
Сообщений: 39

E_NOINTERFACE COM

23.03.2015, 13:41. Показов 2463. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Взял пример кода из книги Д. Роджерсона. Его скомпилированный вариант работает на ура, но при попытке повторить сам, получаю следующую ошибку:

Невозможно привести COM-объект типа "TestCOMLib.ComponentClass" к интерфейсному типу "TestCOMLib.IX". Операция завершилась со сбоем, поскольку вызов QueryInterface COM-компонента для интерфейса с IID "{83680BFB-53DF-49AC-9740-F68B0EC7A5D5}" возвратил следующую ошибку: Интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE)).
Падает, при вызове функции Fx(). Вот вывод до ошибки:
DllGetClassObject: Create class factory.
Class factory: Create component.
Fx
Class factory: Destroy self.
Component: Return pointer to IX.
Component: Return pointer to IX.
То есть он прекрасно создает объект. Но при вызове функции - падает. Подскажите, пожалуйста, в чем может быть проблема. Вот сам код:

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <objbase.h>
 
// {83680BFB-53DF-49AC-9740-F68B0EC7A5D5} 
extern "C" const IID IID_IX =   
{ 0x83680bfb, 0x53df, 0x49ac, { 0x97, 0x40, 0xf6, 0x8b, 0xe, 0xc7, 0xa5, 0xd5 } };
 
// {BC4DA596-0C2A-4DFB-960A-C63E007F3860}
extern "C" const CLSID CLSID_Component1 =
{ 0xbc4da596, 0xc2a, 0x4dfb, { 0x96, 0xa, 0xc6, 0x3e, 0x0, 0x7f, 0x38, 0x60 } };
 
 
//
// Iface.h - 
//    Declarations of interfaces, IIDs, and CLSID
//    shared by the client and the component.
//
interface IX : IUnknown
{
    virtual void pascal Fx() = 0 ;
};


main.cpp - Фабрика классов, сам класс и экспортируемые функции.
Кликните здесь для просмотра всего текста

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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
//
// Cmpnt.cpp
//
#include <iostream>
#include <objbase.h>
 
#include "Iface.h"      // Interface declarations
#include "reg.h"
 
// Trace function
void trace(const char* msg) { std::cout << msg << std::endl ;}
 
///////////////////////////////////////////////////////////
//
// Global variables
//
static HMODULE g_hModule = NULL ;   // DLL module handle
static long g_cComponents = 0 ;     // Count of active components
static long g_cServerLocks = 0 ;    // Count of locks
 
// Friendly name of component
const char g_szFriendlyName[] = "Inside COM, Chapter 7 Example" ;
 
// Version-independent ProgID
const char g_szVerIndProgID[] = "InsideCOM.Chap07" ;
 
// ProgID
const char g_szProgID[] = "InsideCOM.Chap07.1" ;
 
 
///////////////////////////////////////////////////////////
//
// Component 
//
class CA : public IX
{
public:
    // IUnknown
    virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv) ;
    virtual ULONG __stdcall AddRef() ;
    virtual ULONG __stdcall Release() ;
 
    // Interface IX
    virtual void __stdcall Fx() { std::cout << "Fx" << std::endl ;}
 
    // Constructor
    CA() ;
 
    // Destructor
    ~CA() ;
 
private:
    // Reference count
    long m_cRef ;
} ;
 
 
//
// Constructor
//
CA::CA() : m_cRef(1)
{ 
    InterlockedIncrement(&g_cComponents) ; 
    MessageBox(NULL,"Hello, World!","Test",MB_OK);
    Fx();
}
 
//
// Destructor
//
CA::~CA() 
{ 
    InterlockedDecrement(&g_cComponents) ; 
    trace("Component:\t\tDestroy self. LOL") ;
}
 
//
// IUnknown implementation
//
HRESULT __stdcall CA::QueryInterface(const IID& iid, void** ppv)
{    
    if (iid == IID_IUnknown)
    {
        *ppv = static_cast<IX*>(this) ; 
    }
    else if (iid == IID_IX)
    {
        *ppv = static_cast<IX*>(this) ;
        trace("Component:\t\tReturn pointer to IX.") ; 
    }
    else
    {
        *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 ;
}
 
 
///////////////////////////////////////////////////////////
//
// Class factory
//
class CFactory : public IClassFactory
{
public:
    // IUnknown
    virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv) ;         
    virtual ULONG   __stdcall AddRef() ;
    virtual ULONG   __stdcall Release() ;
 
    // Interface IClassFactory
    virtual HRESULT __stdcall CreateInstance(IUnknown* pUnknownOuter,
        const IID& iid,
        void** ppv) ;
    virtual HRESULT __stdcall LockServer(BOOL bLock) ; 
 
    // Constructor
    CFactory() : m_cRef(1) {}
 
    // Destructor
    ~CFactory() { trace("Class factory:\t\tDestroy self.") ;}
 
private:
    long m_cRef ;
} ;
 
//
// Class factory IUnknown implementation
//
HRESULT __stdcall CFactory::QueryInterface(const IID& iid, void** ppv)
{    
    if ((iid == IID_IUnknown) || (iid == IID_IClassFactory))
    {
        *ppv = static_cast<IClassFactory*>(this) ; 
    }
    else
    {
        //MessageBox(NULL,"Factory","Test",MB_OK);
        *ppv = NULL ;
        return E_NOINTERFACE ;
    }
    reinterpret_cast<IUnknown*>(*ppv)->AddRef() ;
    return S_OK ;
}
 
ULONG __stdcall CFactory::AddRef()
{
    return InterlockedIncrement(&m_cRef) ;
}
 
ULONG __stdcall CFactory::Release() 
{
    if (InterlockedDecrement(&m_cRef) == 0)
    {
        delete this ;
        return 0 ;
    }
    return m_cRef ;
}
 
//
// IClassFactory implementation
//
HRESULT __stdcall CFactory::CreateInstance(IUnknown* pUnknownOuter,
                                           const IID& iid,
                                           void** ppv) 
{
    trace("Class factory:\t\tCreate component.") ;
 
    // Cannot aggregate.
    if (pUnknownOuter != NULL)
    {
        return CLASS_E_NOAGGREGATION ;
    }
 
    // Create component.
    CA* pA = new CA ;
    if (pA == NULL)
    {
        return E_OUTOFMEMORY ;
    }
 
    // Get the requested interface.
    HRESULT hr = pA->QueryInterface(iid, ppv) ;
    
    // Release the IUnknown pointer.
    // (If QueryInterface failed, component will delete itself.)
    pA->Release() ;
    return hr ;
}
 
// LockServer
HRESULT __stdcall CFactory::LockServer(BOOL bLock) 
{
    if (bLock)
    {
        InterlockedIncrement(&g_cServerLocks) ; 
    }
    else
    {
        InterlockedDecrement(&g_cServerLocks) ;
    }
    return S_OK ;
}
 
 
///////////////////////////////////////////////////////////
//
// Exported functions
//
 
//
// Can DLL unload now?
//
STDAPI DllCanUnloadNow()
{
    if ((g_cComponents == 0) && (g_cServerLocks == 0))
    {
        return S_OK ;
    }
    else
    {
        return S_FALSE ;
    }
}
 
//
// Get class factory
//
STDAPI DllGetClassObject(const CLSID& clsid,
                         const IID& iid,
                         void** ppv)
{
    trace("DllGetClassObject:\tCreate class factory.") ;
 
    // Can we create this component?
    if (clsid != CLSID_Component1)
    {
        return CLASS_E_CLASSNOTAVAILABLE ;
    }
 
    // Create class factory.
    CFactory* pFactory = new CFactory ;  // No AddRef in constructor
    if (pFactory == NULL)
    {
        return E_OUTOFMEMORY ;
    }
 
    // Get requested interface.
    HRESULT hr = pFactory->QueryInterface(iid, ppv) ;
    pFactory->Release() ;
 
    return hr ;
}
 
//
// Server registration
//
STDAPI DllRegisterServer()
{
    return RegisterServer(g_hModule, 
        CLSID_Component1,
        g_szFriendlyName,
        g_szVerIndProgID,
        g_szProgID) ;
}
 
 
//
// Server unregistration
//
STDAPI DllUnregisterServer()
{
    return UnregisterServer(CLSID_Component1,
        g_szVerIndProgID,
        g_szProgID) ;
}
 
///////////////////////////////////////////////////////////
//
// DLL module information
//
BOOL APIENTRY DllMain(HANDLE hModule,
                      DWORD dwReason,
                      void* lpReserved)
{
    if (dwReason == DLL_PROCESS_ATTACH)
    {
        g_hModule = (HMODULE)hModule ;
    }
    return TRUE ;
}


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

[
object,
uuid(83680BFB-53DF-49AC-9740-F68B0EC7A5D5),
helpstring("IX Interface"),
pointer_default(unique),
dual,
oleautomation
]
interface IX : IDispatch
{
import "oaidl.idl" ;

HRESULT Fx() ;

} ;

//
// Component and type library descriptions
//
[
uuid(7C268850-CDA2-4319-8907-F6AAA3DD9696),
version(1.0),
helpstring("Inside COM, Chapter 11 1.0 Type Library")
]
library TestCOMLib
{
importlib("stdole32.tlb") ;

// Component
[
uuid(BC4DA596-0C2A-4DFB-960A-C63E007F3860),
helpstring("Component Class")
]
coclass Component
{
[default] interface IX ;
} ;
} ;


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

LIBRARY Win32Project11


EXPORTS
DllGetClassObject @2 PRIVATE
DllCanUnloadNow @3 PRIVATE
DllRegisterServer @4 PRIVATE
DllUnregisterServer @5 PRIVATE
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.03.2015, 13:41
Ответы с готовыми решениями:

Фильтр DirectShow. Query Interface выдает E_NOINTERFACE
В общем, ситуация следующая: есть самописный transfer-фильтр DirectShow, который успешно регистрируется в системе и с помощью которого...


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

Или воспользуйтесь поиском по форуму:
5
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
23.03.2015, 17:54
На первый взгляд, никакого "криминала" в коде нет.
Но очень смущает вот это:
C++
1
2
3
4
5
6
7
8
9
//
// Iface.h - 
//    Declarations of interfaces, IIDs, and CLSID
//    shared by the client and the component.
//
interface IX : IUnknown
{
    virtual void pascal Fx() = 0 ;
};
А в IDL-файле интерфейс объявлен иначе:
Code
1
2
3
4
5
6
interface IX : IDispatch
{
import "oaidl.idl" ;
 
HRESULT Fx() ;
} ;
Во-первых, разные наследники (IUnknown и IDispatch), во-вторых,
разные сигнатуры метода Fx.

И вообще, COM-серверы пишутся по-другому: сначала вы описываете
интерфейсы в IDL-файле, компилируете его MIDL-компилятором и
подключаете полученные файлы .c и .h к своему проекту.
Пробуйте так. Самому описывать на C/C++ интерфейсы не нужно.
0
3 / 3 / 1
Регистрация: 05.07.2013
Сообщений: 39
25.03.2015, 22:11  [ТС]
Изменил функцию:
C++
1
virtual HRESULT __stdcall Fx() { std::cout << "Fx" << std::endl ; return S_OK;}
С помощью MIDL-компилятора 4 файла:
source_h.h
source_i.c
source_p.c
dlldata.c

Проблема в том, что при подключении последних двух возникают ошибки линковки. Пример:
Ошибка 14 error LNK2001: неразрешенный внешний символ "_CStdStubBuffer_QueryInterface@12" C:\Users\Conte_000\documents\visual studio 2012\Projects\Win32Project11\Win32Projec t11\source_p.obj

Если подключить только первые два - компилируется, но все та же ошибка.


Файлы:
source_h.h
Кликните здесь для просмотра всего текста
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
/* this ALWAYS GENERATED file contains the definitions for the interfaces */
 
 
 /* File created by MIDL compiler version 8.00.0595 */
/* at Thu Mar 26 00:06:53 2015
 */
/* Compiler settings for source.idl:
    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.00.0595 
    protocol : dce , ms_ext, c_ext, robust
    error checks: allocation ref bounds_check enum stub_data 
    VC __declspec() decoration level: 
         __declspec(uuid()), __declspec(selectany), __declspec(novtable)
         DECLSPEC_UUID(), MIDL_INTERFACE()
*/
/* @@MIDL_FILE_HEADING(  ) */
 
#pragma warning( disable: 4049 )  /* more than 64k source lines */
 
 
/* verify that the <rpcndr.h> version is high enough to compile this file*/
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
 
#include "rpc.h"
#include "rpcndr.h"
 
#ifndef __RPCNDR_H_VERSION__
#error this stub requires an updated version of <rpcndr.h>
#endif // __RPCNDR_H_VERSION__
 
#ifndef COM_NO_WINDOWS_H
#include "windows.h"
#include "ole2.h"
#endif /*COM_NO_WINDOWS_H*/
 
#ifndef __source_h_h__
#define __source_h_h__
 
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#pragma once
#endif
 
/* Forward Declarations */ 
 
#ifndef __IX_FWD_DEFINED__
#define __IX_FWD_DEFINED__
typedef interface IX IX;
 
#endif  /* __IX_FWD_DEFINED__ */
 
 
#ifndef __Component_FWD_DEFINED__
#define __Component_FWD_DEFINED__
 
#ifdef __cplusplus
typedef class Component Component;
#else
typedef struct Component Component;
#endif /* __cplusplus */
 
#endif  /* __Component_FWD_DEFINED__ */
 
 
/* header files for imported files */
#include "oaidl.h"
 
#ifdef __cplusplus
extern "C"{
#endif 
 
 
#ifndef __IX_INTERFACE_DEFINED__
#define __IX_INTERFACE_DEFINED__
 
/* interface IX */
/* [oleautomation][dual][unique][helpstring][uuid][object] */ 
 
 
EXTERN_C const IID IID_IX;
 
#if defined(__cplusplus) && !defined(CINTERFACE)
    
    MIDL_INTERFACE("83680BFB-53DF-49AC-9740-F68B0EC7A5D5")
    IX : public IUnknown
    {
    public:
        virtual HRESULT STDMETHODCALLTYPE Fx( void) = 0;
        
    };
    
    
#else   /* C style interface */
 
    typedef struct IXVtbl
    {
        BEGIN_INTERFACE
        
        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
            IX * This,
            /* [in] */ REFIID riid,
            /* [annotation][iid_is][out] */ 
            _COM_Outptr_  void **ppvObject);
        
        ULONG ( STDMETHODCALLTYPE *AddRef )( 
            IX * This);
        
        ULONG ( STDMETHODCALLTYPE *Release )( 
            IX * This);
        
        HRESULT ( STDMETHODCALLTYPE *Fx )( 
            IX * This);
        
        END_INTERFACE
    } IXVtbl;
 
    interface IX
    {
        CONST_VTBL struct IXVtbl *lpVtbl;
    };
 
    
 
#ifdef COBJMACROS
 
 
#define IX_QueryInterface(This,riid,ppvObject)  \
    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) 
 
#define IX_AddRef(This) \
    ( (This)->lpVtbl -> AddRef(This) ) 
 
#define IX_Release(This)    \
    ( (This)->lpVtbl -> Release(This) ) 
 
 
#define IX_Fx(This) \
    ( (This)->lpVtbl -> Fx(This) ) 
 
#endif /* COBJMACROS */
 
 
#endif  /* C style interface */
 
 
 
 
#endif  /* __IX_INTERFACE_DEFINED__ */
 
 
 
#ifndef __TestCOMLib_LIBRARY_DEFINED__
#define __TestCOMLib_LIBRARY_DEFINED__
 
/* library TestCOMLib */
/* [helpstring][version][uuid] */ 
 
 
EXTERN_C const IID LIBID_TestCOMLib;
 
EXTERN_C const CLSID CLSID_Component;
 
#ifdef __cplusplus
 
class DECLSPEC_UUID("BC4DA596-0C2A-4DFB-960A-C63E007F3860")
Component;
#endif
#endif /* __TestCOMLib_LIBRARY_DEFINED__ */
 
/* Additional Prototypes for ALL interfaces */
 
/* end of Additional Prototypes */
 
#ifdef __cplusplus
}
#endif
 
#endif

source_i.c
Кликните здесь для просмотра всего текста
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
77
78
79
80
/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */
 
/* link this file in with the server and any clients */
 
 
 /* File created by MIDL compiler version 8.00.0595 */
/* at Thu Mar 26 00:06:53 2015
 */
/* Compiler settings for source.idl:
    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.00.0595 
    protocol : dce , ms_ext, c_ext, robust
    error checks: allocation ref bounds_check enum stub_data 
    VC __declspec() decoration level: 
         __declspec(uuid()), __declspec(selectany), __declspec(novtable)
         DECLSPEC_UUID(), MIDL_INTERFACE()
*/
/* @@MIDL_FILE_HEADING(  ) */
 
#pragma warning( disable: 4049 )  /* more than 64k source lines */
 
 
#ifdef __cplusplus
extern "C"{
#endif 
 
 
#include <rpc.h>
#include <rpcndr.h>
 
#ifdef _MIDL_USE_GUIDDEF_
 
#ifndef INITGUID
#define INITGUID
#include <guiddef.h>
#undef INITGUID
#else
#include <guiddef.h>
#endif
 
#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
        DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8)
 
#else // !_MIDL_USE_GUIDDEF_
 
#ifndef __IID_DEFINED__
#define __IID_DEFINED__
 
typedef struct _IID
{
    unsigned long x;
    unsigned short s1;
    unsigned short s2;
    unsigned char  c[8];
} IID;
 
#endif // __IID_DEFINED__
 
#ifndef CLSID_DEFINED
#define CLSID_DEFINED
typedef IID CLSID;
#endif // CLSID_DEFINED
 
#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
        const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
 
#endif !_MIDL_USE_GUIDDEF_
 
MIDL_DEFINE_GUID(IID, IID_IX,0x83680BFB,0x53DF,0x49AC,0x97,0x40,0xF6,0x8B,0x0E,0xC7,0xA5,0xD5);
 
 
MIDL_DEFINE_GUID(IID, LIBID_TestCOMLib,0x7C268850,0xCDA2,0x4319,0x89,0x07,0xF6,0xAA,0xA3,0xDD,0x96,0x96);
 
 
MIDL_DEFINE_GUID(CLSID, CLSID_Component,0xBC4DA596,0x0C2A,0x4DFB,0x96,0x0A,0xC6,0x3E,0x00,0x7F,0x38,0x60);
 
#undef MIDL_DEFINE_GUID
 
#ifdef __cplusplus
}
#endif
0
3 / 3 / 1
Регистрация: 05.07.2013
Сообщений: 39
25.03.2015, 22:11  [ТС]
source_p.c
Кликните здесь для просмотра всего текста
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
/* this ALWAYS GENERATED file contains the proxy stub code */
 
 
 /* File created by MIDL compiler version 8.00.0595 */
/* at Thu Mar 26 00:06:53 2015
 */
/* Compiler settings for source.idl:
    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.00.0595 
    protocol : dce , ms_ext, c_ext, robust
    error checks: allocation ref bounds_check enum stub_data 
    VC __declspec() decoration level: 
         __declspec(uuid()), __declspec(selectany), __declspec(novtable)
         DECLSPEC_UUID(), MIDL_INTERFACE()
*/
/* @@MIDL_FILE_HEADING(  ) */
 
#if !defined(_M_IA64) && !defined(_M_AMD64) && !defined(_ARM_)
 
 
#pragma warning( disable: 4049 )  /* more than 64k source lines */
#if _MSC_VER >= 1200
#pragma warning(push)
#endif
 
#pragma warning( disable: 4211 )  /* redefine extern to static */
#pragma warning( disable: 4232 )  /* dllimport identity*/
#pragma warning( disable: 4024 )  /* array to pointer mapping*/
#pragma warning( disable: 4152 )  /* function/data pointer conversion in expression */
#pragma warning( disable: 4100 ) /* unreferenced arguments in x86 call */
 
#pragma optimize("", off ) 
 
#define USE_STUBLESS_PROXY
 
 
/* verify that the <rpcproxy.h> version is high enough to compile this file*/
#ifndef __REDQ_RPCPROXY_H_VERSION__
#define __REQUIRED_RPCPROXY_H_VERSION__ 475
#endif
 
 
#include "rpcproxy.h"
#ifndef __RPCPROXY_H_VERSION__
#error this stub requires an updated version of <rpcproxy.h>
#endif /* __RPCPROXY_H_VERSION__ */
 
 
#include "source_h.h"
 
#define TYPE_FORMAT_STRING_SIZE   3                                 
#define PROC_FORMAT_STRING_SIZE   31                                
#define EXPR_FORMAT_STRING_SIZE   1                                 
#define TRANSMIT_AS_TABLE_SIZE    0            
#define WIRE_MARSHAL_TABLE_SIZE   0            
 
typedef struct _source_MIDL_TYPE_FORMAT_STRING
    {
    short          Pad;
    unsigned char  Format[ TYPE_FORMAT_STRING_SIZE ];
    } source_MIDL_TYPE_FORMAT_STRING;
 
typedef struct _source_MIDL_PROC_FORMAT_STRING
    {
    short          Pad;
    unsigned char  Format[ PROC_FORMAT_STRING_SIZE ];
    } source_MIDL_PROC_FORMAT_STRING;
 
typedef struct _source_MIDL_EXPR_FORMAT_STRING
    {
    long          Pad;
    unsigned char  Format[ EXPR_FORMAT_STRING_SIZE ];
    } source_MIDL_EXPR_FORMAT_STRING;
 
 
static const RPC_SYNTAX_IDENTIFIER  _RpcTransferSyntax = 
{{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}};
 
 
extern const source_MIDL_TYPE_FORMAT_STRING source__MIDL_TypeFormatString;
extern const source_MIDL_PROC_FORMAT_STRING source__MIDL_ProcFormatString;
extern const source_MIDL_EXPR_FORMAT_STRING source__MIDL_ExprFormatString;
 
 
extern const MIDL_STUB_DESC Object_StubDesc;
 
 
extern const MIDL_SERVER_INFO IX_ServerInfo;
extern const MIDL_STUBLESS_PROXY_INFO IX_ProxyInfo;
 
 
 
#if !defined(__RPC_WIN32__)
#error  Invalid build platform for this stub.
#endif
 
#if !(TARGET_IS_NT50_OR_LATER)
#error You need Windows 2000 or later to run this stub because it uses these features:
#error   /robust command line switch.
#error However, your C/C++ compilation flags indicate you intend to run this app on earlier systems.
#error This app will fail with the RPC_X_WRONG_STUB_VERSION error.
#endif
 
 
static const source_MIDL_PROC_FORMAT_STRING source__MIDL_ProcFormatString =
    {
        0,
        {
 
    /* Procedure Fx */
 
            0x33,       /* FC_AUTO_HANDLE */
            0x6c,       /* Old Flags:  object, Oi2 */
/*  2 */    NdrFcLong( 0x0 ),   /* 0 */
/*  6 */    NdrFcShort( 0x3 )/* 3 */
/*  8 */    NdrFcShort( 0x8 )/* x86 Stack size/offset = 8 */
/* 10 */    NdrFcShort( 0x0 )/* 0 */
/* 12 */    NdrFcShort( 0x8 )/* 8 */
/* 14 */    0x44,       /* Oi2 Flags:  has return, has ext, */
            0x1,        /* 1 */
/* 16 */    0x8,        /* 8 */
            0x1,        /* Ext Flags:  new corr desc, */
/* 18 */    NdrFcShort( 0x0 )/* 0 */
/* 20 */    NdrFcShort( 0x0 )/* 0 */
/* 22 */    NdrFcShort( 0x0 )/* 0 */
 
    /* Return value */
 
/* 24 */    NdrFcShort( 0x70 ), /* Flags:  out, return, base type, */
/* 26 */    NdrFcShort( 0x4 )/* x86 Stack size/offset = 4 */
/* 28 */    0x8,        /* FC_LONG */
            0x0,        /* 0 */
 
            0x0
        }
    };
 
static const source_MIDL_TYPE_FORMAT_STRING source__MIDL_TypeFormatString =
    {
        0,
        {
            NdrFcShort( 0x0 )/* 0 */
 
            0x0
        }
    };
 
 
/* Object interface: IUnknown, ver. 0.0,
   GUID={0x00000000,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}} */
 
 
/* Object interface: IX, ver. 0.0,
   GUID={0x83680BFB,0x53DF,0x49AC,{0x97,0x40,0xF6,0x8B,0x0E,0xC7,0xA5,0xD5}} */
 
#pragma code_seg(".orpc")
static const unsigned short IX_FormatStringOffsetTable[] =
    {
    0
    };
 
static const MIDL_STUBLESS_PROXY_INFO IX_ProxyInfo =
    {
    &Object_StubDesc,
    source__MIDL_ProcFormatString.Format,
    &IX_FormatStringOffsetTable[-3],
    0,
    0,
    0
    };
 
 
static const MIDL_SERVER_INFO IX_ServerInfo = 
    {
    &Object_StubDesc,
    0,
    source__MIDL_ProcFormatString.Format,
    &IX_FormatStringOffsetTable[-3],
    0,
    0,
    0,
    0};
CINTERFACE_PROXY_VTABLE(4) _IXProxyVtbl = 
{
    &IX_ProxyInfo,
    &IID_IX,
    IUnknown_QueryInterface_Proxy,
    IUnknown_AddRef_Proxy,
    IUnknown_Release_Proxy ,
    (void *) (INT_PTR) -1 /* IX::Fx */
};
 
const CInterfaceStubVtbl _IXStubVtbl =
{
    &IID_IX,
    &IX_ServerInfo,
    4,
    0, /* pure interpreted */
    CStdStubBuffer_METHODS
};
 
static const MIDL_STUB_DESC Object_StubDesc = 
    {
    0,
    NdrOleAllocate,
    NdrOleFree,
    0,
    0,
    0,
    0,
    0,
    source__MIDL_TypeFormatString.Format,
    1, /* -error bounds_check flag */
    0x50002, /* Ndr library version */
    0,
    0x8000253, /* MIDL Version 8.0.595 */
    0,
    0,
    0,  /* notify & notify_flag routine table */
    0x1, /* MIDL flag */
    0, /* cs routines */
    0,   /* proxy/server info */
    0
    };
 
const CInterfaceProxyVtbl * const _source_ProxyVtblList[] = 
{
    ( CInterfaceProxyVtbl *) &_IXProxyVtbl,
    0
};
 
const CInterfaceStubVtbl * const _source_StubVtblList[] = 
{
    ( CInterfaceStubVtbl *) &_IXStubVtbl,
    0
};
 
PCInterfaceName const _source_InterfaceNamesList[] = 
{
    "IX",
    0
};
 
 
#define _source_CHECK_IID(n)    IID_GENERIC_CHECK_IID( _source, pIID, n)
 
int __stdcall _source_IID_Lookup( const IID * pIID, int * pIndex )
{
    
    if(!_source_CHECK_IID(0))
        {
        *pIndex = 0;
        return 1;
        }
 
    return 0;
}
 
const ExtendedProxyFileInfo source_ProxyFileInfo = 
{
    (PCInterfaceProxyVtblList *) & _source_ProxyVtblList,
    (PCInterfaceStubVtblList *) & _source_StubVtblList,
    (const PCInterfaceName * ) & _source_InterfaceNamesList,
    0, /* no delegation */
    & _source_IID_Lookup, 
    1,
    2,
    0, /* table of [async_uuid] interfaces */
    0, /* Filler1 */
    0, /* Filler2 */
    0  /* Filler3 */
};
#pragma optimize("", on )
#if _MSC_VER >= 1200
#pragma warning(pop)
#endif
 
 
#endif /* !defined(_M_IA64) && !defined(_M_AMD64) && !defined(_ARM_) */



dlldata.c
Кликните здесь для просмотра всего текста
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
/*********************************************************
   DllData file -- generated by MIDL compiler 
 
        DO NOT ALTER THIS FILE
 
   This file is regenerated by MIDL on every IDL file compile.
 
   To completely reconstruct this file, delete it and rerun MIDL
   on all the IDL files in this DLL, specifying this file for the
   /dlldata command line option
 
*********************************************************/
 
#define PROXY_DELEGATION
 
#include <rpcproxy.h>
 
#ifdef __cplusplus
extern "C"   {
#endif
 
EXTERN_PROXY_FILE( source )
 
 
PROXYFILE_LIST_START
/* Start of list */
  REFERENCE_PROXY_FILE( source ),
/* End of list */
PROXYFILE_LIST_END
 
 
DLLDATA_ROUTINES( aProxyFileList, GET_DLL_CLSID )
 
#ifdef __cplusplus
}  /*extern "C" */
#endif
 
/* end of generated dlldata file */


Ход построения:
Кликните здесь для просмотра всего текста
1>------ Построение начато: проект: Win32Project11, Конфигурация: Debug Win32 ------
1>main.obj : error LNK2005: _DllCanUnloadNow@0 уже определен в dlldata.obj
1>main.obj : error LNK2005: _DllGetClassObject@12 уже определен в dlldata.obj
1>Source.def : warning LNK4222: экспортированному символу "DllGetClassObject" не следует присваивать порядковое число
1>Source.def : warning LNK4222: экспортированному символу "DllCanUnloadNow" не следует присваивать порядковое число
1>Source.def : warning LNK4222: экспортированному символу "DllRegisterServer" не следует присваивать порядковое число
1>Source.def : warning LNK4222: экспортированному символу "DllUnregisterServer" не следует присваивать порядковое число
1> Создается библиотека C:\Users\Conte_000\documents\visual studio 2012\Projects\Win32Project11\Debug\Win32 Project11.lib и объект C:\Users\Conte_000\documents\visual studio 2012\Projects\Win32Project11\Debug\Win32 Project11.exp
1>dlldata.obj : error LNK2019: ссылка на неразрешенный внешний символ _NdrCStdStubBuffer_Release@8 в функции _CStdStubBuffer_Release@4
1>dlldata.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__NdrDllGetClassObject@24 в функции _DllGetClassObject@12
1>dlldata.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__NdrDllCanUnloadNow@4 в функции _DllCanUnloadNow@0
1>dlldata.obj : error LNK2019: ссылка на неразрешенный внешний символ _NdrCStdStubBuffer2_Release@8 в функции _CStdStubBuffer2_Release@4
1>source_p.obj : error LNK2001: неразрешенный внешний символ "_IUnknown_QueryInterface_Proxy@12"
1>source_p.obj : error LNK2001: неразрешенный внешний символ "_IUnknown_AddRef_Proxy@4"
1>source_p.obj : error LNK2001: неразрешенный внешний символ "_IUnknown_Release_Proxy@4"
1>source_p.obj : error LNK2001: неразрешенный внешний символ "_CStdStubBuffer_QueryInterface@12"
1>source_p.obj : error LNK2001: неразрешенный внешний символ "_CStdStubBuffer_AddRef@4"
1>source_p.obj : error LNK2001: неразрешенный внешний символ "_CStdStubBuffer_Connect@8"
1>source_p.obj : error LNK2001: неразрешенный внешний символ "_CStdStubBuffer_Disconnect@4"
1>source_p.obj : error LNK2001: неразрешенный внешний символ "_CStdStubBuffer_Invoke@12"
1>source_p.obj : error LNK2001: неразрешенный внешний символ "_CStdStubBuffer_IsIIDSupported@8"
1>source_p.obj : error LNK2001: неразрешенный внешний символ "_CStdStubBuffer_CountRefs@4"
1>source_p.obj : error LNK2001: неразрешенный внешний символ "_CStdStubBuffer_DebugServerQueryInterfa ce@8"
1>source_p.obj : error LNK2001: неразрешенный внешний символ "_CStdStubBuffer_DebugServerRelease@ 8"
1>source_p.obj : error LNK2001: неразрешенный внешний символ "_NdrOleAllocate@4"
1>source_p.obj : error LNK2001: неразрешенный внешний символ "_NdrOleFree@4"
1>C:\Users\Conte_000\documents\visual studio 2012\Projects\Win32Project11\Debug\Win32 Project11.dll : fatal error LNK1120: неразрешенных внешних элементов: 18
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
0
3 / 3 / 1
Регистрация: 05.07.2013
Сообщений: 39
27.03.2015, 09:49  [ТС]
Не работает, только когда пытаюсь импортировать библиотеку типов:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
int main(array<System::String ^> ^args)
{
    
    Console::WriteLine(L"«Здравствуй, мир!");
    TestCOMLib::ComponentClass test; //Тут все работает прекрасно
    test.Fx(); //Тут падает
    
    return 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
// ConsoleApplication15.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <objbase.h>
 
// {83680BFB-53DF-49AC-9740-F68B0EC7A5D5} 
extern "C" const IID IID_IX =   
{ 0x83680bfb, 0x53df, 0x49ac, { 0x97, 0x40, 0xf6, 0x8b, 0xe, 0xc7, 0xa5, 0xd5 } };
 
 
// {BC4DA596-0C2A-4DFB-960A-C63E007F3860}
extern "C" const CLSID CLSID_Component =
{ 0xbc4da596, 0xc2a, 0x4dfb, { 0x96, 0xa, 0xc6, 0x3e, 0x0, 0x7f, 0x38, 0x60 } };
 
 
 
 
interface IX : IUnknown
{
    virtual void pascal Fx() = 0 ;
};
 
void trace(const char* msg) { std::cout << "Client: \t\t" << msg <<std::endl ;}
 
//
// main function
//
int main()
{
    // Initialize COM Library
    CoInitialize(NULL) ;
 
    trace("Call CoCreateInstance to create") ;
    trace("  component and get interface IX.") ;
    IX* pIX = NULL ; 
    HRESULT hr = ::CoCreateInstance(CLSID_Component,
        NULL, 
        CLSCTX_INPROC_SERVER,
        IID_IX, 
        (void**)&pIX) ;
        if (SUCCEEDED(hr))
        {
            trace("Succeeded getting IX.") ;
            pIX->Fx() ;          // Use interface IX.
 
        }
            else
            {
                std::cout << "Client: \t\tCould not create component. hr = " << hr << std::endl ;    
            }
 
    // Uninitialize COM Library
    CoUninitialize() ;
 
    return 0 ;
}
0
3 / 3 / 1
Регистрация: 05.07.2013
Сообщений: 39
30.03.2015, 12:24  [ТС]
Код прекрасно работает из под c++ и Delphi, но в c++\CLI вылетает с ошибкой, при попытке вызова функции Fx().
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru