NT消息发送器中,api的形参和实参怎么会不相同呢?(100分)

  • 主题发起人 变成浪子
  • 开始时间

变成浪子

Unregistered / Unconfirmed
GUEST, unregistred user!
我的环境是win2000加D6。
我用了两个单元。
unit main;

interface

uses Unit2, //使用vUnit2.pas
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls;

type
TfrmMain = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Label1: TLabel;
AddrBox: TComboBox;
BitBtn1: TBitBtn;
Panel3: TPanel;
Panel4: TPanel;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
Panel5: TPanel;
MesText: TMemo;
StatusLabel: TLabel;
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure MesTextChange(Sender: TObject);
procedure AddrBoxChange(Sender: TObject);
private
UserName:string;
MessageHeader:TStringList;
{ Private declarations }
public
{ Public declarations }
end;

var
frmMain: TfrmMain;

implementation

uses about;

{$R *.dfm}

procedure TfrmMain.BitBtn1Click(Sender: TObject);
var
i,res:integer;
begin
if AddrBox.Text<>'' then
begin
StatusLabel.Font.Color:=clBlack;
StatusLabel.Caption:='Wait...';
Update;
if AddrBox.Items.IndexOf(AddrBox.Text)=-1 then
AddrBox.Items.Add(Addrbox.Text);
res:=SendMsg(AddrBox.Text,'',MessageHeader.Text+mesText.text);
if res=0 then
frmMain.StatusLabel.Font.Color:=clBlue
else
frmMain.StatusLabel.Font.Color:=clRed;
case res of
0 :frmMain.StatusLabel.Caption:='The message is sent';
87 :frmMain.StatusLabel.Caption:='The parameter is incorrect';
123 :frmMain.StatusLabel.Caption:='Sintax is incorrect';
2273 :frmMain.StatusLabel.Caption:='Can not find'+frmMain.addrBox.Text;
else
frmMain.StatusLabel.Caption:='Error:'+IntToStr(res);
end;
end;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
var
strUser:pChar;
strSize:DWord;
begin
MesText.Lines.Clear; //清空
struser:=StrAlloc(100); //为strUser分配内存
strSize:=100;
GetUserName(strUser,strSize); //获得当前登入的用户名
UserName:=strUser;
StrDispose(strUser); //释放内存
MessageHeader:=TStringList.Create;
Messageheader.Add('-------------------');
Messageheader.Add(' from'+UserName);
Messageheader.Add('-------------------');
end;

procedure TfrmMain.MesTextChange(Sender: TObject);
begin
StatusLabel.Caption:='';
end;

procedure TfrmMain.AddrBoxChange(Sender: TObject);
begin
StatusLabel.Caption:='';
end;

end.



第二单元

unit Unit2;

interface
uses SysUtils,Classes;

function ToUnicode(str:string;dest:pWideChar):integer;
function SendMsg(Toh,From,Msg:string):integer;
function NetMessageBufferSend(servername:pWideChar;
MsgName:pWideChar;
Buf:pWideChar;
var BufLen:integer):integer;cdecl;

implementation

function ToUnicode(str:string;dest:pWideChar):integer;
var
len:integer;
begin
StringToWideChar(str,dest,len);
Result:=len;
end;

function NetMessageBufferSend; external'netapi32.dll' name 'NetmessageBufferSend';

function SendMsg(Toh,From,Msg:string):integer;
var
ToName:array[0..64] of WideChar;
WMsgText:array[0..1000] of WideChar;
MsgLen,i:integer;
begin
for i:=0 to 64 do ToName:=#0;
ToUnicode(Toh,ToName);
for i:=0 to 1000 do WMsgText:=#0;
ToUnicode(Msg,WMsgText);
Result:=NetMessageBufferSend(nil,ToName,nil,@WMsgText,MsgLen);
end;


end.
编译时说Result:=NetMessageBufferSend(nil,ToName,nil,@WMsgText,MsgLen);变量不符合。
代码:
 
>> Result:=NetMessageBufferSend(nil,ToName,nil,@WMsgText,MsgLen);
Result:=NetMessageBufferSend(nil,ToName,nil,WMsgText,MsgLen);???
 
这是api函数啊。
 
@WMsgText-->WMsgText
try it??
 
不行啊。
 
谁把它编译成功我把分全给了。
 
看来真的没人知道啊。
 
请看
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1317901
 
very very easy!
 
interface
uses SysUtils, Classes;

procedure ToUnicode(str:string;dest:pWideChar);
function SendMsg(Toh,From,Msg:string):integer;
function NetMessageBufferSend(servername:pWideChar;
MsgName:pWideChar;
FromName:pWideChar;
Buf: PWideChar;
var BufLen:integer):integer;cdecl;
implementation
procedure ToUnicode(str:string;dest:pWideChar);
begin
StringToWideChar(str,dest,1000);
end;


function NetMessageBufferSend; external 'netapi32.dll' name 'NetMessageBufferSend';

function SendMsg(Toh,From,Msg:string):integer;
var
ToName :array [0..64] of WideChar;
WMsgText:array [0..1000] of WideChar;
MsgLen, i:integer;
begin
for i := 0 to 64 do ToName := #0;
ToUnicode(Toh,ToName);
for i := 0 to 1000 do WMsgText := #0;
ToUnicode(Msg,WMsgText);
Result:=NetMessageBufferSend(nil,ToName,nil,@WMsgText,MsgLen);
end;

end.
这是我2000用过的,没有错误和警告……
 
to 变成浪子
今年帮人解答的最后一个问题了,希望你能收到我的答案
 
To duducat:
1. NetMessageBufferSend声明有误,应该为stdcall,使用cdecl会造成stack内容混乱:
function NetMessageBufferSend(servername:pWideChar;
MsgName:pWideChar;
FromName:pWideChar;
Buf: PWideChar;
var BufLen:integer):integer;stdcall;{cdecl;}
2. MsgLen使用前未初始化。
3. 同步发送会阻塞线程。
 
谢谢!我2000年用了以后就没有修改过了……:)
 
能否将原码发到我的邮箱?
xumin23@sina.com
 
楼上的,已经发了……
 
顶部