11 个解决方案
#1
gz
#2
in detail
#3
上次说的不详细,现在又有新的发现。
我原来有2个EXE,2个DLL,如下:
EXE1静态调用DLL1中的唯一的函数
EXE2静态调用DLL2,DLL2静态调用DLL1中的唯一的函数
EXE1里有以下控件:
2个Label,2个TFlatEdit,1个MEMO和一个Button.
按下Button,则从DLl1中唯一的一个函数中获得一个String(use Result in DLL, 在EXE1中S:=Result),用FlatEdit1.Text作为参数,返回一个S,然后向FlatEdit2中写入S,并向Memo写入一些东东,用到刚才的那个返回值S,直到最后Memo1.Items.SaveToFile,然后就是procedure的end了,错误就出现在这里:FlatEdit2.Text为什么都没有,即使用TEdit也是(试过的),而用到返回的没有经过其他加工的S的Memo1却什么也没事,而且错误是出现在这个procedure的end的时候的(Invalid pointer个没完,然后就Application Error),当把DLL1中的函数复制到EXE1里面(不用调用DLL1了)以上错误全无,证明DLL1中的函数没错(只是一个字符串转换程序)。
EXE2调用DLL2中的唯一的函数,DLL2又调用DLL1中的唯一的函数,还是在程序执行到end的时候出现错误(Invalid pointer),这次没有没完,只是3次而已,不过也够人烦的,而当把DLL1中的唯一的函数复制到DLL2时(不用调用DLL1了,如果只是静态声明要调用,可能不会出错,只是当时没有试而已),DLL2却什么错误都没出现,而倒是EXE2出错了(还是Invalid Pointer,重新编译几次后,也许是操作系统的问题吧,现在是先非法操作,然后再Invalid Pointer)。
于是我推测,只要静态调用DLL,就会出现以上错误,因为以上的DLL都是正常的,我用的是Delphi 6 Enterprise。
我原来有2个EXE,2个DLL,如下:
EXE1静态调用DLL1中的唯一的函数
EXE2静态调用DLL2,DLL2静态调用DLL1中的唯一的函数
EXE1里有以下控件:
2个Label,2个TFlatEdit,1个MEMO和一个Button.
按下Button,则从DLl1中唯一的一个函数中获得一个String(use Result in DLL, 在EXE1中S:=Result),用FlatEdit1.Text作为参数,返回一个S,然后向FlatEdit2中写入S,并向Memo写入一些东东,用到刚才的那个返回值S,直到最后Memo1.Items.SaveToFile,然后就是procedure的end了,错误就出现在这里:FlatEdit2.Text为什么都没有,即使用TEdit也是(试过的),而用到返回的没有经过其他加工的S的Memo1却什么也没事,而且错误是出现在这个procedure的end的时候的(Invalid pointer个没完,然后就Application Error),当把DLL1中的函数复制到EXE1里面(不用调用DLL1了)以上错误全无,证明DLL1中的函数没错(只是一个字符串转换程序)。
EXE2调用DLL2中的唯一的函数,DLL2又调用DLL1中的唯一的函数,还是在程序执行到end的时候出现错误(Invalid pointer),这次没有没完,只是3次而已,不过也够人烦的,而当把DLL1中的唯一的函数复制到DLL2时(不用调用DLL1了,如果只是静态声明要调用,可能不会出错,只是当时没有试而已),DLL2却什么错误都没出现,而倒是EXE2出错了(还是Invalid Pointer,重新编译几次后,也许是操作系统的问题吧,现在是先非法操作,然后再Invalid Pointer)。
于是我推测,只要静态调用DLL,就会出现以上错误,因为以上的DLL都是正常的,我用的是Delphi 6 Enterprise。
#4
操作系统是Win98SE(Chinese)+IE5.5(English)。
#5
up
#6
还是用DELPHI5吧,DELPHI6太不好用了,在数据库控件方面在太多的BUG.累死我了.
#7
不要用string传递参数,用指针或者ShortString
#8
好像是用ShareMEM就可以了吧?以前我经常用STRING的。
另外,现在程序我跟踪了源代码,源代码改成动态调用,在FreeLibrary后还执行了一些其他操作,程序错误在有调用的procedure的end,执行后马上出错,什么事情都没有,只有错误提示。
另外,现在程序我跟踪了源代码,源代码改成动态调用,在FreeLibrary后还执行了一些其他操作,程序错误在有调用的procedure的end,执行后马上出错,什么事情都没有,只有错误提示。
#9
那肯定是调用函数没有申明对,把堆栈搞乱了。一般都用stdcall
#10
stdcall也早就试过了,现在我改用PChar来传递,一切OK.
不过很奇怪,以前版本的Delphi我也用String,可是就是没有这样的问题。
不过很奇怪,以前版本的Delphi我也用String,可是就是没有这样的问题。
#11
我也觉得用pchar比较好,在dll中不用string
#1
gz
#2
in detail
#3
上次说的不详细,现在又有新的发现。
我原来有2个EXE,2个DLL,如下:
EXE1静态调用DLL1中的唯一的函数
EXE2静态调用DLL2,DLL2静态调用DLL1中的唯一的函数
EXE1里有以下控件:
2个Label,2个TFlatEdit,1个MEMO和一个Button.
按下Button,则从DLl1中唯一的一个函数中获得一个String(use Result in DLL, 在EXE1中S:=Result),用FlatEdit1.Text作为参数,返回一个S,然后向FlatEdit2中写入S,并向Memo写入一些东东,用到刚才的那个返回值S,直到最后Memo1.Items.SaveToFile,然后就是procedure的end了,错误就出现在这里:FlatEdit2.Text为什么都没有,即使用TEdit也是(试过的),而用到返回的没有经过其他加工的S的Memo1却什么也没事,而且错误是出现在这个procedure的end的时候的(Invalid pointer个没完,然后就Application Error),当把DLL1中的函数复制到EXE1里面(不用调用DLL1了)以上错误全无,证明DLL1中的函数没错(只是一个字符串转换程序)。
EXE2调用DLL2中的唯一的函数,DLL2又调用DLL1中的唯一的函数,还是在程序执行到end的时候出现错误(Invalid pointer),这次没有没完,只是3次而已,不过也够人烦的,而当把DLL1中的唯一的函数复制到DLL2时(不用调用DLL1了,如果只是静态声明要调用,可能不会出错,只是当时没有试而已),DLL2却什么错误都没出现,而倒是EXE2出错了(还是Invalid Pointer,重新编译几次后,也许是操作系统的问题吧,现在是先非法操作,然后再Invalid Pointer)。
于是我推测,只要静态调用DLL,就会出现以上错误,因为以上的DLL都是正常的,我用的是Delphi 6 Enterprise。
我原来有2个EXE,2个DLL,如下:
EXE1静态调用DLL1中的唯一的函数
EXE2静态调用DLL2,DLL2静态调用DLL1中的唯一的函数
EXE1里有以下控件:
2个Label,2个TFlatEdit,1个MEMO和一个Button.
按下Button,则从DLl1中唯一的一个函数中获得一个String(use Result in DLL, 在EXE1中S:=Result),用FlatEdit1.Text作为参数,返回一个S,然后向FlatEdit2中写入S,并向Memo写入一些东东,用到刚才的那个返回值S,直到最后Memo1.Items.SaveToFile,然后就是procedure的end了,错误就出现在这里:FlatEdit2.Text为什么都没有,即使用TEdit也是(试过的),而用到返回的没有经过其他加工的S的Memo1却什么也没事,而且错误是出现在这个procedure的end的时候的(Invalid pointer个没完,然后就Application Error),当把DLL1中的函数复制到EXE1里面(不用调用DLL1了)以上错误全无,证明DLL1中的函数没错(只是一个字符串转换程序)。
EXE2调用DLL2中的唯一的函数,DLL2又调用DLL1中的唯一的函数,还是在程序执行到end的时候出现错误(Invalid pointer),这次没有没完,只是3次而已,不过也够人烦的,而当把DLL1中的唯一的函数复制到DLL2时(不用调用DLL1了,如果只是静态声明要调用,可能不会出错,只是当时没有试而已),DLL2却什么错误都没出现,而倒是EXE2出错了(还是Invalid Pointer,重新编译几次后,也许是操作系统的问题吧,现在是先非法操作,然后再Invalid Pointer)。
于是我推测,只要静态调用DLL,就会出现以上错误,因为以上的DLL都是正常的,我用的是Delphi 6 Enterprise。
#4
操作系统是Win98SE(Chinese)+IE5.5(English)。
#5
up
#6
还是用DELPHI5吧,DELPHI6太不好用了,在数据库控件方面在太多的BUG.累死我了.
#7
不要用string传递参数,用指针或者ShortString
#8
好像是用ShareMEM就可以了吧?以前我经常用STRING的。
另外,现在程序我跟踪了源代码,源代码改成动态调用,在FreeLibrary后还执行了一些其他操作,程序错误在有调用的procedure的end,执行后马上出错,什么事情都没有,只有错误提示。
另外,现在程序我跟踪了源代码,源代码改成动态调用,在FreeLibrary后还执行了一些其他操作,程序错误在有调用的procedure的end,执行后马上出错,什么事情都没有,只有错误提示。
#9
那肯定是调用函数没有申明对,把堆栈搞乱了。一般都用stdcall
#10
stdcall也早就试过了,现在我改用PChar来传递,一切OK.
不过很奇怪,以前版本的Delphi我也用String,可是就是没有这样的问题。
不过很奇怪,以前版本的Delphi我也用String,可是就是没有这样的问题。
#11
我也觉得用pchar比较好,在dll中不用string