|
Hi All,
I want to use CFtpConnection to download and upload some files to some server.
But i want to do it in asynchronous way.
What i mean is to give some function address and in the end of upload/download this function will be call.
How can i do it ?
Thanks.
|
|
|
|
|
Great job for a worker thread.
You could use CFtpConnection::GetFile()/CFtpConnection::PutFile() on a separate thread.
As always, for more control over the file transfers, you can use
CFtpConnection::OpenFile()/CInternetFile::Read()/CInternetFile::Write().
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
|
|
|
Hello everyone,
For dllimport KB from Microsoft,
http://support.microsoft.com/kb/132044/en-us
It is mentioned,
--------------------
If 'func1' exists in another DLL, the linker can't resolve this directly because it has no way of knowing what the address of 'func1' is.
--------------------
My question is, if we are using implicit linking, the address of import function should be in the import library (.lib file) of the DLL and since the import library is as an input parameter to linker, the linker should know the address at link time?
thanks in advance,
George
|
|
|
|
|
George_George wrote: the address of import function should be in the import library (.lib file) of the DLL
import library doesnot have address of the function, it has code to resolve the address at load time.
|
|
|
|
|
Thanks Rajkumar,
I want to learn more about,
1. what are in import library files;
2. how it solves the address at load time.
Any more description or recommended reading please?
regards,
George
|
|
|
|
|
[^] gives the idea i think.
|
|
|
|
|
Thanks Rajkumar,
I have read the link before. My question is,
--------------------
If func1 exists in another DLL, the linker can't resolve this directly because it has no way of knowing what the address of
--------------------
I am not sure whether the address of the function is contained in import library file, which is input to the linker? What is the content/format of import library file?
regards,
George
|
|
|
|
|
George_George wrote: I am not sure whether the address of the function is contained in import library file, which is input to the linker
IMHO, the link can clarify this,
anyway i extract the portion,
So now this code:
__declspec(dllimport) void func1(void);
void main(void)
{
func1();
}
generates this instruction:
call DWORD PTR __imp_func1
There is no thunk and no
jmp
Here
__imp_func1
is the address for
func1's slot in the import address table of the .EXE file. All the addresses are thus known to the linker. The loader only has to update the .EXE file's import address table at load time for everything to work correctly.
loader updated the IAT, and already __declspec(dllimport) generates code to point to the IAT slot....
George_George wrote: What is the content/format of import library file?
start a new thread so that may get noticed by others
Iam not familiar with format, sorry i just care about concepts for similar context.
modified on Monday, February 18, 2008 9:54 AM
|
|
|
|
|
|
George_George wrote: I have followed your comments to start a new thread
I comment, to get noticed your new question by others, i am not familiar with the format of the object file. may be my wrong idea. Any way i assume u got the concept behind "dllimport"
|
|
|
|
|
Sorry, Rajkumar! I may not make myself understood enough, pther than the exact format of import library, I mean how linker utilize the import library to generate two forms of call statement, one for the case with dllimport and one for the case without dllimport.
I am wondering what are contained in the import library so that the linker could utilize it to generat both forms.
regards,
George
|
|
|
|
|
George_George wrote: I mean how linker utilize the import library to generate two forms of call statement
George_George wrote: one for the case with dllimport
how call statement is mapped to indirect pointer to IAT slot is extracted in the previous reply.
George_George wrote: one for the case without dllimport
without dllimport means the function is statically linked, that is linker knows the address of the function,
Without __declspec(dllimport), given this code:
void func1(void);
void main(void)
{
func1();
}
the compiler generates code that looks like this:
call func1
and the linker translates the call into something like this:
call 0x4000000 ; The address of 'func1'.
the address of the function is already known to the linker.
If
func1
exists in another DLL, the linker can't resolve this directly because it has no way of knowing what the address of
func1
is.
and the remaining section decribes the technique used for dllimport.
|
|
|
|
|
Thanks Rajkumar,
Why import library can not decide the address of the import function? Because of the address can not be decide until load time -- DLL rebase or?
regards,
George
|
|
|
|
|
Hello everyone,
Sometimes, we allocate array of zero elements. I am wondering for what regualr purpose will we do that?
I have tested that in Visual Studio 2008, it runs ok.
int main()
{
char* buf = new char [0];
delete[] buf;
return 0;
}
thanks in advance,
George
|
|
|
|
|
It works, but it's Microsoft specific, you may have problem on different platforms.
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
modified on Sunday, February 17, 2008 9:51 AM
|
|
|
|
|
i think it is C++ standard,
§5.3.4/7: "When the value of the expression in a direct-new-declarator is zero, the allocation function is called to allocate an array with no elements."
|
|
|
|
|
You're right. Maybe I was too drunk.
the following one is the non-standard I was (wrongly) addressing
struct A
{
int a[0];
};
Thanks.
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
|
|
|
|
|
CPallini wrote: Maybe I was too drunk
I think u r too drunk, as u r not sure that u r too drunk
|
|
|
|
|
Can not compile in Visual Studio 2008.
regards,
George
|
|
|
|
|
u mean this
struct A{
int a[0];
};
i don't know about 2008, VS2005 gives warning in C++ when warning level is greater than 1. previous version needs the option /Ze (ms extension).
following is same as above and compiles in VS2005 as above and also found in GCC
struct A{
int a[];
};
|
|
|
|
|
Thanks Rajkumar,
Here is the compile error message in Visual Studio 2008. With warning level 3 -- default one.
d:\visual studio 2008\projects\test_array3\test_array3\main2.cpp(1) : error C2146: syntax error : missing ';' before identifier 'mean'
d:\visual studio 2008\projects\test_array3\test_array3\main2.cpp(1) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
d:\visual studio 2008\projects\test_array3\test_array3\main2.cpp(1) : error C2143: syntax error : missing ';' before 'this'
d:\visual studio 2008\projects\test_array3\test_array3\main2.cpp(1) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
d:\visual studio 2008\projects\test_array3\test_array3\main2.cpp(2) : error C2143: syntax error : missing ';' before '{'
d:\visual studio 2008\projects\test_array3\test_array3\main2.cpp(2) : error C2447: '{' : missing function header (old-style formal list?)
Looks like int a[0] can not be used.
regards,
George
|
|
|
|
|
can u post the code, it seams something else.
|
|
|
|