I would probably approach this in a similar way to the one employed by MS Windows.
That is, I would calculate a hash (lets say MD5 or SHA1) of each file. I would then check the (pre-calculated) valid against one calculated on-the-fly for each file. If the hash doesn't match, don't continue.
The problem with this is two-fold:
1) It removes the functionality of DLLs - i.e you can't update them
2) Someone can still reverse-engineer your code to make sure that the hash comparison is always successful.
One way around this would be to avoid storing the dialog in the resources of a DLL. You could simply load the dialog into ResEdit. This will let you preview the C code required to create that dialog. You can then copy this C code and create the dialog dynamically. This will make it considerably harder for nefarious characters to modify your dialog.
Another way would be use static libs, building all code into your EXE. You could then calculate the MD5 of the whole exe and, if it doesn't match with the pre-calculated md5 you would just exit. - This is tricky, since each modification to your code results in a wildly different md5.
For the second option, there's an article here on CP that talks about "Tamper aware and Self-healing executables" I seem to recall that this solves the problem of calculating the initial md5 of the program. You can read the article
here[
^]