一个奇怪的问题,可能是d6的bug。

时间:2021-12-09 16:53:03
我用Delphi6静态调用一个自己写的DLL,老是出错,说Ivalid O.....(2个单词,具体忘记了),而且错误指在D6的源代码上,而如果把DLL里的唯一的一个函数复制到我程序的源代码里面,则没有这个错误,我试过ShereMEM的添加/删除,stdcall的添加/删除都无济于事。好奇怪的问题。

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。

#4


操作系统是Win98SE(Chinese)+IE5.5(English)。

#5


up

#6


还是用DELPHI5吧,DELPHI6太不好用了,在数据库控件方面在太多的BUG.累死我了.

#7


不要用string传递参数,用指针或者ShortString

#8


好像是用ShareMEM就可以了吧?以前我经常用STRING的。
另外,现在程序我跟踪了源代码,源代码改成动态调用,在FreeLibrary后还执行了一些其他操作,程序错误在有调用的procedure的end,执行后马上出错,什么事情都没有,只有错误提示。

#9


那肯定是调用函数没有申明对,把堆栈搞乱了。一般都用stdcall

#10


stdcall也早就试过了,现在我改用PChar来传递,一切OK.
不过很奇怪,以前版本的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。

#4


操作系统是Win98SE(Chinese)+IE5.5(English)。

#5


up

#6


还是用DELPHI5吧,DELPHI6太不好用了,在数据库控件方面在太多的BUG.累死我了.

#7


不要用string传递参数,用指针或者ShortString

#8


好像是用ShareMEM就可以了吧?以前我经常用STRING的。
另外,现在程序我跟踪了源代码,源代码改成动态调用,在FreeLibrary后还执行了一些其他操作,程序错误在有调用的procedure的end,执行后马上出错,什么事情都没有,只有错误提示。

#9


那肯定是调用函数没有申明对,把堆栈搞乱了。一般都用stdcall

#10


stdcall也早就试过了,现在我改用PChar来传递,一切OK.
不过很奇怪,以前版本的Delphi我也用String,可是就是没有这样的问题。

#11


我也觉得用pchar比较好,在dll中不用string