Question: I write a program helloworld.exe; it depends on a.dll. I don't have the source code of the a.dll, which is a dynamic dll. How can i change it to static library, so I can link it into helloworld.exe?

Answer: 
As Jerry said, you cannot do it directly. You can, however, package your program into something like a self extracting RAR file which includes the DLL as part of the single EXE, which automatically extracts the EXE and associated DLLs to a temp folder and starts the main program.
I am absolutely horrified at the lack of understanding in at least one of the (supposedly popular?) answers.

I have written a linker from the ground up, every line of code. I know everything there is to know about DLLs. 

A DLL contains much much more information than a lib, and it does, guaranteed, contain absolutely everything that a lib contains. Every last item.

To convert a dll to a lib, you can follow the simple steps provided in the following well-written article.

<https://adrianhenke.wordpress.com/2008/12/05/create-lib-file-from-dll/>

(I am not adrian henke, just for information)

The process described allows you to create a lib directly from a dll, without requiring the def file. In fact, it actually allows you to create the def file from the dll, since the dll contains all of this information.

I can guarantee that it works perfectly, since I actually ran the exact same process on a dll and checked the result. The lib is correct, and will allow you to link.

Oh and by the way, it is utterly, completely, totally impossible to convert a lib to a dll.