摘要: 作者:星轨(oRbIt) E_Mail:inte2000@163.com 转载请注明原作者,否则请勿转载函数调用约定和名字修饰规则不匹配引起的常见问题 函数调用时如果出现堆栈异常,十有八九是由于函数调用约定不匹配引起的。比如动态链接库a有以下导出函数:long MakeFun(long lFun); 动态库生成的时候采用的函数调用约定是__stdcall,所以编译生成的a.dll中函数MakeFun的调用约定是_stdcall,也就是函数调用时参数从右向左入栈,函数返回时自己还原堆栈。现在某个程序模块b要引用a中的MakeFun,b和a一样使用C++方式编译,只是b模块的函数调用方式是__c. 阅读全文
posted @ 2005-08-10 20:25 oRbIt 阅读(207) 评论(0) 推荐(0)
摘要: 作者:星轨(oRbIt) E_Mail:inte2000@163.com 转载请注明原作者,否则请勿转载函数名字修饰(Decorated Name)方式 函数的名字修饰(Decorated Name)就是编译器在编译期间创建的一个字符串,用来指明函数的定义或原型。LINK程序或其他工具有时需要指定函数的名字修饰来定位函数的正确位置。多数情况下程序员并不需要知道函数的名字修饰,LINK程序或其他工具会自动区分他们。当然,在某些情况下需要指定函数的名字修饰,例如在C++程序中,为了让LINK程序或其他工具能够匹配到正确的函数名字,就必须为重载函数和一些特殊的函数(如构造函数和析构函数)指定名字装. 阅读全文
posted @ 2005-08-10 20:16 oRbIt 阅读(476) 评论(0) 推荐(0)
摘要: 作者:星轨(oRbIt) E_Mail:inte2000@163.com 转载请注明原作者,否则请勿转载 使用C/C++语言开发软件的程序员经常碰到这样的问题:有时候是程序编译没有问题,但是链接的时候总是报告函数不存在(经典的LNK 2001错误),有时候是程序编译和链接都没有错误,但是只要调用库中的函数就会出现堆栈异常。这些现象通常是出现在C和C++的代码混合使用的情况下或在C++程序中使用第三方的库的情况下(不是用C++语言开发的),其实这都是函数调用约定(Calling Convention)和函数名修饰(Decorated Name)规则惹的祸。函数调用方式决定了函数参数入栈的顺序,. 阅读全文
posted @ 2005-08-10 20:06 oRbIt 阅读(305) 评论(0) 推荐(0)