今天一直在研究delphi生成dll的技术,搞了一天,略知皮毛。
其中在测试时,发现如果程序和dll之间用string作为参数传递时容易出现错误,通过查询得知,这需要在程序的uses中使用sharemem。
但是测试了好多次都没有成功,最后发现是自己对此理解错误了,这个sharemem需要用在调用和被调用的情况时候都使用。往往我们会在主程序的时候忘掉了引用。切记主程序的.dpr文件中也要引用。
具体方法 project-view source 在uses后边加入 sharemem,
这中情况只发生在传递参数未string情况下(还有动态数组,还没研究到,呵呵)。其他情况下不用调用。
另外,我们需要注意一个问题。你用sharemem编译出的dll和程序,可能在你的机子上运行很正常,但是在一台没有安装delphi的机子上就会出问题。这是因为,你咋安装delphi的同时,把所需要的dll都安装了。
怎么解决这个问题?都安装一遍delphi?!!呵呵,理论上是可以的,当然世界上没有这么笨的人。
当 uses sharemem, 时,请把borlndmm.dll拷贝到应用文件的同一路径下。borlndmm.dll在delphi的安装路径下,可以搜索一下。
{Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters.}
已经说的很清楚了,如果的导出函数中参数或返回值有string类型,那么就需要引用ShareMem