从TAPI服务提供商访问香港大学

从TAPI服务提供商访问香港大学,tapi,Tapi,我正在为电话系统编写一个适配器TSP。此系统有一个TAPI API,但它与我尝试启用TAPI的应用程序不兼容。为了从正确的线路拨打电话,我需要(从香港大学)了解一些关于谁提出请求的信息。由于TSP在电话服务的上下文中运行,因此我无法直接访问is。我的计划是使用LINE_CREATEDIALOGINSTANCE的功能来读取此信息 我遇到的问题是,电话服务在使用以下堆栈跟踪从TUISPI_providerGenericDialog返回后立即崩溃: 72004400() tapisrv.dll!_F

我正在为电话系统编写一个适配器TSP。此系统有一个TAPI API,但它与我尝试启用TAPI的应用程序不兼容。为了从正确的线路拨打电话,我需要(从香港大学)了解一些关于谁提出请求的信息。由于TSP在电话服务的上下文中运行,因此我无法直接访问is。我的计划是使用LINE_CREATEDIALOGINSTANCE的功能来读取此信息

我遇到的问题是,电话服务在使用以下堆栈跟踪从TUISPI_providerGenericDialog返回后立即崩溃:

72004400() 
tapisrv.dll!_FreeDialogInstance@20()  + 0xa93 bytes 
tapisrv.dll!_ClientRequest@16()  + 0x8f bytes 
rpcrt4.dll!_Invoke@12()  + 0x30 bytes 
rpcrt4.dll!_NdrStubCall2@16()  + 0x217 bytes 
rpcrt4.dll!_NdrServerCall2@4()  + 0x19 bytes 
rpcrt4.dll!_DispatchToStubInCNoAvrf@12()  + 0x17 bytes 
rpcrt4.dll!RPC_INTERFACE::DispatchToStubWorker()  + 0xae bytes 
rpcrt4.dll!RPC_INTERFACE::DispatchToStub()  + 0x4b bytes 
rpcrt4.dll!LRPC_SCALL::DealWithRequestMessage()  + 0x1d5 bytes 
rpcrt4.dll!LRPC_ADDRESS::DealWithLRPCRequest()  + 0x90 bytes 
rpcrt4.dll!LRPC_ADDRESS::ReceiveLotsaCalls()  + 0x20c bytes 
rpcrt4.dll!RecvLotsaCallsWrapper()  + 0xd bytes 
rpcrt4.dll!BaseCachedThreadRoutine()  + 0x92 bytes 
rpcrt4.dll!ThreadStartRoutine()  + 0x1b bytes 
kernel32.dll!_BaseThreadStart@8()  + 0x34 bytes
根据,如果未实现TSPI_providerFreeDialogInstance,电话服务将崩溃。我已经实现了这个函数,DepWalker显示它已正确导出。ApiSpy32显示,当我的TSP被加载时,它的地址是通过GetProcAddress正确返回的。为什么它还在崩溃

有关守则:

LONG TSPIAPI TSPI_lineMakeCall(DRV_REQUESTID dwRequestID, HDRVLINE hdLine, HTAPICALL htCall,
    LPHDRVCALL lphdCall, LPCWSTR lpszDestAddress, DWORD dwCountryCode, LPLINECALLPARAMS const lpCallParams)
{
    OutputDebugString("TSPI_lineMakeCall\n");
    PDRVLINE pLine = (PDRVLINE) hdLine;

    *lphdCall = (HDRVCALL)hdLine;

    typedef TUISPICREATEDIALOGINSTANCEPARAMS PARAMS;

    pLine->htCall = htCall;
    DWORD lLength = (lstrlenW(lpszDestAddress) + 1) * sizeof(WCHAR);

    PARAMS* lParams = (PARAMS*)DrvAlloc(sizeof(PARAMS) + lLength);
    RtlZeroMemory(lParams, sizeof(PARAMS) + lLength);

    lParams->dwRequestID = dwRequestID;
    lParams->hdDlgInst = (HDRVDIALOGINSTANCE)1000;
    lParams->lpszUIDLLName = L"TapiAdapter.tsp";
    lParams->lpParams = lParams + 1;
    lParams->dwSize = lLength;

    lstrcpyW((LPWSTR)(lParams + 1), lpszDestAddress);
    (*pLine->pfnEventProc)(pLine->htLine, 0, LINE_CREATEDIALOGINSTANCE, (DWORD)lParams, 0, 0);

    return dwRequestID;
}


LONG TSPIAPI TSPI_providerGenericDialogData(DWORD_PTR dwObjectID, DWORD dwObjectType, LPVOID lpParams, DWORD dwSize)
{
    OutputDebugString("TSPI_providerGenericDialogData\n");
    return 0;
}

LONG TSPIAPI TSPI_providerFreeDialogInstance(HDRVDIALOGINSTANCE hdDlgInst)
{
    OutputDebugString("TSPI_providerFreeDialogInstance\n");
    return 0;
}

LONG TSPIAPI TUISPI_providerGenericDialog(TUISPIDLLCALLBACK lpfnUIDLLCallback, HTAPIDIALOGINSTANCE htDlgInst, LPVOID lpParams, DWORD dwSize, HANDLE hEvent)
{
    SetEvent(hEvent);

    LPCWSTR lNumber = (LPCWSTR)lpParams;
    MessageBoxW(0, lNumber, L"Dial Number", MB_OK);

    return 0;
}
我不知道,但是上面说,
lpszUIDLLName
应该是

指向以NULL结尾的字符串的指针 指定的完全限定名称 要在应用程序中加载的UI DLL 上下文


。。。但是
L“tapidapter.tsp”
看起来不像是UI DLL的完全限定名(“完全限定”表示它包含路径名)。您是否有要加载的UI DLL?装了吗?它是否显示对话框?卸货了吗?您的TSP中是否存在TUISPI\U providerGenericDialog,或者它是否存在于您的UI DLL中(它们应该是两个不同的DLL)?

我找到了解决方案:根据,此事件的LINEEVENT调用的第一个参数只需要是HPProvider,而不是HTAPILINE。由于LINEEVENT的第一个参数是HTAPILINE类型,因此需要强制转换HPProvider。

谢谢您的建议!实际上,它们不必是不同的DLL,因为部分代码是从Microsoft TAPI SDK中的ATSP示例复制的。我确实试过完整的路径。没有区别。问题不在于UI DLL加载,而是在TUISPI_providerGenericDialog返回后。因此,这也意味着TUISPI_providerGenericDialog出现在我的TSP中,并且正在被调用。