|
Hello,
I've just joined CodeProject.I have a C++ DLL written in dev-cpp IDE, but I can't use it in my .net project. Can anyone please suggest a way how to use in my VS.NET 2005.
I tried to use VS 6.0, I was able to create an application which uses the DLL and it succeeded.Then I made an ActiveX component in VS 6.0 to use in .net. Although the ActiveX component was successfuuly created, I couldn't use it in .net.How can I use that unmanaged dll in .net.
I get the error saying that it can't load it since it wasn't a valid COM component or activeX component.
If anyone has come across this issue please give me a suggestion.
Thanks and Regards
|
|
|
|
|
|
One of my colleagues asked me to have a look at some of his code with him. In it he had a method that performed a lookup of an stl collection. If the key was found he retured pointers to two objects through references passed into the method.
bool FindSomethingAndSetThesePointers(const string& key, Class1 *&obj1, Class2 *&obj2);
I sugested that it was pretty unusual way of doing things and looked a little "smelly". When he pressed me on it I found it hard to give a good reason not to do things this way but I still feel a bit uneasy about it. What do you guys think?
ps I suggested that the reference be made a const and we both scratched our heads for a bit thinking where the const key word should go
|
|
|
|
|
Josh Gray wrote: One of my colleagues asked me to have a look at some of his code with him. In it he had a method that performed a lookup of an stl collection. If the key was found he retured pointers to two objects through references passed into the method.
bool FindSomethingAndSetThesePointers(const string& key, Class1 *&obj1, Class2 *&obj2);
I sugested that it was pretty unusual way of doing things and looked a little "smelly". When he pressed me on it I found it hard to give a good reason not to do things this way but I still feel a bit uneasy about it. What do you guys think?
I don't think this is 'smelly'. Usually, we do such things when it is really needed. In this case, you should decide what you want to do with the pointers returned. If your collection holds pointers [to some objects], after returned these two pointers, you are able to modify the values of them and thus directly affect the pointers inside the collection. For example,
FindSomethingAndSetThesePointers(""somejey", p, q);
p = NULL;
this will set the corresponding element of the collection to NULL. So you were able to directly change the elements of the collection.
Anyway, if you do not need such freedom of changing the collection outside the FindSomethingAndSetThesePointers, then no need to Class*&, a simple Class* will do.
If your collection holds objects (not pointers to them), you may return either pointer to them, or reference to them, or even a copy of them (if you think it is appropriate).
bool FindSomethingAndSetThesePointers(const string& key, Class1 &obj1, Class2 &obj2);
Sometimes, choosing between Class *' and Class &' is either a matter of taste or a convention.
--
=====
Arman
|
|
|
|
|
Arman Z. Sahakyan wrote: If your collection holds objects (not pointers to them), you may return either pointer to them, or reference to them, or even a copy of them (if you think it is appropriate).
I don't think this is a good idea: if the container is reallocated, your pointer will become invalid.
|
|
|
|
|
This technique can be used to assign/reassign a pointer within a function.
Another way of doing this is a pointer to a pointer **.
exampl.
Void MyAllocFunction( TYPE*& pData )
{
delete [] pData;
pData = new TYPE[ x ];
}
TYPE* pData = NULL;
MyAllocFunction( pData );
delete [] pData;
From these methods I prefer a reference to a pointer for readability and error safety reasons.
Preferably a function which allocates a pointer has to destroy it; this keeps it clear what function is responsible for destruction. From this point of view you have to provide using both of these techniques.
|
|
|
|
|
HI
I DEVELOPED A VC++ PROGRAMME IN VC 6.0 AND IT WAS RUNNING AND OUT PUT WAS CORRECT.
WHEN I RUN THE SAME PROGRAMME IN VISUAL STUDIO 2005, THERE WAS NO COMPILE ERROR, BUT THER WAS AN OCCURING RUNTIME ERROR .
IN MY APPLICATION I USED POST MESSAGE(),POST THREAD MESSAGE().
THERE WAS AN ERROR ON POST THREAD MESSAGE (NOT ON POSTING BUT ON RECEIVING)
VC 6.0 : CString str; str.Format("%d",i);
THIS WAS WORKING IN V6.0 BUT NOT IN VISUAL STUDIO 2005.
GIVE YOUR SUGGESTION ON THIS
AWAITING FOR YOUR REPLY
REGARDS
SHAKUMAR
shakumar
|
|
|
|
|
What errors? What does not working mean?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
HI
In Server socket OnAccept
if(Accept(Serversock)==1)
AfxmessageBox("Server Accepted");
else
AfxmessageBox("Server not Accepted");
On this code it does not showing "Server not Accepted" or "Server not Accepted"
But it was run cleraly in vc6.0.
shakumar
|
|
|
|
|
Wow. That has absolutely nothing related to your first post
All I can tell so far is that you have some debugging to do.
Your VC6 code compiles and links with no errors or warnings, right?
You mentioned recieving thread messages - the prototype for the ON_THREAD_MESSAGE handler function
changed. The return type is now void.
MArk
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hi
Thanks for your Reply
As your suggestion ,
Returning type was changed to "Void" ok ther no error now.
But there was an Runtime error in OnAccept();
My programe was Socket programme,
Server Socket Created, Listening;
Client Socket Created, Connected to Server.
When Client Connect to Server Socket in Server Socket OnAccept() Function its get Run time Error.
CServer::OnAccept()
{
if(Accept(Serversock)==1)
AfxmessageBox("Server Accepted");
else
AfxmessageBox("Server not Accepted");
}
Awaiting for your reply
shakumar
|
|
|
|
|
shakumar_22 wrote: When Client Connect to Server Socket in Server Socket OnAccept() Function its get Run time Error.
What error? If you run in the debugger and put a breakpoint at the start of CServer::OnAccept(),
does the breakpoint get hit? If so, and you single step through the code, where does the error
occur?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: Wow. That has absolutely nothing related to your first post
The first post was some pain yeld by the CAPS LOCK key being hit.
|
|
|
|
|
|
Hi all,
I am trying to draw a gradient rectangle using the below code. But the problem is am not getting the correct color in the bottom. As per the code the expected color is RGB(0,0,255). But now I am getting RGB(3,0,252). Is there any way to show the correct value?
Color clr1( 255,255,0,0 );<br />
Color clr2( 255,0,0,255 );<br />
Rect rect( 0,0,100,100 );<br />
LinearGradientBrush pushedFace( rect, clr1, clr2, LinearGradientModeVertical );<br />
CClientDC dc(this);<br />
Graphics gr(dc.m_hDC);<br />
gr.FillRectangle( &pushedFace,rect );
Thanks in advance
|
|
|
|
|
Naveen.R wrote: Is there any way to show the correct value?
Add 1 to the rect height.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
you mean like
LinearGradientBrush pushedFace( Rect( 0,0, 30, 101 ), clr1, clr2, LinearGradientModeVertical ); .
In this case the color became more lighter. RGB(5,0,250)
|
|
|
|
|
You're right! LOL sorry.
The problem is with the math (apparently which I'm too tired to comprehend ).
Incrementing evenly through 100 rows from 0 to 255, the last row ends at 252.45 or 252.
There's no way around it that I know of except adjusting the width/height to a value that makes
it come out exact.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: Incrementing evenly through 100 rows from 0 to 255
Well I tried making the following changes. Set the height as 255.clr1 = RGB( 0,0,0), clr2 = RGB(0,0,255 )
In this case the color should come correct isnt it? but now the color is 0,0,254 at the bottom( I know the color change is not noticeable. But I have to meet the specifications... ).
|
|
|
|
|
|
Mark Salsbery wrote: You may have to come up with your own formula.
Thanks for your support.
|
|
|
|
|
I'll look deeper into this in the morning - for now, I have to sleep
Good luck!
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: I'll look deeper into this in the morning - for now, I have to sleep
Thanks for that... Good night.
|
|
|
|
|
OK, if you want to roll your own gradient rect, this formula should work
(((r2 - r1) / (rectheight - 1)) * currentrow) + r1 = rdest
(((g2 - g1) / (rectheight - 1)) * currentrow) + g1 = gdest
(((b2 - b1) / (rectheight - 1)) * currentrow) + b1 = bdest
where
r,g,b == red,green,blue components
Desired Start row color == RGB(r1,g1,b1)
Desired End row color == RGB(r2,g2,b2)
currentrow == current row of rect being drawn (0-based)
RGB(rdest,gdest,bdest) is the resulting color for the currentrow
Note this requires floating point so it will be slower than the standard integer formula.
The example is for vertical gradient - it would work for columns as well (horizontal gradient).
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|