Windows
Sockets DLL既可以直接从应用程序中调用也可以通过中介DLL调用。通过中介DLL的例子是:使用Windows Sockets为应用程序实现一个提供通用网络功能的虚拟网络API层,这样的DLL可以同时被多个应用程序使用。担这样的DLL必须对WSAStartup()和WSACleanup()这两个函数非常警惕,它们必须保证在任何一个使用Windows
Sockets调用的任务前后均调用了WSAStartup()和WSACleanup()。这是因为Windows Sockets DLL需要一个对WSAStartup()的调用来为每个任务初始化其数据结构,也需要一个对WSACleanup()的调用来释放为任务分配的所有资源。
有至少两种方法去完成这一任务。最简单的方法是中介DLL具有与WSAStarup()和WSACleanup()类似的调用提供给应用程序使用,DLL将在这些例程中调用WSAStartup()和WSACleanup()。另一种机制就是中介DLL建立一个任务句柄列表。任务句柄是从GetCurrentTask()这一个Windows API中获得的。在中介DLL的每一个入口处检查对于当前任务WSAStartup()函数是否已被调用,并且在必要的时候调用WSACleanup()函数。
在Windows NT环境中,这一点是没有必要的。因为Windows NT中的DLL结构与流程是与Windows不同的。在Windows NT中,中介DLL只需简单的在它的DLL初始化例程中调用WSAStartup()即可。这个例程将在任何一个新的进程试图使用DLL的开始时刻被执行。
如果中介DLL调用了阻塞操作而又没有安装任何它自己的阻塞钩子,那么DLL作者必须清楚地认识到控制有可能会通过应用程序安装的阻塞钩子或缺省的阻塞钩子回到应用程序手中。这样应用程序有可能通过WSACancelBlockingCall()来取消中介DLL的阻塞操作,如果这种情况发生了,中介DL