線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1120
推到 Plurk!
推到 Facebook!

將WINSOCKET包成COM+有可能嗎?

尚未結案
Kenlin2004
一般會員


發表:20
回覆:33
積分:10
註冊:2004-10-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-27 13:59:19 IP:61.30.xxx.xxx 未訂閱
小弟想將WinSocketAPI作成COM ,然後給ASP調用,在傳送方面可以實現 但接收方面遇至困難,小弟要如何才能攔截WINSocket的接收事件然後在 接收完畢後才結束COM ,傳值給ASP? 除了WINSocket以外有其它方法嗎?如INDY或HOOK
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-27 16:15:57 IP:61.222.xxx.xxx 未訂閱
您可以定義一個事件來接收 INDY 或 WinSocket 的接收事件。
type
  TShitClass = class
  private
    procedure DataReceived(Sender: TComponent;NumberBytes: Integer; FromIP: String; Port: Integer);
  end;    Var
  Shit    : TShitClass;
再將接收的資料交由COM指針來處理。
Kenlin2004
一般會員


發表:20
回覆:33
積分:10
註冊:2004-10-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-27 16:46:50 IP:61.30.xxx.xxx 未訂閱
沒那麼簡單吧! 原始程式如下 unit Unit1; {$WARN SYMBOL_PLATFORM OFF} interface uses ActiveX, Mtsobj, Mtx, ComObj,Messages,WinSock,StdVcl; const WM_SOCK = WM_USER 1; TCP_PORT = 5432; type TMtsConn = class(TMtsAutoObject, IMtsConn) protected function ServerRun(const comm: WideString): OleVariant; safecall; private DllHandle : THandle; HasConnected: boolean; CliSocket: integer; CliAddrIn:TSockAddrIn; procedure InitSocket; procedure SendData(Content: string); procedure ReadData(var Message: TMessage); message WM_SOCK; procedure SockConnect; end; implementation uses ComServ; function TMtsConn.ServerRun(const comm: WideString): OleVariant; begin InitSocket; if (not HasConnected) then SockConnect; SendData(comm); //問題在這,在函數結束以前希望能返回接收數據 CloseSocket(CliSocket); end; procedure TMtsConn.InitSocket; var wsadata: TWsadata; err{, optval}: integer; begin WSAStartup($0101,WSAData); CliSocket := socket(AF_INET, SOCK_STREAM,0); if (CliSocket = INVALID_SOCKET) then begin CloseSocket(CliSocket); exit; end; //定義WinSock接收事件 DllHandle:=GetHandle(ciMultiInstance); WSAAsyncSelect(CliSocket, DllHandle , WM_SOCK, FD_READ); end; procedure TMtsConn.SockConnect; var err: integer; begin CliAddrIn.sin_addr.s_addr:=inet_addr(PChar('127.0.0.1')); CliAddrIn.sin_family := AF_INET; CliAddrIn.sin_port :=htons(TCP_PORT); repeat err:=connect(CliSocket,CliAddrIn, SizeOf(CliAddrIn)); if err = -1 then begin HasConnected := false; break; end else begin HasConnected := true; end; until err=0; end; //數據發送方法 procedure TMtsConn.SendData(Content: string); begin Send(CliSocket,Content[1],length(Content),0); end; //數據接收事件 procedure TMtsConn.ReadData(var Message: TMessage); var Event: word; Buf:array[0..1023] of char; DataLen: integer; begin Event := WSAGetSelectEvent(Message.LParam); case Event of FD_READ: begin DataLen := Recv(CliSocket,Buf,1024,0); buf[DataLen] := #0; // 如何才能返回這裡的數據給COM呼叫著 Result:=Buf; end; end; end.
Kenlin2004
一般會員


發表:20
回覆:33
積分:10
註冊:2004-10-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-27 16:49:54 IP:61.30.xxx.xxx 未訂閱
問題在於函數調用完畢,COM不會去等待SOCKET的接收事件就會自行結束
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-27 17:10:22 IP:61.222.xxx.xxx 未訂閱
您是說 Outgoing Interface嗎?
Kenlin2004
一般會員


發表:20
回覆:33
積分:10
註冊:2004-10-27

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-28 16:27:37 IP:61.30.xxx.xxx 未訂閱
無解,除非東方不敗再世! 替代方案:在SERVER端建立ECHO,讓CLIENT一連上馬上收到資料 不過缺點是會占掉二個PORT
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-10-28 19:37:52 IP:61.222.xxx.xxx 未訂閱
建議改用 ActiveX 方式。 用 ConnectionPoint 方式,可能比較好辦事。
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-10-29 12:35:13 IP:218.17.xxx.xxx 未訂閱
引言: 建議改用 ActiveX 方式。 用 ConnectionPoint 方式,可能比較好辦事。
ASP调用COM ,可能没办法获得COM 的事件通知。普通程序的话,好象可以让COM 做回调事件来主动通知。
Kenlin2004
一般會員


發表:20
回覆:33
積分:10
註冊:2004-10-27

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-10-29 13:36:22 IP:61.30.xxx.xxx 未訂閱
引言: ASP调用COM ,可能没办法获得COM 的事件通知。普通程序的话,好象可以让COM 做回调事件来主动通知。
如果可以讓COM接收到數據存放在一指針上,然後再以其它法取得資料,如 在ASP端: <% //定義一指針 Dim vaData On Error Resume Next //傳送資料到COM元件 Call xSocket.SendBytesTo(xAddress,"Hello",0) if xSocket.finished then //接收從COM元件傳回的資料 Call xSocket.ReceiveBytesFrom(xAddress,vaData,1) %> 這種方法可行嗎?
Kenlin2004
一般會員


發表:20
回覆:33
積分:10
註冊:2004-10-27

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-10-29 13:39:34 IP:61.30.xxx.xxx 未訂閱
SORRY 重傳 ASP端: //定義一指針 Dim vaData On Error Resume Next //傳送資料到COM元件 Call xSocket.SendBytesTo(xAddress,"Hello",0) if xSocket.finished then //接收從COM元件傳回的資料 Call xSocket.ReceiveBytesFrom(xAddress,vaData,1)
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-04-26 13:51:24 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-06-08 0:27:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!