|
Here is the Dll file code -
foo.h
class __declspec (dllexport) CFoo
{
public:
CFoo();
int foo1();
int foo2();
};
__declspec (dllexport) CFoo foo;re>
Foo.cpp
<pre>#include "Foo.h"
CFoo::CFoo()
{
return;
}
int CFoo::foo1()
{
return 100;
}
int CFoo::foo2()
{
return 200;
}
and here is the console based application code -
Foo.h
class __declspec (dllimport) CFoo
{
public:
CFoo();
int foo1();
int foo2();
};
__declspec (dllimport) CFoo foo;
test.cpp
#include "foo.h"
int main()
{
int i = foo.foo1();
i = foo.foo2();
return 0;
}
Don't forget to set the dependency to Foo.lib file in the test project settings.
Hope this will help.
|
|
|
|
|
Cool, nbugalia!
I want to confirm with you that we could expose, function/class/global variable from a DLL, correct?
regards,
George
|
|
|
|
|
George_George wrote: CFoo foo;
This is not enough, you have to export the foo variable, like
__declspec (dllexport) CFoo foo;
George_George wrote: extern CFoo foo;
Also in the exe, you have to import the variable
__declspec (dllimport) CFoo foo;
|
|
|
|
|
Thanks nave,
I have tested your solution works. My question is, if I create a global variable inside a DLL, then in the hosting executable, could I use extern to refer to the variable and use it?
regards,
George
|
|
|
|
|
George_George wrote: could I use extern to refer to the variable and use it?
No. you should export it to use the variable in the hosting executable..
|
|
|
|
|
Thanks nave,
So, from learning from you, it is legal to expose both function/global variable/class from a DLL?
(previously, I think only expose function is allowed.)
regards,
George
|
|
|
|
|
George_George wrote: So, from learning from you, it is legal to expose both function/global variable/class from a DLL?
Yes its legal to expose both functions and variables.
|
|
|
|
|
Thanks nave,
And also legal for exposing class?
regards,
George
|
|
|
|
|
Of course classes also
|
|
|
|
|
Thanks Naveen!
I have proved we could expose both class and global variable by DLL and using your mentioned elegant way.
But I am not 100% confident. Here is my code, could you have a code review please?
DLL Part:
#ifdef _DLLPROJ_
#define DLLEXP __declspec (dllexport)
#else
#define DLLEXP __declspec (dllimport)
#endif
DLLEXP class CFoo
{
public:
DLLEXP int foo1();
DLLEXP int foo2();
};
DLLEXP class CFooImpl : CFoo
{
public:
DLLEXP CFooImpl();
DLLEXP int foo1();
DLLEXP int foo2();
};
#include "foo.h"
CFooImpl::CFooImpl()
{
return;
}
int CFooImpl::foo1()
{
return 100;
}
int CFooImpl::foo2()
{
return 200;
}
DLLEXP CFooImpl foo;
Hosting client part
#include "foo.h"
DLLEXP CFooImpl foo;
int main()
{
CFooImpl foo1;
int i = foo.foo1();
i = foo.foo2();
return 0;
}
regards,
George
|
|
|
|
|
I have noted the below problem
George_George wrote: DLLEXP class CFoo
This should be modified as class DLLEXP CFoo
everthing else seems ok.
|
|
|
|
|
I think they should be the same? It compiles and runs well in VS.
regards,
George
|
|
|
|
|
Aside from the issue Naveen showed you, IIRC you don't need to DLLEXP the class and the classes methods - one or the other, that's all that's needed really. I tend to DLLEXP the methods, as you have better control over what precisely is exported.
|
|
|
|
|
Hi Stuart,
I have tried that if I only mark dllexport on class and not on methods, the methods could not be found during link process.
So, I think we have to mark both. Could you have a try please?
regards,
George
|
|
|
|
|
I have an awful lot of deployed code that uses this mechanism - here's a sample:
#if!defined(COMMONLIB_API)
#ifdef COMMONLIB_EXPORTS
#define COMMONLIB_API __declspec(dllexport)
#else
#define COMMONLIB_API __declspec(dllimport)
#endif
#endif
namespace MyAppLibrary {
class MessageReporter {
public:
COMMONLIB_API MessageReporter();
COMMONLIB_API static void AddReportFunction(ReportFnPtr func);
COMMONLIB_API static void SetReporterLevel(Level lev, bool on);
COMMONLIB_API static void AllLevelsOn() {repLevels=~0;}
COMMONLIB_API static void AllLevelsOff() {repLevels=0;}
};
};
Is it possible you haven't exported necessary constructors?
|
|
|
|
|
But if you only expose class not expose methods, the methods could not be found when linking the client of the DLL (link error, unresolved symbols related to the methods).
Could you have a try? I have tried.
regards,
George
|
|
|
|
|
DLL interface defined in a.h
a.h
#if !defined(__A_H__)
#define __A_H__
#if!defined(A_API)
#ifdef A_EXPORTS
#define A_API __declspec(dllexport)
#else
#define A_API __declspec(dllimport)
#endif
#endif
class A_API A
{
public:
A();
A(int a);
void DoSomething(int b);
int Result() const;
private:
int a_;
};
#endif // !defined(__A_H__)
DLL implemented in a.cpp and built with cl -EHsc -LD a.cpp
a.cpp
#include <windows.h>
#define A_EXPORTS
#include "a.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
A::A() : a_(0) {}
A::A(int a) : a_(a) {}
void A::DoSomething(int b) { a_ += b; }
int A::Result() const { return a_; }
DLL used in b.cpp, built with cl -EHsc b.cpp a.lib :
b.cpp
#include <iostream>
#include "a.h"
int main(int argc, char** argv)
{
A a(argc);
a.DoSomething(3);
std::cout << a.Result() << std::endl;
}
Builds fine, runs OK and even produces the right result...which is nice.
modified on Saturday, December 20, 2008 6:19 AM
|
|
|
|
|
Cool, Stuart!
regards,
George
|
|
|
|
|
You've got two issues:
- In
main.cpp , you want to declare CFoo as __declspec(dllimport) . The way I do that is to put something like this in foo.h :
#if !defined(FOO_DLL)
#define FOO_EXP __declspec(dllimport)
#else
#define FOO_EXP __declspec(dllexport)
#endif
class FOO_EXP CFoo { ... };
You would define FOO_DLL when building the DLL using, for example, #define FOO_DLL in every source file in the DLL before #includ ing foo.h . You need do nothing in main.cpp>/code>, as that's what the default case caters for. - As other replies have said, you would need to export
CFoo foo; from the DLL.
|
|
|
|
|
|
I have created a SDI application with a Form view. In the form view ihave inserted a property sheet like this...
void CMyFormView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
m_PropSheet.AddPage(&m_Page1);
m_PropSheet.AddPage(&m_Page2);
m_PropSheet.Create(this, WS_CHILD | WS_VISIBLE, 0);
m_PropSheet.ModifyStyleEx (0, WS_EX_CONTROLPARENT);
m_PropSheet.ModifyStyle( 0, WS_TABSTOP );
m_bViewInitiated = true;
}
I wanted the property sheet to span the whole area of the form view, so i have written few line for that as...
void CMyFormView::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
if(m_bViewInitiated)
{
m_PropSheet.SetWindowPos((CWnd*)this, 0, 0, cx, cy,SWP_NOZORDER | SWP_NOACTIVATE );
}
}
But the property sheet is not behaving as i expected. Its size remains same as the property pages sizes given at the creation time.
Can you help me with this...
Thank you
Tritva
modified on Monday, December 15, 2008 5:33 AM
|
|
|
|
|
Hi,
I am writing an utility dll like dependency walker. I have no idea how to get dependent dll. Any idea about this.
Thanks
|
|
|
|
|
manish rastogi wrote: I am writing an utility dll like dependency walker. I have no idea how to get dependent dll.
It looks like a good kick off!
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Have a look at Process Viewer[^]. It contains almost everything you want.
Regards,
Jijo.
_____________________________________________________
http://weseetips.com[ ^] Visual C++ tips and tricks. Updated daily.
|
|
|
|
|
You can find out what DLL's are implicitly linked to the DLL or EXE by reading the PE import table.
Thanks & Regards,
K. Sushilkumar.
|
|
|
|