|
Hi, dear all,
I create a DLL (we called Server.DLL)with several exported functions, I also create testing application (Client.EXE) to call the exported functions in DLL, both are in debug mode. Everything works fine.
Now I need to create a DLL in release mode, so I use the Server.DLL and Client.EXE for release mode, and change the compiled files for debug mode as Sever_Debug.DLL, Client_Debug.EXE, also in the project setting part of the client application, I change the following settings:
Link ->General->Object/Library modules as Server_Debug.LIB,
Link ->General->Input->Additional Library Path to the server project Debug folder.
After I compile the client application and run the program, I got an error:
The application has failed to start because Server.DLL was not found. Re-installing the application may fix this problem.
My question is that why it still look for Server.DLL, suppose it should look for Server_Debug.DLL, right? Is there any place to let use set the path and name for the DLL file or we just put the DLL file at the same folder as client application exe file, and by default DLL file name should be same as LIB file name, am I right?
Thanks a lots!
|
|
|
|
|
actually your stuff looks ok although its more common to have a debug target folder instead of different name for debug version (MS does have different names though since they distribute both)... do a search for "Server.DLL" in your project, maybe you're referencing the name and don't forget to recompile the server.dll to produce server_debug.dll
|
|
|
|
|
Thanks for reply.
I recompile the DLL in debug mode and also search for Server.DLL in client application, cannot find it. usually when use DLL file, we just set the library file name and path, don't need to directly DLL file name and path, just put the DLL in the same folder as EXE file, right? I don't know from where the client application remember the Server.DLL.
|
|
|
|
|
If you didn't specify the path of the DLL anywhere, it should just look in the same directory as the exe. I'll think about this a little bit to see if I can remember anything that may cause this... did you do a clean recompile?
|
|
|
|
|
Hi, Albert,
Thank you very much, I solve this problem.
The problem is in the .def file, it has LIBRARY : SERVER
so if I want to change the library file to SERVER_Debug, I also need to change the library name in .def file. So I thought your idea is good, no matter in debug or release mode, use the same name, just output the files in debug and release to different folder, so we don't need to modify .def file.
Thanks again.
|
|
|
|
|
ah yes! i should've remembered the module definition file.. glad you fixed your bug and shared the solution! ![Smile | :)](https://codeproject.global.ssl.fastly.net/script/Forums/Images/smiley_smile.gif)
|
|
|
|
|
<br />
BYTE message[5];<br />
message[0] = 15;<br />
message[1] = 33;<br />
message[2] = 2;<br />
message[3] = 23;<br />
message[4] = 33;<br />
.<br />
. <br />
.<br />
.<br />
.<br />
<br />
int messageLengh = 60;<br />
<br />
char szLogBuff [512]={0};<br />
for(int i=0;i<messageLengh;i++)<br />
{<br />
char chz[4]={0};<br />
sprintf(chz,"%d ",i);<br />
strcat(szLogBuff,chz);<br />
}<br />
printf(szLogBuff);<br />
Do you find anything wrong with this code?
Do I need to pad the buffer with a '\0'? or just assigning 0 to the buffer initially is fine?
|
|
|
|
|
Smith# wrote: Do you find anything wrong with this code? Do I need to pad the buffer with a '\0'? or just assigning 0 to the buffer initially is fine?
yes. no. yes.
[MODIFIED]
if it really is the indexes you want to print, then it is: no. no. yes. (but why show all the message stuff then?)
[/MODIFIED]
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
modified on Thursday, March 31, 2011 2:26 PM
|
|
|
|
|
The first yes makes me not to click on the x of this window. Could you please tell me what is wrong with the code before I click on x?
|
|
|
|
|
Smith# wrote: char chz[4]={0};
this buffer is too small, your sprintf statement may generate a minus sign, three digits, a space, and a NULL, that is 6 characters.
60 of these could take up to 301 chars, so char szLogBuff [512]={0}; is sufficiently large, and as others already pointed out, your total initialization is a waste, as each strcat will move the initial terminating NULL backwards.
BTW: you could get the correct result with less code, and save some cycles, and never have the bug you had, by having sprintf() fill the final buffer right away; all it takes is a variable pointer as the destination, initialized to szLogBuff, and incremented by the return value of sprintf!
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
Luc Pattyn wrote: your sprintf statement may generate a minus sign
No, it cannot.
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]
|
|
|
|
|
from the code snippet I can't tell what the definition of BYTE is, could be signed, could be unsigned; I prepare for the worst. Anyway, it isn't really relevant, the buffer isn't sufficiently large.
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
You didn't read the snippet, did you?
(hint: it sprints the index, the BYTE part is completely insignificant).
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]
|
|
|
|
|
How silly.
So that must be wrong too.
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
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]
|
|
|
|
|
The code (albeit not beautiful) is correct.
With szLogBuf[512]={0}; you actually initialize the whole buffer with 0 (that is '\0').
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]
|
|
|
|
|
Then what is the best way to clear the buffer initially?
|
|
|
|
|
Since you are dealing with strings there isn't a need to clear the whole buffer.
char x[100] = { 0 };
internally calls memset. In your case it's a waste of (7 or so not including the loop inside memset) CPU cycles.
char x[100];
x[0] = 0;
initially creates an empty string. Just 1 CPU cycle.
But then, calling functions like strcpy and sprintf don't require the buffer to be empty whereas strcat NEEDS a string (empty or otherwise) to append to.
Waldermort
|
|
|
|
|
whereas strcat NEEDS a string (empty or otherwise) to append to.
so I'll have to memset everything to 0 or initialize everything to 0 right?
|
|
|
|
|
No. When dealing with string buffers you only need to set the first char/wchar/tchar to 0.
char myString[100];
strcat( myString, "Hello World!" );
strcpy( myString, "World!" );
myString[0] = 0;
strcat( myString, "Hello World!" );
The new string is actually 13 chars because there is a 0 at the end.
On another note. You shouldn't be using those string functions. There are safer versions available:
strcpy_s( myString, 100, "Hello World!" );
These check to make sure the buffer is large enough for the string
Also, you might want to read up on TCHAR and the unicode/ansi string functions
TCHAR myString[100];<br />
_tcscpy_s( myString, 100, _T("Hello World!");
Waldermort
|
|
|
|
|
CPallini wrote: The code ... is correct.
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
It isn't wrong. It isn't elegant nor optimal, but not wrong. I think this is a great achievement, after all.
(It's a subliminal suggestion for you: could you please hire the OP?)
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]
|
|
|
|
|
CPallini wrote: It isn't elegant
true.
CPallini wrote: nor optimal
true.
CPallini wrote: not wrong
false. see my reply to OP.
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
See my reply[^].
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]
|
|
|
|
|
On most 32 bit systems bit 1 and 2 are not used in an address. This allows the CAS algorithm to test an address and also test a flag (very useful for non blocking linked lists).
However on a 64 bit system those 2 bit are in use.
After doing some googling I have found that AMD64 and IA64 use 48 bits. AMD plans to extend that 52 bits.
So my question is, Am I safe to use bit 1 of a 64 bit address, if so will it be portable?
Waldermort
|
|
|
|