1,593
社区成员
发帖
与我相关
我的任务
分享
// 全局变量
LPWSAPROTOCOL_INFOW ProtocolInfo = NULL;
DWORD ProtocolInfoSize = 0;
INT TotalProtocols = 0;
WSAPROTOCOL_INFOW *pProtocolInfo;
TCHAR *sPathName;//delphi里可以用String/Pchar代替TCHAR吗?
WSAPROTOCOL_INFOW *pNextProtocolInfo;
INT iErrno;
iProviderPathLen = MAX_PATH;
TCHAR sLibraryPath[MAX_PATH];
LPWSPSTARTUP WSPStartupFunc = NULL;
HMODULE hLibraryHandle = NULL;
INT ErrorCode = 0;
WSAPROTOCOL_INFOW NextProtocolInfo;
BOOL GetProvider(...)//我这里只是提示返回的值是BOOL值,其他我都省略了。
{
// ......
// ......
}
////////////////////////////////////////////////////////////////////////////
if(WSCGetProviderPath(&ProtocolInfo.ProviderId
, sPathName, &iProviderPathLen, &iErrno) == SOCKET_ERROR)
return FALSE;
//WSCGetProviderPath函数在delphi的相关单元里是这样定义。
/*function WSCGetProviderPath(const lpProviderId: TGUID; lpszProviderDllPath: PWCHAR;
var lpProviderDllPathLen, lpErrno: Integer): Integer; stdcall;*/
if (!ExpandEnvironmentStrings(sPathName, sPathName, MAX_PATH))
return FALSE;
//ExpandEnvironmentStrings函数在delphi的相关单元里是这样定义。
//function ExpandEnvironmentStrings(lpSrc: LPCSTR; lpDst: LPSTR; nSize: DWORD): DWORD; stdcall;
if (!GetProvider(lpProtocolInfo, sLibraryPath, &NextProtocolInfo)
|| (hLibraryHandle = LoadLibrary(sLibraryPath)) == NULL
|| (WSPStartupFunc = (LPWSPSTARTUP)GetProcAddress(
hLibraryHandle, "WSPStartup")) == NULL
)
return WSAEPROVIDERFAILEDINIT;
//delphi不能这样该怎么办?
/*if (not GetProvider(lpProtocolInfo, sLibraryPath, @NextProtocolInfo)
or (hLibraryHandle = LoadLibrary(sLibraryPath)) = nil
or (WSPStartupFunc = (LPWSPSTARTUP)GetProcAddress(
hLibraryHandle, 'WSPStartup')) = nil
)then
return WSAEPROVIDERFAILEDINIT;*/
//同上
if ((ErrorCode = WSPStartupFunc(wVersionRequested, lpWSPData
, &NextProtocolInfo, upcallTable, lpProcTable)) != ERROR_SUCCESS)
return ErrorCode;
//这两个也要翻译。。。谢谢,
if(WSCGetProviderPath(&ProtocolInfo.ProviderId
, sPathName, &iProviderPathLen, &iErrno) == SOCKET_ERROR)
return FALSE;
//WSCGetProviderPath函数在delphi的相关单元里是这样定义。
/*function WSCGetProviderPath(const lpProviderId: TGUID; lpszProviderDllPath: PWCHAR;
var lpProviderDllPathLen, lpErrno: Integer): Integer; stdcall;*/
if (!ExpandEnvironmentStrings(sPathName, sPathName, MAX_PATH))
return FALSE;
//ExpandEnvironmentStrings函数在delphi的相关单元里是这样定义。
//function ExpandEnvironmentStrings(lpSrc: LPCSTR; lpDst: LPSTR; nSize: DWORD): DWORD; stdcall;
//声明
sPathName: Array[0..MAX_PATH] of WideChar;
if(WSCGetProviderPath(@(ProtocolInfo.ProviderId)
, sPathName(*或者PWideChar(@(sPathName[0])))*), iProviderPathLen, iErrno) = SOCKET_ERROR) then begin
Result := FALSE;
Exit;
end;
//WSCGetProviderPath函数在delphi的相关单元里是这样定义。
/*function WSCGetProviderPath(const lpProviderId: TGUID; lpszProviderDllPath: PWCHAR;
var lpProviderDllPathLen, lpErrno: Integer): Integer; stdcall;*/
if (ExpandEnvironmentStrings(*如果sPathName声明为array of WideChar,这里使用ExpandEnvironmentStringsW*)(sPathName, sPathName, MAX_PATH) = 0) then begin
Result := FALSE;
Exit;
end;
//ExpandEnvironmentStrings函数在delphi的相关单元里是这样定义。
//function ExpandEnvironmentStrings(lpSrc: LPCSTR; lpDst: LPSTR; nSize: DWORD): DWORD; stdcall;
TCHAR *sPathName;//delphi里可以用String/Pchar代替TCHAR吗?
if (!GetProvider(lpProtocolInfo, sLibraryPath, &NextProtocolInfo)
|| (hLibraryHandle = LoadLibrary(sLibraryPath)) == NULL
|| (WSPStartupFunc = (LPWSPSTARTUP)GetProcAddress(
hLibraryHandle, "WSPStartup")) == NULL
)
return WSAEPROVIDERFAILEDINIT;
while true do begin
if GetProvider(lpProtocolInfo, sLibraryPath, &NextProtocolInfo) then begin
hLibraryHandle := LoadLibrary(sLibraryPath);
if hLibraryHandle <> 0 then begin
@WSPStartupFunc := LPWSPSTARTUP(GetProcAddress(hLibraryHandle, 'WSPStartup'));
if Assigned(WSPStartupFunc) then break;
end;
end;
result := WSAEPROVIDERFAILEDINIT;
Exit;
end;