I am learning COM. Visual Studio 2013. DLL x64 project (COM component) on C++.
I get the errors when I try to compile my "Hello World" project:
Error 1 error LNK2001: unresolved external symbol DllCanUnloadNow C:\COMInteropSample\my_com_sandbox\my_com_component_01\my_com_component_01.def
Error 2 error LNK2001: unresolved external symbol DllGetClassObject C:\COMInteropSample\my_com_sandbox\my_com_component_01\my_com_component_01.def
Error 3 error LNK2001: unresolved external symbol DllRegisterServer C:\COMInteropSample\my_com_sandbox\my_com_component_01\my_com_component_01.def
Error 4 error LNK2001: unresolved external symbol DllUnregisterServer C:\COMInteropSample\my_com_sandbox\my_com_component_01\my_com_component_01.def
Error 5 error LNK1120: 4 unresolved externals C:\COMInteropSample\my_com_sandbox\Debug\my_com_component_01.lib my_com_component_01
But I don't understand the reason of these errors... I am looking at my DEF and CPP files and I see no errors. :(((
Content of my_com_component_01.def
file:
LIBRARY my_com_component_01.dll
EXPORTS
DllMain PRIVATE
DllGetClassObject PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
DllCanUnloadNow PRIVATE
Content of my dll.cpp
file (definitions of the export functions):
/* dll.cpp */
#include <objbase.h>
#include <sal.h>
#include "tools.h"
#include "global_vars.h"
#include "CA.h"
#include "My_com_factory.h"
static HINSTANCE pDll = nullptr;
extern "C" {
BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason,
_In_ LPVOID lpvReserved){
char* s = nullptr;
if (DLL_PROCESS_ATTACH == fdwReason){
s = "DLL_PROCESS_ATTACH";
}
else if (DLL_PROCESS_DETACH == fdwReason){
s = "DLL_PROCESS_DETACH";
}
else if (DLL_THREAD_ATTACH == fdwReason){
s = "DLL_THREAD_ATTACH";
}
else if (DLL_THREAD_DETACH == fdwReason){
s = "DLL_THREAD_DETACH";
}
pDll = hinstDLL;
std::cout << "DllMain: ";
trace(s);
return true;
}
HRESULT __stdcall DllGetClassObject(_In_ REFCLSID rclsid,
_In_ REFIID riid, _Out_ LPVOID *ppv){
if (_uuidof(CA) == rclsid){
My_com_factory* mf = new My_com_factory();
HRESULT hr = mf->QueryInterface(riid, ppv);
return hr;
}
else{
*ppv = nullptr;
return CLASS_E_CLASSNOTAVAILABLE;
}
}
// TODO: Is not implemented still.
HRESULT __stdcall DllRegisterServer(){
return S_OK;
}
// TODO: Is not implemented still.
HRESULT __stdcall DllUnregisterServer(){
return S_OK;
}
HRESULT __stdcall DllCanUnloadNow(){
return (obj_count == 0 && locks_count == 0) ? S_OK : S_FALSE;
}
}
What I did incorrectly?
Thank you.
P.S.to πάντα ῥεῖ You are not right. It is bad when give the answer without investigating into a question essence. I found the reason of bad behavior of IDE and corrected it. I think that it is a bug of Visual Studio 2013.