现在有一个被调用 MDaemonAPI_Impl.pas 文件,
主窗体fServerForm,
我想在主窗体fServerForm调用MDaemonAPI_Impl的函数,
已经做了以下两点
  1: 在主窗体已经引用被调用文件
  2: 被调用的文件的函数已经设置成publi 或者 published都不行
现在可以访问被调文件的部分内容(比如 MDaemonAPI_Impl.TMDaemonAPI.create()),想调函数AddUser()却不行见主窗体的/*调试行*/ 行代码,那里的adduser怎么也出不来,
何故?源文件如下
被调用文件
unit MDaemonAPI_Impl;{$I RemObjects.inc}interfaceuses
  {$IFDEF FPC}LResources,{$ENDIF}
  {vcl:} Classes, SysUtils,
  {RemObjects:} uROXMLIntf, uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,
  {Required:} uRORemoteDataModule,
  {Generated:} MDaemonAPILibrary_Intf;type
  { TMDaemonAPI }
  TMDaemonAPI = class(TRORemoteDataModule, IMDaemonAPI)
  private
    sMessage: AnsiString;
  public
    { IMDaemonAPI methods }
    function AddUser(const FullName: AnsiString; const UserName: AnsiString; const Password: AnsiString; const Domain: AnsiString): Integer;
    function ChangePassword(const Email: AnsiString; const NewPassword: AnsiString): Boolean;
    function DeleteUser(const Email: AnsiString): Boolean;
    function GetMessage: AnsiString;
  end;implementation{$IFNDEF FPC}
  {$R *.dfm}
{$ENDIF}
uses
  {Generated:} MDaemonAPILibrary_Invk, MDUSERCOMLib_TLB;procedure Create_MDaemonAPI(out anInstance : IUnknown);
begin
  anInstance := TMDaemonAPI.Create(nil);
end;{ MDaemonAPI }
function TMDaemonAPI.AddUser(const FullName: AnsiString; const UserName: AnsiString; const Password: AnsiString; const Domain: AnsiString): Integer;
  begin
     {内容略}
  end;function TMDaemonAPI.ChangePassword(const Email: AnsiString; const NewPassword: AnsiString): Boolean;
begin
{内容略}  
end;function TMDaemonAPI.DeleteUser(const Email: AnsiString): Boolean;
begin
{内容略}
end;function TMDaemonAPI.GetMessage: AnsiString;
begin
  result:= sMessage;
  if AddUser('a','bb','c','d')>0 then
  begin  end;
end;var
  fClassFactory: IROClassFactory;
initialization
{$IFDEF FPC}
  {$I MDaemonAPI_Impl.lrs}
{$ENDIF}
  fClassFactory := TROClassFactory.Create('MDaemonAPI', Create_MDaemonAPI, TMDaemonAPI_Invoker);
  // RegisterForZeroConf(fClassFactory,'_MDaemonAPI_rosdk._tcp.');finalization
  UnRegisterClassFactory(fClassFactory);
  fClassFactory := nil;end.主窗体代码如下
unit fServerForm;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
  uROClient, uROPoweredByRemObjectsButton, uROClientIntf, uROServer,
  uROSOAPMessage, uROIndyHTTPServer, ExtCtrls, Menus, ImgList, uROIndyTCPServer;type
  TServerForm = class(TForm)
    ROMessage: TROSOAPMessage;
    ROServer: TROIndyHTTPServer;
    TrayIcon1: TTrayIcon;
    ImageList1: TImageList;
    PopupMenu1: TPopupMenu;
    Exit1: TMenuItem;
    Button1: TButton;
    Timer1: TTimer;
    Label1: TLabel;
    Button2: TButton;
    N1: TMenuItem;
    About1: TMenuItem;
    PopupMenu2: TPopupMenu;
    inputaccount1: TMenuItem;
    addacount1: TMenuItem;
    OpenDialog1: TOpenDialog;
    procedure Timer1Timer(Sender: TObject);
    procedure Exit1Click(Sender: TObject);
    procedure TrayIcon1DblClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure About1Click(Sender: TObject);
    procedure inputaccount1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  ServerForm: TServerForm;implementationuses MDaemonAPI_Impl;
{$R *.dfm}procedure TServerForm.About1Click(Sender: TObject);
begin
  MessageDlg('MDaemon API Server v1.0'#13#10'Service to mail user management for OA.'#13#10'(c)Copyright 2010, [email protected]', mtInformation, [mbOK], 0);
end;procedure TServerForm.Button1Click(Sender: TObject);
var
  r: Integer;
beginend;procedure TServerForm.Button2Click(Sender: TObject);
begin
  
end;procedure TServerForm.Exit1Click(Sender: TObject);begin
  end;procedure TServerForm.FormCreate(Sender: TObject);
begin
 
end;procedure TServerForm.inputaccount1Click(Sender: TObject);
var
  CsvLines, CommaStr: TStringList;
  i,j:integer;
begin
    if OpenDialog1.Execute  then
      begin
          CsvLines := TStringList.Create;
          CommaStr := TStringList.Create;
          CsvLines.LoadFromFile(OpenDialog1.FileName);  //读取
          for i := 0 to CsvLines.Count - 1 do
             begin
                CommaStr.CommaText := CsvLines[i];
                for j := 0 to CommaStr.Count - 1 do
                    begin
                       showmessage(CommaStr[j]);
     /*调试行*/                  if  (MDaemonAPI_Impl.TMDaemonAPI.AddUser...) then
                         begin                         end;                    end;
             end;
          CsvLines.Free;
          CommaStr.Free;      end;
end;procedure TServerForm.Timer1Timer(Sender: TObject);
beginend;procedure TServerForm.TrayIcon1DblClick(Sender: TObject);
begin
  Show;
end;end.

解决方案 »

  1.   

    类方法就是 前面加上 class修饰
      

  2.   

    类方法:
    class function AddUser(const FullName: AnsiString; const UserName: AnsiString; const Password: AnsiString; const Domain: AnsiString): Integer;在实现的部分也需要添加!
    只有类方法可以直接调用,如你的代码:
    /*调试行*/ if (MDaemonAPI_Impl.TMDaemonAPI.AddUser...)
    否则,你需要创建实例才可以。类方法中不能包含类成员变量
      

  3.   

    按照楼上兄弟的说法
    在被调文件中的函数加了class
    //定义 
     public
        { IMDaemonAPI methods }
         class function AddUser(const FullName: AnsiString; const UserName: AnsiString; const Password: AnsiString; const Domain: AnsiString): Integer;//函数体
    { MDaemonAPI }
    class function TMDaemonAPI.AddUser(const FullName: AnsiString; const UserName: AnsiString; const Password: AnsiString; const Domain: AnsiString): Integer;
    begin
    end;编译报错
    [DCC Error] MDaemonAPI_Impl.pas(32): E2211 Declaration of 'AddUser' differs from declaration in interface 'IMDaemonAPI'
      

  4.   

    下面也要加啊!
    如下:
    class function TMDaemonAPI.AddUser(const FullName: AnsiString; const UserName: AnsiString; const Password: AnsiString; const Domain: AnsiString): Integer;
      begin
      {内容略}
      end;
      

  5.   

    多谢楼上兄弟,我上面下面就是都加了呀
    按照楼上兄弟的说法
    在被调文件中的函数加了class
    //定义  
     public
      { IMDaemonAPI methods }
      class function AddUser(const FullName: AnsiString; const UserName: AnsiString; const Password: AnsiString; const Domain: AnsiString): Integer;//函数体
    { MDaemonAPI }
    class function TMDaemonAPI.AddUser(const FullName: AnsiString; const UserName: AnsiString; const Password: AnsiString; const Domain: AnsiString): Integer;
    begin
    end;编译报错
    [DCC Error] MDaemonAPI_Impl.pas(32): E2211 Declaration of 'AddUser' differs from declaration in interface 'IMDaemonAPI'
      

  6.   

    要声明个变量,然后创建个实例,在调用adduser函数
      

  7.   


    unit Unit2;interface
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, OleCtrls, SHDocVw;
     type
       TTestClass=class
       public
          class function AddUser(): Integer;
       end;
    implementation
    class function TTestClass.AddUser(): Integer;
    begin
       Result:=1;
    end;
    end.unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, OleCtrls, SHDocVw;type
      TForm1 = class(TForm)
        WebBrowser1: TWebBrowser;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation
    uses
      Unit2;
    {$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
     ShowMessage(IntToStr(TTestClass.adduser));
    end;这样只能感知器不提示,但是能编译,能正常运行。。可以得到结果
      

  8.   

    这个错误看起来是你的class和对应的interface中的方法定义不一致所导致的.我猜你的MDaemonAPI_Impl实现的借口中应该包含IMDaemonAPI吧?