摘要: C语言标准(不管是ANSI 还是ISO)包含2部分,一部分是语言本身的标准,另一部分是C标准函数库。C标准函数库规定了函数的原型和功能,但是并没限定这些函数要怎么实现。所谓满足标准C规定的C编译器,不仅指这个编译器满足C语言本身的标准,还指这个编译器提供了一组满足C标准库的库函数。这组库函数是由编译器厂商实现,并且满足标准C规定的功能和接口的。这些库函数,厂商并不一定要提供给用户源文件给用户编译用,可以是二进制目标文件给用户链接用(我猜这就是叫着运行库的原因之一,你看不到源码,能看到运行是的汇编码)。所以说,不管是哪个厂商的CRT,只要他宣称他是标准的C编译器,那他的CRT就肯定是满足C标准中 阅读全文
posted @ 2013-12-18 19:42 IT屁民 阅读(1112) 评论(0) 推荐(0) 编辑
摘要: 一旦DLL的文件映像被映射到调用进程的地址空间中,DLL的函数就可以供进程中运行的所有线程使用。实际上,DLL几乎将失去它作为DLL的全部特征。对于进程中的线程来说,DLL的代码和数据看上去就像恰巧是在进程的地址空间中的额外代码和数据一样。当一个线程调用DLL函数时,该DLL函数要查看线程的堆栈,以... 阅读全文
posted @ 2013-12-18 19:40 IT屁民 阅读(2197) 评论(0) 推荐(1) 编辑
摘要: 一个模块一个堆,一个线程一个栈。dll里malloc的内存,在exe里free会出错。CRT(C运行时期库)不是使用进程缺省的堆来实现malloc(new中调用malloc)的,而是使用一个全局句柄 HANDLE _crtheap来分配内存的。这个_crtheap是在XXXCRTStartUp(CRT提供的进口点函数)中创建的。由于CRT静态连接,则楼主的DLL里有也有一个CRT,因此也有一个_crtheap。而在dll中的new使用dll中的_crtheap句柄分配 堆,在exe中的delete使用exe中的_crtheap释放堆,当然失败!解决办法:1。在DLL中输出一个函数给EXE调用, 阅读全文
posted @ 2013-12-18 17:34 IT屁民 阅读(8620) 评论(0) 推荐(0) 编辑
摘要: 在开发window程序是经常会遇到编译好好的程序拿到另一台机器上面无法运行的情况,这一般是由于另一台机器上面没有安装响应的运行时库导致的,那么这个与编译选项MT、MTd、MD、MDd有什么关系呢?这是msdn上面的解释:MT:mutithread,多线程库,编译器会从运行时库里面选择多线程静态连接库来解释程序中的代码,即连接LIBCMT.lib库MTd:mutithread+debug,多线程调试版,连接LIBMITD.lib库MD:MT+DLL,多线程动态库,连接MSVCRT.lib库,这是个导入库,对应动态库为MSVCRT.dllMDd:MT+DLL+debug,多线程动态调试库,连接MS 阅读全文
posted @ 2013-12-18 15:46 IT屁民 阅读(21678) 评论(2) 推荐(3) 编辑
摘要: .h文件主要是提供函数签名原型至于函数的实现有两种库:动态库:dll静态库:lib当使用动态库dll的时候,有两种情况1,只有dll而没有.h和.lib而有api文档的情况下,可以通过LoadLibrary动态加载dll,并通过GetProcAddress来获取函数地址并使用。2,有dll,有.h,有lib的话,在编译选项里正确链接lib,并在代码头文件中includ.h文件即可使用其中dll存储了函数具体的执行代码和资源,.h文件给出了函数的原型,.lib文件给出了函数在dll中的内存偏移地址。使用时dll与exe文件在同一目录即可注意的是:此时的lib是导出文件,而不是静态库而只有dll, 阅读全文
posted @ 2013-12-18 15:20 IT屁民 阅读(354) 评论(0) 推荐(0) 编辑