|
hi
I have an activex control written in c++..i can use this activex in html. there is no problem.
I have another x.dll file written in delphi. I can use this dll in ocx by using LoadLibrary function.
My problem is if the user doesnt have the x.dll in his computer, ie locks down.
I have packed activex and dll in a cab file.
My question is how can i load this dll in my activex. I am using LoadLibrary(x.dll) and it searches for dll in windows/system32 folder.
Or how can i load this dll to windows/system32 folder.
modified on Sunday, April 19, 2009 1:14 PM
|
|
|
|
|
maxMESA wrote: My question is how can i load this dll in my activex. I am using LoadLibrary(x.dll) and it searches for dll in windows/system32 folder.
Construct the full path to the DLL and pass that to LoadLibrary.
You can get the ActiveX's path using GetModuleFileName[^], either by storing the ActiveX DLL's HINSTANCE in it's DllMain or (and I think this is better, as there's no global varible involved) by using GetModuleHandle[^] or GetModuleHandleEx[^] to get the ActiveX DLL's HMODULE. In fact, if you put the function below in your ActiveX DLL (it has to be in that DLL), you'll get the ActiveX DLL's path - the function asks for the module containing itself.
std::string GetThisModulesFileName()
{
HMODULE hMod;
char path[MAX_PATH];
GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, reinterpret_cast<lpcstr>(&GetThisModulesFileName), &hMod);
GetModuleFileNameA(hMod, path, MAX_PATH);
return std::string(path);
}</lpcstr>
You might want to add some error checking for production code
Once you've got the ActiveX DLL's path, it's simple to extract the directory with PathRemoveFileSpec[^] and then add on the DLL's name with PathCombine[^].
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
|
We know that when point variable as parameter of function,operations done in the function to the parameter actually willl effect the variable that is passed into the function.That is called pass by reference.
Based on above viewpoint,I have an confusion. For example,
void GetMemory(char* p)
{
p = new char[100];
}
int main()
{
char* str = NULL;
GetMemory(str);
}
After GetMemory(str) is complete, str is still NULL and no point variable is related to memory allocated.
About the result, one explanation is p in function GetMemory is only a copy of variable str. This explanation may be right but it seems that it contradicts pass by reference. Now that passing by reference, where is the copy come from. And operations done to variable p is equal to operations to str,why str is NULL finally.
Appreciate your kind very much and hope anyone give me a clear explanation. Thanks in advance.
|
|
|
|
|
sharion wrote: About the result, one explanation is p in function GetMemory is only a copy of variable str. This explanation may be right but it seems that it contradicts pass by reference. Now that passing by reference, where is the copy come from. And operations done to variable p is equal to operations to str,why str is NULL finally.
There is no contradiction. When you pass a pointer, the thing that is pointed at is passed by reference. So, in your case, the character(s) pointed at by str are passed by reference. str, however, is passed by value.
To pass str by reference, you need to add another level of indirection, either by passing a pointer to str or passing a reference to str, like this:
Pass a pointer to str:
void GetMemory(char** p)
{
*p = new char[100];
}
int main()
{
char* str = NULL;
GetMemory(&str);
}
Pass a reference to str:
void GetMemory(char*& p)
{
p = new char[100];
}
int main()
{
char* str = NULL;
GetMemory(str);
}
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
Thanks for your respond.
Stuart Dootson wrote: When you pass a pointer, the thing that is pointed at is passed by reference.
Still feel some confusion.
void GetMemory(char* p)
{
p = new char[100];
*(p + 10) = 'a';
}
int main()
{
char* str = NULL;
GetMemory(str);
}
We believe str is still NULL, where I have mistaken?
|
|
|
|
|
this is what occurs in sequence:
char* str = NULL;
GetMemory(str);
void GetMemory(char* p)
p = new char[100];
*(p + 10) = 'a';
return;
...
and this is how the callee would be able to modify the caller's pointer
void GetMemory(char** p)
{
p = new char[100];
}
int main()
{
char* str = NULL;
GetMemory(&str);
|
|
|
|
|
sharion wrote: *(p + 10) = 'a'; /* following comment is true or not?*/
/* operate to the memory block
that you called passed by reference
*/
Not true.
You passed NULL to GetMemory. That NULL was copied into p (that's what pass by value does). You then changed p's value to the result of the memory allocation and altered that memory block.
So, in effect, you passed a reference to the memory starting at NULL, then threw away that reference in GetMemory by doing
p = new char[100];
sharion wrote: We believe str is still NULL, where I have mistaken?
No mistake, str will remain NULL with your code. Did you look at the code samples I provided you?
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
Thanks for guy's repond.
Of course your solution to keeping str changed is complete right. I feel awkward about your explanation. Based on experience previous, I take it for granted that whatever you have done to p have the same effect to str. That is passing by reference what I previously thought. Now your explanation is opposite to my thought and I find it hard to drive me from the viewpoint out-of-date.That is my puzzle.
Thanks a lot.
|
|
|
|
|
sharion wrote: Based on experience previous, I take it for granted that whatever you have done to p have the same effect to str. That is passing by reference what I previously thought
What you are actually doing in your code is passing the pointer str by value. At the same time, you are passing by reference is what str points to.
C always passes parameters by value. So, when you want to pass a parameter by reference, you need to get a pointer to the value and pass the pointer by value to the function. So, this function takes x by value and returns a value calculated from x.
int Double(int x)
{
return x + x;
}
while this function does the same, but passing x by pointer. To show that the actual value you pass to the function is not the one you're passing by pointer, I've changed the parameter to pX , meaning 'pointer to X'.
int Double(int *pX)
{
return (*pX) + (*pX);
}
Now, let's move on to some string functions. Let's calculate the length of a C string:
int StringLength(char* s)
{
int length = 0;
while (*(s + length) != 0)
++length;
}
Now, what is s ? It's a string, right? But in C, a string is just a pointer to the first character of the string! So, we're passing a pointer to the sequence of characters that make up the string. And we're passing that pointer by value. What we're passing by pointer is the characters that make up the string.
This page[^] and the ones it links to (especially the one about modifying function arguments[^] might help explain it better than I can - I've never been a good teacher
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
I fully agree, except maybe with "I've never been a good teacher".
"C always passes parameters by value" basically says it all.
Of course the problem is other languages (try and) hide the notion of pointers with keywords such as ByRef (VB) or ref (C#).
|
|
|
|
|
Try something like Ada[^] To paraphrase - we'll pass some things by value, some by reference...and we're not telling which
It does work well, however, as Ada also has the concept of in , out and in out parameters, so you use that rather than having to interpret how to use 'by value' or 'by reference' parameters to get what you want.
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
I've read the Ada specs when they first emerged in the eighties, but never actually used the language.
Is it still in active use?
is there an ADA#?
should we have a forum on it?
|
|
|
|
|
Luc Pattyn wrote: Is it still in active use?
Yes, especially in safety-critical applications - the company I work for uses it. It's also becoming more actively used in some security areas, especially when used in conjunction with SPARK[^].
Luc Pattyn wrote: is there an ADA#?
Yes[^], although it's not really active.
Luc Pattyn wrote: should we have a forum on it?
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
Thanks.
It made me better understand your sig.
|
|
|
|
|
Along with a stirring of Cartman[^]...
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
You are so modest.
According to your explanation, parameters passed to function is essential value, whatever the type of object.As for point type, address of the point is actually passed.So as to these two points, we can say that p is a copy of str,which is their only relationship. This viewpoint seems to resolve my puzzle.
Another example,
void GetMemory(char* p)
{
if(p != NULL)
{
delete []p;
p = NULL;
}
if(p == NULL)
{
p = new char[1000];
*(p+10) = 'a';
}
}
int main()
{
char* str = NULL;
str = new char[100];
GetMemory(str);
}
Above code snippet indicates that before and after GetMemory(str); point str is being revised.I have no idea why such happens.
Much appreciate for your guys' kindness.
|
|
|
|
|
sharion wrote: Above code snippet indicates that before and after GetMemory(str);point str is being revised.I have no idea why such happens.
So if you used the code below, two different values are output? Not on any C++ compiler I tried it with
int main()
{
char* str = NULL;
str = new char[100];
std::cout << (int)str <<std::endl;
GetMemory(str);
std::cout << (int)str <<std::endl;
}
Of course, the memory that str points at is no longer allocated, so you don't want to be using str after the GetMemory call!
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
The value of point str is changed when second it is allocated memory. Do you agree?
Stuart Dootson wrote: Of course, the memory that str points at is no longer allocated, so you don't want to be using str after the GetMemory call!
Actually, str is allocated successfully after GetMemory .When you count the memory size of str between memory allocated two times you can draw this conclusion.
This snippet indicates a case of second memory allocated.In logical it may be weired.I post it only want to say GetMemory also change the point str when it passed by a point variable instead of point to a point(**) or reference to a point(*&).
Thanks a lot.
|
|
|
|
|
sharion wrote: The value of point str is changed when second it is allocated memory. Do you agree?
str is only assigned to once - the other time, it is p, which is a copy of str which is assigned.
sharion wrote: Actually, str is allocated successfully after GetMemory.When you count the memory size of str between memory allocated two times you can draw this conclusion.
Again, NO. str is assigned ONCE.
Let's go through the code, in the order that the code is executed:
int main()
{
char* str = NULL;
str = new char[100];
GetMemory(str);
void GetMemory(char* p)
{
if(p != NULL)
{
delete []p;
p = NULL;
}
if(p == NULL)
{
p = new char[1000];
*(p+10) = 'a';
}
}
}
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
First I must say when I wrote this snippet I agree with most of your point,that is p is only a copy of str, whatever you have done to p has nothing to do with str.
After I compile this snippet,I find something is wrong.
The first fact,you will find the value of *(str+10) is equal to 'a'.Now you should know str has been changed. This result comes from VS 2005 compiler.
Second fact,Furtherly,If you count the memory size by function strlen , you will find the memory size is also changed. Code snippet like this:
str = new char[100];
int n1= (int)strlen((const char*)str);
GetMemory(str);
int n2= (int)strlen((const char*)str);
When debug this snippet, you will get the result, that is n1 is equal to 112 and n2 is equal to 1016. The value of n1 and n2 seem strange but it is not we mainly talk about.The result should indicate memory is reallocated.
Here I list the result that the compiler output is only want to say whether I made some mistakes above or something else is not being considered when we talk this topic.
Thanks for your reply again and again with great patience.
P.S. Only a suggestion.I think our discussion takes up so much space in the website. Would you mind our discussion by email or other way? If it is inappropriate,forgot it
|
|
|
|
|
sharion wrote: The first fact,you will find the value of *(str+10) is equal to 'a'.
That is because you first deallocated the memory that str pointed at, then allocated a block that you assigned to p. When you deallocated the memory, you handed back the block that str pointed at to the C run-time. Then, when you allocated the new memory block, it just so happened that the first free address with enough storage was the one you just gave back to the run-time.
Now consider this code example - it's the same as yours with one line of code added. That line of code, however, is enough to stop the behaviour you've seen. If you run this, the memory that str points at will not be modified after calling GetMemory.
#include <iostream>
void GetMemory(char* p)
{
if(p != NULL)
{
delete []p;
p = NULL;
}
if(p == NULL)
{
p = new char[1000];
*(p+10) = 'a';
}
}
int main()
{
char* str = NULL;
str = new char[100];
char* str2 = new char[100];
GetMemory(str);
}
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
Wo, that's fabulous.Thanks a lot.
|
|
|
|
|
I get compilation errors while using multiple header inclusion in Win32 console application. At the moment I use Visual Studio 2008.
EDCA.cpp:
#pragma once
#include "stdafx.h"
#include "mac.h"
#include "globals.h"
void main()
{
StaT as;
Mac asdf;
asdf.accesspoint = 0;
}
mac.h:
#pragma once
#ifndef mac_h
#define mac_h
#include "globals.h"
#define AC 4
enum StaT{
AP,
STA,
REP
};
class Mac{
public:
StaT type;
Mac () {}
};
#endif
globals.h:
#pragma once
#ifndef globals_h
#define globals_h
#include "mac.h"
extern const double SIFS;
extern const double SLOT;
#define AC 4 //number of access categories
extern int staNr;
extern Mac *sta;
StaT fg;
#endif
It doesn't matter whether I use #pragma once, #ifndef #define or both of them. It always results in such errors:
1>d:\studia\mgr\program\edca\edca\globals.h(14) : error C2143: syntax error : missing ';' before '*'
1>d:\studia\mgr\program\edca\edca\globals.h(14) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\studia\mgr\program\edca\edca\globals.h(14) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\studia\mgr\program\edca\edca\globals.h(16) : error C2146: syntax error : missing ';' before identifier 'fg'
1>d:\studia\mgr\program\edca\edca\globals.h(16) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\studia\mgr\program\edca\edca\globals.h(16) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\studia\mgr\program\edca\edca\mac.h(17) : error C2146: syntax error : missing ';' before identifier 'type'
1>d:\studia\mgr\program\edca\edca\mac.h(17) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\studia\mgr\program\edca\edca\mac.h(17) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\studia\mgr\program\edca\edca\edca.cpp(12) : error C2146: syntax error : missing ';' before identifier 'as'
1>d:\studia\mgr\program\edca\edca\edca.cpp(12) : error C2065: 'as' : undeclared identifier
1>d:\studia\mgr\program\edca\edca\edca.cpp(13) : error C2146: syntax error : missing ';' before identifier 'asdf'
1>d:\studia\mgr\program\edca\edca\edca.cpp(13) : error C2065: 'asdf' : undeclared identifier
1>d:\studia\mgr\program\edca\edca\edca.cpp(14) : error C2065: 'asdf' : undeclared identifier
1>d:\studia\mgr\program\edca\edca\edca.cpp(14) : error C2228: left of '.accesspoint' must have class/struct/union
1> type is ''unknown-type''
I always used #ifndef #define directives when I wrote a code in VS 2005 on Windows XP and it worked well. When I try to open some past projects in VS 2005 on my new computer with Windows Vista, I get similar errors. Can anyone explain it to me?
modified on Saturday, April 18, 2009 4:30 PM
|
|
|
|
|
Hi,
always try and solve the first error message first.
It indicates a problem in "extern Mac *sta;" and that is because Mac is not yet defined.
Which is caused by mac.h (which contains the Mac definition) including globals.h before Mac got defined.
Solution candidate 1: remove the include global.h from mac.h (depends on possible unshown content)
Soultion candidate 2: inside mac.h define Mac before including global.h
|
|
|
|
|