將WINSOCKET包成COM+有可能嗎? |
尚未結案
|
Kenlin2004
一般會員 發表:20 回覆:33 積分:10 註冊:2004-10-27 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
Kenlin2004
一般會員 發表:20 回覆:33 積分:10 註冊:2004-10-27 發送簡訊給我 |
沒那麼簡單吧! 原始程式如下
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 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
Kenlin2004
一般會員 發表:20 回覆:33 積分:10 註冊:2004-10-27 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
|
Kenlin2004
一般會員 發表:20 回覆:33 積分:10 註冊:2004-10-27 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |