|
If you are using MFC I'm pretty sure you won't have a problem as it uses the hInstance for the DLL or the EXE as required. If you aren't using MFC then make sure you set hModule correctly in the call to LoadResource() or whatever you are using and you should be ok.
Neville Franks, Author of ED for Windows. Free Trial at www.getsoft.com
|
|
|
|
|
Unfortunately, yes.
I discovered this working inside the company I'm currently employed during the Veritest's "exam" for Windows 2000 Logo.
The problem occured having a central executable and a set of DLLs called from it.
Everything is MFC.
Suppose you have into dll 1 a string resource with IDC_STRING, and into dll 2 a string resource with ID = IDC_STRING2, and IDC_STRING1 = IDC_STRING2. If dll 1 is loaded, loading dll 2 will give in the point of IDC_STRING2 loading a call to FindResource with ID = IDC_STRING1 = IDC_STRING2. Most probably it will find it in dll 1 and load from there, since all are mapped in the same process. If you manually specify the dll instance, that's ok (I think...) but I don't think you call
::LoadString(hInstDll2, IDC_STRING2, szText, sizeof(szText));
instead of
CString str;
str.LoadString(IDC_STRING2);
or
AfxMessageBox(IDC_STRING2).
Things are even worse if you have different or custom resource types. I've seen several crashes so bad just because this resource clash.
In fact this made us to write a resource align tool that reads resource ranges for a dll.
The basic idea is to make a resource partitioning tool (parses .rc and rewrites resource.h) in such a way that:
ResourceIDs(dll_i) AND ResourceIDs(dll_j) = EMPTY
for any i <> j, 1 <= i, j <= n (number of modules using resources you have).
The thing may not be so simple as you think, there are external details to consider.
Think a MDI application that has to specify a CLIENTCREATESTRUCT's ID for first MDI child window. Accordingly to MSDN (and this one is true ) these IDs should not conflict with existing resource IDs. There may be other restrictions as well, I've pointed only one of the most obvious.
A dll starts with a default range of resources of 100.
If the internal parser decides that this is not enough, it will modify the input "ranges" file and adds a new 100 sized range and try to resort the IDs in such way that each resource ID will be placed inside that range. The process is performed until all resource IDs from dll have room in the allocated ranges.
A rebuild all is, of course, required after resource alignment.
In this way, there is no worry that a dll will ever have a resource ID conflicting with another dll's resource IDs.
Now we all live happily , having 3 different development offices compiling all in the same place over main website. The internal objects detects if there are resource changes, these MUST be recorded inside the task (I'm not going into details what a task means and how the website is working, but I think you get the point) and, if a module past outside the range, and automatic aligner component works in conjunction with resource parser tool to get a new range and resort affected resource.h.
Rebuild all (for the dll and all dependent modules) and that's it.
("That's it" = almost 3 months of work from time to time until we get the job done)
|
|
|
|
|
Is there anything better than 'atoi' when trying to convert ASCII to integers ?
It looks if I try to convert __int64 with aoti, it fails on the big numbers
Shay
|
|
|
|
|
|
I didn't even know it exists, I'll give it a try,
Thanks
|
|
|
|
|
Well,
It did not work....
I actually need to covner an __int64 to ASCCII , waht you gave me was the other way
|
|
|
|
|
|
Yep !!!
That did it, and I almost implemented it by myself....
Thanks
|
|
|
|
|
Another "tool" to keep in your box is the "%I64d" format specifier? Use it with sprintf().
|
|
|
|
|
I have the following line in my code:
sprintf(Tempcrap1, "%02d", Modi[i] - 64);
strcat(Tempcrap, Tempcrap1);
Where I am translating the alpha to numeric:
A-010,b-020,c-030 ....
for some reason I am loosing 0 after the numbers.
My result is:a-01,b-02,c-03... Where is the error?
|
|
|
|
|
|
yes. It gives me 007.Instead of 070.
|
|
|
|
|
OK,
How about
"%.2d" - This will print a leading zero before any decimal
|
|
|
|
|
Below my proc. where I am translating value.
Case when Numeric,numeric,alpha: is fine.
Case when Alpha,numeric,numeric is incorrect.
Example:G73-07013 but my program transalted to 00773.
A-010,b-020,c-030 etc.
int convert_char_modifier_new(char *Modifier, char *NewModifier)
{/* Convert Modifier value from alpha to numeric */
char NewMod2[8];
char Tempcrap[8];
char Tempcrap1[8];
char Tempcrap2[8];
memset(NewMod2,0x00,sizeof(NewMod2));
memset(Tempcrap,0x00,sizeof(Tempcrap));
memset(Tempcrap1,0x00,sizeof(Tempcrap1));
unsigned int i;
for ( i = 0; i < strlen(Modifier); i++ )
{
if (isdigit(Modifier[i]))
{
sprintf(Tempcrap1, "%d", Modifier[i] - 48);
strcat(Tempcrap, Tempcrap1);
}
else
{
sprintf(Tempcrap1, "%02d", Modifier[i] - 64);
strcat(Tempcrap, Tempcrap1);
}
}
sprintf(NewMod2, "%03s", Tempcrap);
strcat(NewModifier, NewMod2);
return(0);
}
|
|
|
|
|
I'm not sure I understand your input/output. From what I gather you are wanting something like this for letters:
Input : Output
A : 010
B : 020
C : 030
D : 040
...
Y : 250
Z : 260 Is that right? If so, this should work:
sprintf(Tempcrap1, "%03d", (Modi[i] - 64) * 10);
If the input contains numbers, like:
Input : Output
0 : 000
1 : 010
2 : 020
3 : 030
...
8 : 080
9 : 090
sprintf(Tempcrap1, "%03d", (Modi[i] - 48) * 10);
|
|
|
|
|
Thank you for reply.
The problem is when
input : Output
A 10
B 20
C 30
...........
Y 25
Z 26
I am missing 0 if number 10,20,30,...90.
|
|
|
|
|
my problem is I need to have this value at the end:
A-10
b-20
c-30
...
y-25
x-26
|
|
|
|
|
At the end of what? I've yet to determine what you are considering input and what you are considering output. Do something simple like:
When my program sees input like "input data goes here", I want the output to be "output data goes here"
|
|
|
|
|
"input data goes here" : "output data goes here"
A : 010
B : 020
C : 030
D : 040
...............
Z : 026
Y : 025
|
|
|
|
|
This won't work. See the problem?
A 010 N 014
B 020 O 015
C 030 P 016
D 040 Q 017
E 050 R 018
F 060 S 019
G 070 T 020
H 080 U 021
I 090 V 022
J 010 W 023
K 011 X 024
L 012 Y 025
M 013 Z 026
|
|
|
|
|
I am so sorry. I mistype:
it should look like this:
A 010 N 140
B 020 O 150
C 030 P 160
D 040 Q 170
E 050 R 180
F 060 S 190
G 070 T 200
H 080 U 210
I 090 V 220
J 100 W 230
K110 X 240
L 120 Y 250
M130 Z 260
My output should be:
A 10 N 14
B 20 O 15
C 30 P 16
D 40 Q 17
E 50 R 18
F 60 S 19
G70 T 20
H80 U 21
I 90 V 22
J10 W 23
K11 X 24
L 12 Y 25
M13 Z 26
|
|
|
|
|
You just can't make up your mind, can you? First you state that "it should look like this" and show one table, and then you follow that with "my output should be" and show a completely different table.
In the bottom table, do you not see the obvious error? A and J cannot both be 10.
|
|
|
|
|
Now I understand what you are saying. I am appreciated for your patient.
I am just learning C++, so I am not seeing full picture at first.
My project is to translate from alpha to numeric starting with the A=10 increase the next letter by 10 and then delete zero before numbers.
I got it to work but I am missing zero after the number if number=10…90.
What would you recommended to do with the J?
|
|
|
|
|
sardinka wrote:
My project is to translate from alpha to numeric starting with the A=10 increase the next letter by 10 and then delete zero before numbers.
This will do exactly that:
sprintf(Tempcrap1, "%d", (Modi[i] - 64) * 10);
|
|
|
|
|
I copyed your line of code into my program.
here my output(what I am getting).
Examples:
Entered Value:Should be : I am getting
9AB : 90102 : 91020
Z73 : 26073 : 26073
9ZY : 92625 : 9260250
|
|
|
|