Greetings!
I'm a newbie in Visual C++ .NET (have programmed in Borland C++
and Builder for long) and I am trying to do a very simple thing,
but I'm stuck.
I created an (unmanaged) DLL project with a sample function, and
tried to call it from a ".NET Forms" project. All I get are
"Unresolved External" errors from the Linker!
When I try to call the same functions from a "Pure Win32" or a
Console Application, everything works well!
What could be happening? I'm sure it's something very trivial
and silly, but I'm stuck!
What I've done so far:
- Created the DLL, using Visual Studio default macros
- Exported the class contained in the DLL that I want to use.
- Compiled the DLL, OK
- Created a Windows Forms project, with one button that tried to
instantiate the class defined in the DLL and call its function.
Configurations for the Windows Forms Executable Project:
C/C++
General - Additional Include Directories: ..\DrawDll
Linker
General - Additional Library Directories: ..\DrawDll\Release
Input - Additional Dependencies:
...\DrawDll\Release\DrawDll.lib
I have 2 projects in the solution, each one on its own directory.
That's all that was necessary for the Console AND for the Win32
versions to work! However, on this project I'm getting:
Form1.obj : error LNK2001: unresolved external symbol "public:
__thiscall Project::CDrawDll::CDrawDll(void)"
(??0CDrawDll@Project@@$$FQAE@XZ)
Form1.obj : error LNK2001: unresolved external symbol "public: void
__thiscall Project::CDrawDll::MyMethod(void)"
(?MyMethod@CDrawDll@Project@@$$FQAEXXZ)
Any clues?
Here are the files being used:
DrawDll.h
#ifdef DRAWDLL_EXPORTS
#define DRAWDLL_API __declspec(dllexport)
#else
#define DRAWDLL_API __declspec(dllimport)
#endif
// This class is exported from the DrawDll.dll
class DRAWDLL_API CDrawDll {
public:
CDrawDll(void);
void MyMethod(void);
};
DrawDll.cpp
#include "stdafx.h"
#include "DrawDll.h"
#include <stdio.h>
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
void CDrawDll::MyMethod(void)
{
OutputDebugString("It Worked!");
}
The Project.cpp and Project.h files are just the default
"Windows Forms Application (.NET)" generated files, plus
the code to try and run the DLL:
Form1.h
#include <windows.h>
#include <stdio.h>
#include "DrawDll.h"
public __gc class Form1 : public System::Windows::Forms::Form
....
private: System::Void button1_Click(System::Object * sender,
System::EventArgs * e)
{
CDrawDll lala;
lala.MyMethod();
}
Form1.cpp
#include "stdafx.h"
#include "Form1.h"
#include <windows.h>
using namespace Project;
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
System::Threading::Thread::CurrentThread->ApartmentState =
System::Threading::ApartmentState::STA;
Application::Run(new Form1());
return 0;
}
Thanks for any help!