Well, you do have the general idea correctly. However, I don't think that DOS ever supported the idea of DLLs. IIRC, the closest that it came to was using overlay functions. Search google if you want more information on overlay functions. Frankly, if you're just learning C, it's probably easier to just statically link the two files together like the previous poster mentioned. That way, you don't have to indirect through a pointer.
As to why your code is hanging, you aren't really reading the code from the file into memory, so you can't indirect to the function via the file pointer. You probably need to read the file first into a memory buffer and then point the pointer to it. Also, an OBJ file contains machine code, but it also contains some stub headers for the linker to use, so you can't arbitrarily point a function pointer to the first byte of the OBJ file buffer, you need to find the area in the file where the function's code starts. Then again, like I said above, DOS never really supported DLLs, so you might want to see how it is done under Windows or *Nix. The reason why most people used overlays was because DOS was limited to 640K and when you're using overlays, you could unload the overlay library when you were done using it.
Under Windows or *Nix, the process is pretty much close to what you described. In Windows, it would go something like this:
/* Load the library into memory */
HINSTANCE *hLib = LoadLibrary("mylib");
/* Find address of the function we want, in the dynamic library */
pFunc = GetProcAddress(hLib, "MyFunctionName");
/* Execute the function */
/* Free the library */
Under *nix, the logic for shared libraries is similar and the functions corresponding to LoadLibrary, GetProcAddress and FreeLibrary are dlopen(), dlsym() and dlclose(). Hope this helps!