实现了一个数据库模块,提供枚举数据库服务器功能,返回所有数据库服务器名称。一开始想通过vector<string>输出参数方式,在DLL中添加数据库服务器名称。不过在释放输出参数的时候出现错误,这是由于输出参数的资源是在DLL中申请,而在主程序中进行释放,如果申请和释放的方式不一致,就会导致释放出错。
主要的解决方法就是谁申请谁释放。对于这种动态申请的资源,由于资源数量不确定,最好是由DLL来提供接口进行释放。就是输出参数使用完成后,调用DLL释放接口进行释放。返回字符串数组可以有两种方式,一种是直接返回字符串数组,在释放的时候需要先对每个字符串进行释放,再对字符串指针数组进行释放。另一种是将所有字符串通过特定分隔符拼接成一个字符串返回,由上层去分割字符串,释放的时候只需要释放这个字符串就行。这种方法适合字符串的长度较短,内容格式没那么复杂,能够找到一个不重复的字符或字符串来作为分隔符。在我的应用中使用的是第二种方法。
还有一种解决是修改dll和调用dll的应用的工程属性,选择project> settings> c/c++> code generation下的using run-time library为 multi threaded dll, Debug版则选debug multi threaded dll。
由于dll和应用程序可能是由不同人开发,或者由于某些原因需要采用静态链接库方式,所以建议采用由DLL提供释放接口的方式。