关于 Remobjecs在DLL接收消息异常的问题?
type
TSuperClientForm = class(TForm, IChatEvents)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
Label3: TLabel;
LabelState: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label10: TLabel;
Label4: TLabel;
Label9: TLabel;
Label11: TLabel;
Label12: TLabel;
edUsers: TListBox;
SendButton: TButton;
LogonButton: TButton;
LogoffButton: TButton;
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
EditServerIP: TEdit;
EditServerPort: TEdit;
EditAgentCode: TEdit;
EditQueueList: TEdit;
EditLoginTime: TEdit;
EditRestTypeCode: TEdit;
EditUserCode: TEdit;
RadioButton1: TRadioButton;
RadioButtonAuto: TRadioButton;
ListView1: TListView;
edText: TMemo;
EditReqReason: TEdit;
Memo1: TMemo;
Memo2: TMemo;
ROMessage: TROBinMessage;
ROChannel: TROSuperTCPChannel;
RORemoteService: TRORemoteService;
ROEventReceiver: TROEventReceiver;
cdsCustomers: TClientDataSet;
dsCustomers: TDataSource;
RODataSnapConnection1: TRODataSnapConnection;
HTTPChannel: TROWinInetHTTPChannel;
ConnectButton: TBitBtn;
DisconnectButton: TBitBtn;
ROBinMessage: TROBinMessage;
gProducts: TDBGrid;
Panel1: TPanel;
ButtonOK: TButton;
Button1: TButton;
Label13: TLabel;
Edit1: TEdit;
procedure FormDestroy(Sender: TObject);
procedure SendButtonClick(Sender: TObject);
procedure LogonButtonClick(Sender: TObject);
procedure LogoffButtonClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure EditQueueListChange(Sender: TObject);
procedure EditLoginTimeChange(Sender: TObject);
procedure EditRestTypeCodeChange(Sender: TObject);
procedure EditUserCodeChange(Sender: TObject);
procedure RadioButtonAutoClick(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
procedure EditReqReasonChange(Sender: TObject);
procedure EditServerIPChange(Sender: TObject);
procedure ButtonOKClick(Sender: TObject);
procedure DisconnectButtonClick(Sender: TObject);
procedure ConnectButtonClick(Sender: TObject);
procedure ApplyUpdatesButtonClick(Sender: TObject);
procedure OnEnableApplyUpdates(DataSet: TDataSet);
procedure cdsCustomersAfterEdit(DataSet: TDataSet);
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FSendMsg,aUserName: string;
FMessageServer: TMessageServer;
FConnected: Boolean;
lLogin: ILoginService;
lChat: IChatServerService;
{ Private declarations }
procedure MakeReqMessage;
public
//注册EVENT,在单独的程序中正常,但在DLL中不能正常返回
procedure Message(const From: Widestring; const Target: Widestring;
const Message: Widestring);
procedure UserLogin(const Nickname: Widestring);
procedure UserLogout(const Nickname: Widestring);
procedure ShutdownServer;
procedure DecodeMsg(aMsg: string);
//收到消息
procedure SyncCall(var Msg: TMessage); message WM_USER;
property MessageServer: TMessageServer write FMessageServer;
end;
TSyncType = (stMessage, stUserLogin, stUserLogout);
TStringArray = array of Widestring;
实现部分
lLogin := CoLoginService.Create(ROMessage, ROChannel);
lChat := CoChatServerService.Create(ROMessage, ROChannel);
ROEventReceiver.RegisterEventHandlers([EID_ChatEvents], [Self]);
ROEventReceiver.Activate;
在单独的程序每次调用LLogin和LChat,procedure Message 都能被解发并返回值。但被这些同样的代码和窗体弄到一个DLL中,一点变化都没有,就会出现procedure Message 无法被触发的情况! 搞了两天了没解决,谢谢大家了!
[解决办法]
好像是因为dll没有自己的消息循环,所以消息没有被正确处理吧
LZ可以试着由外部发送消息给dll窗体
或者更改目前的消息处理机制,比如说内部消息触发改为函数触发~
[解决办法]
Dll中窗体和程序中的窗体都是可以接收消息的,这个只有自己慢慢调试了
[解决办法]
懵一个 stdcall
[解决办法]
楼主不能做个小demo,让大家下载调试看看?两种模式的。大家大多都没空给弄相同的环境,很费时间的。