其实,DLL这东西也用过一段时间了,但是大多都是对照着Copy样式,剩下的就是把自己想包含的东西写在里面,所以一直以来也没有报什么错。
今天中午,迷迷糊糊的写了一个动态库,大概的功能就是通过动态库传递选择一个颜色,然后传递回来。很简单的一个东西,但是或许是在午睡状态,更可能是该注意的东西其实根本就是没有理解,所以,这事真是“一波两折”。
一、测试调用DLL报内存错误。
我立马想到这是指针方面的问题,创建、注销方面有问题?查啊查,没有啊?我一直保持着"创建、注销一一对应的规则",这个排除了。
那是为什么?我想到以前在论坛上看到说动态库有问题,有时候是由于调用动态库的时候没有使用全路径,而只是使用相对路径。试一试,ok!
二、这个动态库就是传递一个默认的颜色值LongInt类型,但是,窗体上默认的样子跟我的不一样啊?但是选择了一个颜色之后,我的测试窗体上确实有变化,我想反正我的基本功能实现了,算了吧?但是,我发现,取消选择颜色,我的测试窗体上的颜色也会变化啊?这功能完全没有实现啊!这里面肯定有问题!传递的默认值发生了改变,难道没有加const限制,加了之后还是老样子?这是怎么了?于是把动态库的工程和测试DLL的工程都打开,对应之后发现,测试的时候,声明的时候没有加动态库的参数入栈规则,这个应该是是个问题,试一试就符合预期!
解决了这两个问题之后,我的睡意瞬间全无!!DLL确实很简单,但是那里面的规则真的不是可有可无啊!
结论:1 动态调用动态库最好使用完全路径(可能导致严重的内存访问问题!)
2 参数入栈规则必须定义与使用申明完全一致。