|
Thanks for your response. I did try that but the DeviceDescription I read in the registry does not exactly match what's returned in GetAdaptersInfo(). For example, here are my adapters DeviceDescription field read in the registry:
"3Com EtherLink 10/100 PCI TX NIC (3C905B-TX)"
"3Com 3C920 Integrated Fast Ethernet Controller (3C905C-TX Compatible)"
But, GetAdaptersInfo() only returns one of the adapters (one is probably no longer in my docking station):
"3Com Etherlink PCI"
Not an exact match. Though I could just search for "3Com Etherlink" how do I know how much of the string should I be looking for. I mean, if I did have my 3Com 3C920 controller still installed, would GetAdaptersInfo() return "3Com 3C920" or would it change it somehow, possibly "3Com 3C920 PCI"? I guess it could be done but I was hoping for an exact match returned from GetAdaptersInfo() or some other API call.
|
|
|
|
|
From what I can tell, GetAdaptersInfo() probably gets the name from the device driver itself. It first consults the registry to get the GUID, then cross-references that to get the name of the device driver file. This is just a guess based on my test app's registry access. As it did not obtain the name directly from the registry, I can only assume it used the device driver file.
|
|
|
|
|
If one or more resource IDs in a DLL are the same as what is in an MFC application that is being developed, will there be a problem?
The DLL is being loaded at run-time and there is a resource header being linked into the main application.
SJ
Manufacturing Software Developer
Hewlett-Packard Company
|
|
|
|
|
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.
|
|
|
|
|