|
Hi,
I am reposting same question again becuase I am not getting sathisfied answer.
I have a DLL which is having pure functions and virtual functions. Now what to do with that to define the virtual function in my own class?
How to use dll?
How to define virtual function?
Any example?
|
|
|
|
|
As I said before, there's nothing special in using abstract classes coming inside a DLL.
I have done a little test:
#ifdef CPPDLL_EXPORTS
#define CPPDLL_API __declspec(dllexport)
#else
#define CPPDLL_API __declspec(dllimport)
#endif
class CPPDLL_API CCppDll
{
public:
CCppDll(void);
virtual int foo();
virtual int goo(int x)=0;
};
#include "stdafx.h"
#include "..\\..\\CppDll\\CppDll\\CppDll.h"
#include <iostream>
using namespace std;
class MyDer: public CCppDll
{
public:
int goo(int x){ return x*x;}
};
int _tmain(int argc, _TCHAR* argv[])
{
MyDer m;
cout << m.foo() << " " << m.goo(5) << endl;
return 0;
}
I compiles and works fine.
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]
|
|
|
|
|
Thanks Pallini,
Let me check ...
|
|
|
|
|
If I design simple dll having exported function, it works fine.
But when I put same function code in class and put the name in "Additional Dependency". I am getting fatel error:
fatal error LNK1107: invalid or corrupt file: cannot read at 0x2B0
I written below code for exported function
EXPORTS
sum @1
But to write for class.....confused...
Please dont mind If I am asking silly question...
|
|
|
|
|
john5632 wrote: EXPORTS
sum @1
You must NOT do that for the class (you must NOT prevent name decoration). Just use the EXPORT macros (i.e. the CPPDLL_API in my example) Visual Studio provides for you.
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]
|
|
|
|
|
I am getting the fatal error. I tell what I did:
I am able to create dll file with class.
1. Added .h file in my project
2. Make "Add Dependecy" for dll file in linker settings.
When I try to run, compiler says "invalid or corrupt file: cannot read at 0x2B0"
Code for dll (.h):
--------------------------------------------------------------------
#ifdef CPPDLL_EXPORTS
#define CPPDLL_API __declspec(dllexport)
#else
#define CPPDLL_API __declspec(dllimport)
#endif
// This class is exported from the CppDll.dll
class CPPDLL_API CCppDll
{
public:
CCppDll(void);
int sum(int a,int b);
//virtual int goo(int x)=0;
};
dll code for (.cpp)
----------------------------------------------------------
#include "stdafx.h"
#include "samdll.h"
int CCppDll::sum(int x , int y)
{
return x+y;
}
Am I correct?
|
|
|
|
|
Well, you have to add the .lib file in the linker settings...
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]
|
|
|
|
|
1. But I need to use only .h and .dll file then why .lib file is needed.
2. After adding lib file instaed of dll file, I am getting the error:
error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall CCppDll::CCppDll(void)" (__imp_??0CCppDll@@QAE@XZ) referenced in function "public: __thiscall MyDer::MyDer(void)" (??0MyDer@@QAE@XZ)
|
|
|
|
|
You have declared a constructor in the header file but have not added its implementation in the code file.
It's time for a new signature.
|
|
|
|
|
john5632 wrote: 1. But I need to use only .h and .dll file then why .lib file is needed.
Unless you link explicitely with the DLL (i.e. using LoadLibrary) you have to use the (generated: you have it) .lib file.
john5632 wrote: 2. After adding lib file instaed of dll file, I am getting the error:
error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall CCppDll::CCppDll(void)" (__imp_??0CCppDll@@QAE@XZ) referenced in function "public: __thiscall MyDer::MyDer(void)" (??0MyDer@@QAE@XZ)
The compiler (the linker, actually) is right, of course, you didn't provide the class constructor implementation.
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]
|
|
|
|
|
Hi Pallini,
I am able to do that...
But I need to do with dll and .h file.....
|
|
|
|
|
I suggest you start by reading some tutorials about dll, it seems you are missing some really important concepts here.
When you want to load a dll, you have two options, either you load it explicitely by calling LoadLibrary and GetProcAddress or you load it implicitely (which is in general easier) and in which case you need to have a lib file to link with. This lib is in fact an import library which is used to load the dll.
|
|
|
|
|
Thanks for reply...I used LoadLibrary and GetProcAddress to call the exported function but how to use with the class?
I dont know..please guide...
|
|
|
|
|
You can't use LoadLibrary and GetProcAddress to call a method from a class.
Your only option would be to call a function which instantiate the class and returns it, but it doesn't make a lot of sense. And what does it have to do with virtual function anyway ?
I really think you need to read more about C++ basics like classes. It seems you are missing some important concepts here and it's almost impossible to help you.
|
|
|
|
|
Ok,Thanks a lot.
Actually somebody has given me a DLL file which is having some normal function and some pure virtual function inside a class
and telling to define the pure virtual function inside my code.
Thats why I was confused. I am sorry to ask silly questions.
It means It is not possible with a dll to do so?
|
|
|
|
|
If the class has some pure virtual functions in it, then it means that you have to make a class that inherits from it and provide the methods which are missing.
Now, the fact that this class comes from a dll means that the class has to be exported. And importing a class from a dll works only with implicit loading, which means you must have an import lib file with the dll.
Now, on the other hand if the full code of the class resides only in the header file, then the fact that it is a dll doesn't change anything. You simply include the header file in your code and create a class that inherits from that class. But of course, this will only be useful if the dll provides a way to "register" your class with the rest of the code of the dll.
|
|
|
|
|
You got an unsatisfactory answer, because you posted an unsatisfactory question. Being a programmer (you're posting here, after all), you should expect the same stimulus will get the same response...
What is the gap in your knowledge that needs filling in?
Are you happy with inheritance, and abstract member functions?
Can you make a classic DLL? If not, there are articles here on codeproject that can help, as well as lots of help on the MSDN pages.
If you can export a function from a DLL, exporting a class is not much harder. Underneath, it just ends up being a bunch of ugly-named [*] exported functions anyway.
If you can do that, then just mark some abstract, or =0 as appropriate:
class CMyClass
{
public:
void MyMemberFunction () = 0;
...
};
In the executable or dll that loads your dll, the programmer will have to inherit from your abstract class before they can use it - but that's true even if all the classes are in the same module.
I might be expecting too much - maybe you're only marking your member functions as virtual, in which case you have no problems at all.
Your name is John, so I assume that English is your first language. If I'm wrong, and John is a nom-de-pleume, than I half apologise if I've used a bit too much complex english here!
Good luck,
Iain.
[*] Name decoration.
I have now moved to Sweden for love (awwww).
|
|
|
|
|
Hi all,
Im having .avi format files...how to transcode it using ffmpeg??
Any idea??
|
|
|
|
|
I assume you mean programatically, take a look at DirectShow[^].
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> Sometimes you just have to hate coding to do it well. <
|
|
|
|
|
Yes I need programatically.
Actually,I have written Mpeg4,mjpeg,h264 files into AVI container using AVIStreamWrite()..
(VFW.H).
Now,i want to transcode this AVI container format to mp4 container.
I have seen that ffmpeg tool is used for this purpose.
can u give me an example code??
Thanx.
|
|
|
|
|
I'm sorry, i misunderstood you, i thought you "simply" wanted to make mpegs of avi files, it didn't get to me that you explicitly want to use ffmpeg, i never used ffmpeg so i have no experience/examples whatsoever for it. Sorry...
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> Sometimes you just have to hate coding to do it well. <
|
|
|
|
|
|
Hi all.
I want listen to a telephone line via a modem programmatically and save transferred data over it to a file.
How can I do this?
Could you, please help me.
Thanks a'lot.
|
|
|
|
|
Please do not post the same question in more than one forum; select one and stick to it.
It's time for a new signature.
|
|
|
|
|
hi friends,
i am using visual studio 2008...
when i am using VS2008 Editor its working fine...
when i am going run from Debug or release folder exe application is running...functionality is not working...
please help any body....
|
|
|
|