调用DLL出现“invalid pointer operation”的问题(100分)

  • 主题发起人 主题发起人 zhangkan
  • 开始时间 开始时间
Z

zhangkan

Unregistered / Unconfirmed
GUEST, unregistred user!
我调用我自己写的一个极简单的DLL例子,但调用出问题,不知是什么问题。源代码如下:
library fvsystem;//专案档
uses
SysUtils,
Classes,
FVUnit in 'FVUnit.pas';

{$R *.RES}

exports
TurnExcelCell index 1 name 'TurnExcelCell';
begin

end.

//程序档
unit FVUnit;

interface

uses
Windows,Messages,Sysutils,Dialogs;


function TurnExcelCell(a, k: integer): string;export;

implementation

function TurnExcelCell(a, k: integer): string;
var x,y,z:string;
b,c,i,j:integer;
begin
i:=0;
j:=0;
b:=a div 26;
c:=a mod 26;
if (b>=27) and (c>0) then begin
ShowMessage('轉換EXCEL行列值超出范圍﹗');
abort;
end
else if (b>0) and (b=27) then
i:=64+b-1
else if (b>0) and (b<27) then
i:=64+b
else if b=0 then
i:=64+26;
if c>0 then
j:=64+c
else if c=0 then
j:=64+26;
x:=Chr(i);
y:=Chr(j);
if (b>0) and (c>0) then
z:=x+y
else if (c=0) and (b=27) then
z:=x+y
else if ((c=0) and (b>0)) or ((c>0) and (b=0)) then
z:=y
else
z:=x;
Result:=z+IntToStr(k);
end;

end.
生成DLL正常,调用过程中出问题
unit libdll; //unit

interface

uses windows;

function TurnExcelCell(a, k: integer): string;

implementation

function TurnExcelCell(a, k: integer): string;external 'fvsystem.dll';

end.

//调用
procedure TForm1.Button1Click(Sender: TObject);
var tempstr:string;
begin
tempstr:=TurnExcelCell(1,2);
showmessage(tempstr);
end;
能正常得出结果,但接着出现“invalid pointer operation”的错误提示,不知是为什么。
哪位大侠能告诉我为什么吗?另外,有否关于写DLL的资料能告诉我,谢谢。我对此知道得
太少了。
 
可能是string的错误,你试试用pchar
 
你建的dll project的第一行说了,如果你要用string做参数或者返回值,
ShareMem必须放在uses的第一行
 
照着gutian的方法已经解决问题。不要熑我麻烦哈,我想问一下Pipi,我用String,而照着
你的方法加上ShareMem,还是出现相应问题,请问,假如我要用String做参数,怎样才不出
这个问题“invalid pointer operation”,现在可以确定是Pchar的问题,若我要用String,
怎样才能实现?
 
Delphi中的这个问题确实挺严重,我也碰到过类似的情况,用PChar当然可以,但有时
又不得不使用string时又如何呢?
如:在编写Dll中使用AdoTable1.Fields[0].AsString,能不使用string吗?
无奈,只好不做成Dll.
 
难道就没有别的法子了?
 
谁能不能再将DLL有一些注意事项告诉我?
 
同 DLL 交换字符串数据典型的方式是主动管理内存,在 Windows API 中广泛使用这种方法,
比如 GetWindowText 函数:

int GetWindowText(
HWND hWnd, // handle of window or control with text
LPTSTR lpString, // address of buffer for text 主调者调用之前先申请足够的内存
int nMaxCount // maximum number of characters to copy 把这块内存大小通知 DLL
);
这样, DLL 函数就只需要向缓冲区直接填写就可以了,这样写程序显得非常透明。
 
谢谢大家啦。
 
后退
顶部