Я уже с ума скоро сойду хД. Я пишу одно и то же 30-й раз,компилятор мне выводит в разное время разные ошибки. Как библиотеку c "IUnknown" подключаю,вообще конец. То фу-я не экспортируется....
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
| /* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>
#include <objbase.h>
static const IID IID_IX = {0x439508bd,0xd021,0x4cb9,0xa52e,0xabab9c988574};
static const IID IID_IY = {0x14de7546,0x95ae,0x4eea,0xa883,0xf400923c33eb};
DllClass::DllClass()
{
}
DllClass::~DllClass ()
{
}
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
/* Returns TRUE on success, FALSE on failure */
return TRUE;
}
interface IX : IUnknown
{
virtual int _stdcall Fx() = 0;
};
interface IY : IUnknown
{
virtual int _stdcall Fy() = 0;
};
class CA : public IX,public IY
{
private:
int m_cRef = 0;
public:
virtual HRESULT _stdcall QueryInterface(const IID &iid,void** ppv);
virtual ULONG _stdcall AddRef();
virtual ULONG _stdcall Release();
virtual int _stdcall Fx()
{
return 83;
}
virtual int _stdcall Fy()
{
return 11;
}
};
HRESULT _stdcall CA :: QueryInterface(const IID &iid,void** ppv)
{
if (iid == IID_IX)
{
*ppv = static_cast<IX*>(this);
}
else if (iid == IID_IY)
{
*ppv = static_cast<IY*>(this);
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
reinterpret_cast<IUnknown*>(*ppv)->AddRef();
}
ULONG _stdcall CA :: AddRef()
{
return ++m_cRef;
}
ULONG _stdcall CA :: Release()
{
if (--m_cRef==0)
{
delete this;
}
return m_cRef;
}
extern "C" IUnknown* CreateInstance()
{
IUnknown* pI = (IUnknown*)(new CA);
pI->AddRef();
return pI;
} |
|
Добавлено через 8 минут
Ещё "клиент" не работает:
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
| #include <iostream>
#include "dll.h"
#include <objbase.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef IUnknown* (*CREATEFUNCPTR)();
IUnknown* CallCreateInstance(char *name)
{
HINSTANCE hComponent = :: LoadLibrary(name);
if (hComponent == NULL)
{
printf("Error\n");
return NULL;
}
CREATEFUNCPTR CreateInstance = (CREATEFUNCPTR) :: GetProcAddress(hComponent,"CreateInstance");
if (CreateInstance == NULL)
{
printf("Error of export CreateInstance\n");
return NULL;
}
return CreateInstance();
}
int main(int argc, char** argv) {
CallCreateInstance("C_DLL.dll");
return 0;
} |
|
В проверке на нуль выдаёт принт с ошибкой.
Добавлено через 6 минут
Компилятор псих какой-то. Я забыл вернуть значение,но мне вообще ничего про это не выдал....
Добавлено через 1 час 9 минут
Это вообще какой-то ужас. Длл сделал на Dev c++, Клиент на VS. Вот теперь ошибки в чём они? И вообще объясните весь код,то,что там после typedef. Эти getproc.CREATEFUNCPTR.
1>c:\users\user\documents\visual studio 2008\projects\create_cl\create_cl\create_cl.cpp(13) : error C2664: LoadLibraryW: невозможно преобразовать параметр 1 из 'char *' в 'LPCWSTR'
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
1>Журнал построения был сохранен в "file://c:\Users\User\Documents\Visual Studio 2008\Projects\CREATE_CL\CREATE_CL\Debug\BuildLog.htm"
1>CREATE_CL - ошибок 1, предупреждений 0
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 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
| // CREATE_CL.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include "dll.h"
#include <windows.h>
typedef IUnknown* (*CREATEFUNCPTR)();
IUnknown* CallCreateInstance(char *name)
{
HINSTANCE hComponent = ::LoadLibrary(name);
if (hComponent == NULL)
{
printf("Error\n");
return NULL;
}
CREATEFUNCPTR CreateInstance = (CREATEFUNCPTR)::GetProcAddress(hComponent,"CreateInstance");
if(CreateInstance == NULL)
{
printf("Error of expotr\n");
return NULL;
}
return CreateInstance();
}
int _tmain(int argc, _TCHAR* argv[])
{
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
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
| #include "dll.h"
#include <windows.h>
#include <objbase.h>
static const IID IID_IX = {0x439508bd,0xd021,0x4cb9,0xa52e,0xabab9c988574};
static const IID IID_IY = {0x14de7546,0x95ae,0x4eea,0xa883,0xf400923c33eb};
DllClass::DllClass()
{
}
DllClass::~DllClass ()
{
}
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
/* Returns TRUE on success, FALSE on failure */
return TRUE;
}
interface IX : IUnknown
{
virtual int _stdcall Fx() = 0;
};
interface IY : IUnknown
{
virtual int _stdcall Fy() = 0;
};
class CA : public IX,public IY
{
private:
int m_cRef = 0;
public:
virtual HRESULT _stdcall QueryInterface(const IID &iid,void** ppv);
virtual ULONG _stdcall AddRef();
virtual ULONG _stdcall Release();
virtual int _stdcall Fx()
{
return 83;
}
virtual int _stdcall Fy()
{
return 11;
}
};
HRESULT _stdcall CA :: QueryInterface(const IID &iid,void** ppv)
{
if (iid == IID_IX)
{
*ppv = static_cast<IX*>(this);
}
else if (iid == IID_IY)
{
*ppv = static_cast<IY*>(this);
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
reinterpret_cast<IUnknown*>(*ppv)->AddRef();
return S_OK;
}
ULONG _stdcall CA :: AddRef()
{
return ++m_cRef;
}
ULONG _stdcall CA :: Release()
{
if (--m_cRef==0)
{
delete this;
}
return m_cRef;
}
extern "C" IUnknown* CreateInstance()
{
IUnknown* pI = (IUnknown*)(new CA);
pI->AddRef();
return pI;
} |
|
Добавлено через 18 часов 24 минуты
Да что за ошибка?
Добавлено через 45 секунд
Я из-за этого бреда уже недели 3 не могу освоить динамическую компоновку