dlls变量调用(急、、、、)(10分)

  • 主题发起人 主题发起人 gutian
  • 开始时间 开始时间
G

gutian

Unregistered / Unconfirmed
GUEST, unregistred user!
如何才能从DLLS中读取变量的值,由DLLS中VAR声明的
倾我所有。各位帮个忙
 
没戏,只有通过函数才读的出来
 
这是我调用dlls的程序
unit dllprj;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
function init:integer
external 'h:/工作目录/dllspcom/formprj.dll';
function entry:integer
external 'h:/工作目录/dllspcom/formprj.dll';
function readtrack(track :integer;info:pchar):string
external 'h:/工作目录/dllspcom/formprj.dll';
function getstr:pchar
external 'h:/工作目录/dllspcom/formprj.dll';

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
init();
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
entry();
end;

procedure TForm1.Button3Click(Sender: TObject);
var
info:pchar;
tmp:string;
begin
tmp:=readtrack(0,info);
info:=getstr();
showmessage(info);
end;
我发现一个问题,我在DLLS中使用了一个SPCOM的控件,当我运行BUTTON3时,先执行READTRACK()
然后执行GETSTR(),再执行showmessage(),这时,COM端口的信息才有返回。why????
按道理,我执行readtrack()时,信息已经发送端口,端口应该马上会有响应的。为什么一定
要等别的执行完才有响应。
 
哪位老兄能够告诉我如何向DELPHI(DLLS)中传递变量。
function writetrack(track:integer;trackinfo:pchar):integer;
我在DLLS如上声明,如果用DELPHI调用则没有问题,而用VC,VB调用都出错,参数不知
是什么玩意
 
gutian: 调用方式问题, 强制使用stdcall应该就可以了.

另外, 在使用消息机制的程序中应该经常使用application.processmessages的,
否则程序将会堆积消息知道有类似显示等事件发生时才异步执行消息的.
 
to iknow:
在使用消息机制的程序中应该经常使用application.processmessages的,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
否则程序将会堆积消息知道有类似显示等事件发生时才异步执行消息的
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如何使用application.processmessages,能否详细讲述,谢谢
我使用SPCOMM来做DLLS,我使用READTRACK(INTEGER):INTEGER向COM提出请求,但
返回的数据不能直接从READTRACK取回,因为数据取回在ONRECEIVEDATA()事件中。我
想用另一个借口函数GETSTR:PCHAR取数据,但是我发觉如果调用时,如果在一个事件中
先执行READTRACK,然后执行GETSTR(),根本取不到数据,因为系统是在GETSTR后才有数据
返回。
所以我必须,调用时,用两个事件来完成(也就是要分两步)。不知如何改进
 
附加功能 将问题提前
 
很简单嘛.
你的dll中的READTRACK可以用一个循环, 直到取到数据再返回. 大致如下:
var
StrReceived: Boolean;

function ReadTrack(var Buffer: PChar): Integer
stdcall

begin
StrReceived := False;
while not StrReceived do
begin
WaitMessage;
Application.ProcessMessages;
end;
Result := ....;
......
end;

然后在spcomm的ONRECEIVEDATA事件中接受完数据后设置StrReceived:=True;
然后再PostMessage随便给自己发送一个消息(随便自定义一个或者用个不会引起冲
突的系统消息), 主要目的是为了ReadTrack能够跳出WaitMessage等待并结束循环.
 
既然有SPCOMM还是把她引入到Package中,作为组件加到窗体上岂不是使用更方便
 
接受答案了.
 
后退
顶部