21世纪悬赏(200分)

  • 主题发起人 主题发起人 孤独求败
  • 开始时间 开始时间

孤独求败

Unregistered / Unconfirmed
GUEST, unregistred user!

我在一个Dll 文件中,继承TTable 类,共有两个FoxPro数据库;
测试如下:
原程序如下:
library counter;

uses
SysUtils,
Classes,
DealString in 'DealString.pas',

{$R *.RES}
exports
DealString;

begin
end.

--------------------------
unit DealString;

interface
uses
Windows, Messages, dbtables,SysUtils, Classes, Graphics, Controls, Forms,
Dialogs;

Const

Function DealString(AInput: PChar):PChar;stdcall;

implementation

Function DealString(AInput: PChar):PChar;stdcall;

var
AOutput:PChar;
Path:array[0..MAX_PATH-1] of Char;
PathStr:string;
Appini:TiniFile;
BranchPath:string;
InString: string;
InType: string;
OutString: string;
InStringList: TStringList;
InTable,OutTable :TTable;


begin
SetString(PathStr,Path,GetModuleFileName(HInstance,Path,SizeOf(Path)));
BranchPath:=ExtractFilePath(PathStr);
Appini:=TiniFile.Create(BranchPath+'Branch.ini');

InTable:=TTable.Create(nil );
OutTable:=TTable.Create(nil );

InStringList := TstringList.Create;
CommandList := TStringList.Create;

try
InTable.DatabaseName:=Appini.ReadString('Interface','InDatabaseName','');
OutTable.DatabaseName:=Appini.ReadString('Interface','OutDatabaseName','');
InTable.Tablename := Appini.ReadString('Interface','InTablename','');
OutTable.Tablename := Appini.ReadString('Interface','OutTablename','');
InTable.Active := True;
OutTable.Active := True;

InString := AInput;
OutStrin := InString+' Hello';

GetMem(AOutput,Length(OutString)+ 1);
StrCopy(AOutput, PChar(OutString));
FreeMem(AOutput);
Result:=AOutput;
finally
InStringList.Free;
Appini.Free;
InTable.Free ;
OutTable.Free;
end;
end;

end.
-------------------
调用程序如下:

procedure TForm1.Button1Click(Sender: TObject);
var
InString: string;
DInput: PChar;
DOutput: PChar;
begin
InString := edit1.text;

GetMem(DInput,Length(InString)+ 1);
StrCopy(DInput,PChar(InString));
DOutput:=DealString(DInput);
Label1.Caption:= DOutput;
FreeMem(DInput);
end;
---------
branch.ini
[Interface]
InDatabaseName=C:/WINDOWS/Desktop/tt/db/longdatabase
OutDatabaseName=C:/WINDOWS/Desktop/tt/db/longdatabase
InTableName=info.dbf
OutTableName=info1.dbf


------------
出现错误如下:
1、当两个数据库同时Active:=True系统报错;
2、当数据字段为10时(我设定的)系统报错,或出来乱码;
3、字段少时没有问题
4、不稳定

环境:win98/Delphi 5 enterprise

 
呵呵,21世纪不会有人用foxpro的.
 
GetMem(AOutput,Length(OutString)+ 1);
StrCopy(AOutput, PChar(OutString));
FreeMem(AOutput);
^^^^^^^^^^^^^^^^^^^^^^^
Result:=AOutput;

你把OUTPUT都FREE掉了,还能指望程序稳定吗?
 
因为是foxpro的表,所以你那样做有些不妥。还是建议你用ODBC连接,
borland的东西访问microsoft的东西,总是不爽,还是M$的自己的东西
管用。
我上篇文章的毛病解决掉后,不少问题估计都会消失。
 
呵呵,你的程序问题多多。

1。返回PChar一般在调用的地方申请内存。不要在一段声请,另一端释放,回出问题。

//AOutput在Exe中声请
DealString(AInput: PChar;var AOutput:PChar):PChar;stdcall
//在Dll中将数据Move到AOutput中。

2.SessionName没有设置。


 
delphi用FOXPRO库问题多多,
hcn ok
 
:沈前卫:你是我的大救星,sessionname曾经设过,一样报错。
不过,你的那种move 我想知道怎么用?
另外,我把代码重新写成 Result:=AOutput;
FreeMem(AOutput);,同样报错?
 
我的Exe和Dll都有,Pchar类型,所以要各自申请各自的,是吗?
 
对,就是各自申请各自,各释放各的。

当然也可以在异端声请,另外异端释放,不过比较麻烦。大概是这样,在相应的单元
的uses的第一个(注意,必须是第一个)加入ShareMem,Exe和DLl都要加。具体信息
看看Delphi的帮助。查关键字DLL,善后漫漫找吧(不一定在那一页,但在他负荆)
 
多人接受答案了。
 
后退
顶部