适用于 Windows 的 CPI-C 注意事项

本主题总结了开发基于 Windows 操作系统的程序时应记住的信息。

使用消息发布异步完成通知
异步操作完成后,应用程序窗口 hwndNotify 将接收 RegisterWindowMessage 返回的消息,并将“WinAsyncCPIC”作为输入字符串。 wParam 值包含正在完成的操作的conversation_return_code。 其值取决于最初发出的操作。 IParam 参数包含原始函数调用中指定的conversation_ID CM_PTR

使用 Win32® 事件的异步完成通知
在非阻塞会话上发出谓词时,如果要异步完成,它将返回CM_OPERATION_INCOMPLETE。 如果事件已注册到会话中,则应用程序可以调用 WaitForSingleObjectWaitForMultipleObjects ,以通知谓词完成。 WinCPICExtractEvent 允许通信通用编程接口 (CPI-C) 应用程序确定此事件句柄。 谓词完成后,应用程序必须调用 Wait_For_Conversation以确定异步谓词的返回代码。 可以调用 Cancel_Conversation函数来取消操作和会话本身。

应用程序负责重置事件,就像其他 API 一样。

如果尚未注册任何事件,异步谓词将像目前一样完成,即将消息发布到应用程序已注册到 CPI-C 库的窗口。

字节排序
默认情况下,使用 Intel 字节排序。 对于内联环境,定义NON_INTEL_BYTE_ORDER执行常量所需的所有翻转操作。 谓词控制块中的非常量输入参数 (VDB) (例如长度和指针)始终采用本机格式。

事件
若要异步接收数据,请在 VCB 的信号灯字段中传递事件句柄。 此事件在传递给 CPI-C 时必须处于非签名状态,并且句柄必须具有对该事件的EVENT_MODIFY_STATE访问权限。

库名称
Win32® DLL 名称 WINCPIC32.DLL。

多个线程
(TP) 的事务程序可以有多个发出谓词的线程。 Windows CPI-C 为基于 Windows 的多线程进程进行预配。 一个进程包含一个或多个执行线程。 对线程的所有引用都引用多线程 Windows 环境中的实际线程。

打包
出于性能原因,未打包 VDB。 因此,DWORD 位于 DWORD 边界上,WORD 位于 WORD 上,BYT 位于 BYTE 上。 应使用提供的结构访问 VDB。

运行时链接
要使 TP 在运行时动态链接到 CPI-C,TP 必须发出:

  • LoadLibrary 用于动态加载 WINCPIC.DLL 或 WINCPIC32.DLL WINCPIC 的库。

  • GetProcAddress 将 WINCPIC 指定为动态链接库 (DLL) 的所需入口点。

  • 不再需要 CPI-C 库时的 FreeLibrary

    同时对话
    一个程序可以同时参与每个进程多达 64 个对话。

    终止应用程序
    在 Windows 操作系统中,CPI-C 无法判断应用程序何时终止。 因此,如果应用程序必须关闭 (例如,它从用户) 收到 alt+F4 WM_CLOSE 消息,则应用程序应调用 WinCPICCleanup

    向其他组件屈服
    (CSV) 处理 CPI-C 和 Common Service 谓词时,可能需要让库代码生成,使另一个组件(如 SnaBase)能够接收消息并将其传递给应用程序。 这可以通过使用 Windows 扩展 WinCPICSetBlockingHookWinCPICUnhookBlockingHook 来实现。

    WinCPICSetBlockingHook 使 Windows CPI-C 实现能够通过新函数阻止 CPI-C 函数调用。 调用 WinCPICSetBlockingHook

FARPROC WINAPI WinCPICSetBlockingHook (FARPROC 1pBlockFunc)  

WinCPICUnhookBlockingHook 删除以前已安装的任何阻止挂钩,并重新安装默认阻止机制。 调用 WinCPICUnhookBlockingHook:

BOOL WINAPI WinCPICUnhookBlockingHook (void)