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

E_NOINTERFACE COM

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

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

Невозможно привести 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
23.03.2015, 13:41
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.03.2015, 13:41
Ответы с готовыми решениями:

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


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

Или воспользуйтесь поиском по форуму:
5
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
23.03.2015, 17:54 2
На первый взгляд, никакого "криминала" в коде нет.
Но очень смущает вот это:
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-файле интерфейс объявлен иначе:
Код
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  [ТС] 3
Изменил функцию:
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\Win32Project11\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  [ТС] 4
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\Win32Project11.lib и объект C:\Users\Conte_000\documents\visual studio 2012\Projects\Win32Project11\Debug\Win32Project11.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_DebugServerQueryInterface@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\Win32Project11.dll : fatal error LNK1120: неразрешенных внешних элементов: 18
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
0
3 / 3 / 1
Регистрация: 05.07.2013
Сообщений: 39
27.03.2015, 09:49  [ТС] 5
Не работает, только когда пытаюсь импортировать библиотеку типов:
Кликните здесь для просмотра всего текста
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  [ТС] 6
Код прекрасно работает из под c++ и Delphi, но в c++\CLI вылетает с ошибкой, при попытке вызова функции Fx().
0
30.03.2015, 12:24
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Ошибка Docker "Got permission denied while trying to connect to the Docker daemon socket at"
hw_wired 14.02.2025
Разработка с использованием Docker может иногда преподносить неожиданные сюрпризы, и одним из самых распространенных камней преткновения становится ошибка с отказом в доступе к демону Docker. . . .
Ошибка "No 'Access-Control-Allow-Origin' header is present on the requested resource"
hw_wired 14.02.2025
При разработке современных веб-приложений нередко сталкиваешься с ошибкой "No 'Access-Control-Allow-Origin' header is present on the requested resource". Эта проблема возникает из-за политики. . .
Как закрыть порт в Linux
hw_wired 14.02.2025
Управление сетевыми портами в Linux - непростая, но важная задача для обеспечения безопасности системы. Каждый открытый порт - это потенциальная уязвимость, через которую злоумышленики могут. . .
Ошибка Angular "Can't bind to 'taskForm' since it isn't a known property of 'form'"
hw_wired 14.02.2025
При разработке веб-приложений на Angular можно столкнуться с ошибкой "Can't bind to '' since it isn't a known property of 'form'". Эта ошибка появляется в консоли браузера когда мы пытаемся. . .
Сообщение Git "Pulling without specifying how to reconcile divergent branches is discouraged"
hw_wired 14.02.2025
При работе с системой контроля версий Git многие разработчики сталкиваются с предупреждающим сообщением "Pulling without specifying how to reconcile divergent branches is discouraged". Это. . .
Как настроить количество пробелов в отступах табов в Visual Studio Code
hw_wired 14.02.2025
Visual Studio Code предоставляет несколько гибких способов настройки табуляции, каждый из которых имеет свои преимущества. Самый простой и наглядный метод - через графический интерфейс настроек, где. . .
Что означает знак восклицания в TypeScript
hw_wired 14.02.2025
TypeScript - удивительный язык программирования, который предоставляет множество возможностей для работы с типами данных. Особый интерес вызывает оператор утверждения ненулевого значения, который. . .
Как свернуть/скрыть секции кода в Visual Studio Code
hw_wired 14.02.2025
Ежедневно мы работам с файлами, содержащими сотни и тысячи строк кода. Навигация по такому объему становится настоящим испытанием, особенно когда нужно быстро найти нужный метод или переменную. . . .
Автоматическое создание файла requirements.tx­t в Python
hw_wired 14.02.2025
Дружелюбная среда для разработки на Python, один из самых широко используемых языков программирования, состоит не только из самого кода, но и целого ряда важных компонентов. И если вы когда-нибудь. . .
Передача переменных окружения в контейнер Docker
hw_wired 14.02.2025
При работе с Docker контейнерами возникает необходимость передать различные настройки и конфигурационные параметры - от строк подключения к базам данных до API ключей. И хотя можно жестко прописать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru