2013-04-10 2 views
1

CTI 서버와 통신 할 TSP를 개발했습니다. 대부분의 경우 그것은 작동하지만,TSP에서 발신자 ID 설정 문제

function TSPI_lineGetCallInfo(
    hdCall : HDRVCALL; 
    lpCallInfo : LPLINECALLINFO 
) : LONG; 

에 발신자 /라는 ID 파티를 설정할 때 나는 오프셋은 모든 보정한다들이다 찾는하고 있지만, 크기 필드가되지 않습니다. 함수의 끝에서 (디버거에) 각 필드의 크기와 오프셋을 출력하고, 내가 기대하는 것입니다. 그러나 TAPI 프로그램을 사용하여 값을 검사 할 때 크기가 다릅니다 (그러나 오프셋은 디버그 문과 동일합니다). 실제로 크기 필드 5는 실제 내용과 관계없이 나타납니다. 반면 디버그 문은 아래 코드는 올바른 값을 보여줍니다 ...

도움을 크게 주시면 감사하겠습니다.

 lpCallInfo^.dwCallerIDOffset := 0; 
     lpCallInfo^.dwCallerIDSize := 0; 
     lpCallInfo^.dwCalledIDOffset := 0; 
     lpCallInfo^.dwCalledIDSize := 0; 
     lpCallInfo^.dwConnectedIDOffset := 0; 
     lpCallInfo^.dwConnectedIDSize := 0; 

     extnid := thiscall.CallItem.ExtnId; 
     phoneno := thiscall.CallItem.DialNum; 
     extnid_size := (Length(extnid) + 1) * sizeof(WCHAR); 
     phoneno_size := (Length(phoneno) + 1) * sizeof(WCHAR); 

     extnidw := StringToWideStringEx(extnid, CP_ACP); 
     phonenow := StringToWideStringEx(phoneno, CP_ACP); 

     if lpCallInfo^.dwOrigin = LINECALLORIGIN_INTERNAL then 
     begin 
     {me} 
     lpCallInfo^.dwCallerIDOffset := sizeof(TLINECALLINFO); 
     lpCallInfo^.dwCallerIDSize := extnid_size; 
     Move(ExtnIdw[1], ptr^, extnid_size * 2); 
     ptr := Pointer(integer(ptr) + lpCallInfo^.dwCallerIDSize); 
     {other party} 
     if phoneno <> '' then 
     begin 
      lpCallInfo^.dwCalledIDOffset := 
      sizeof(TLINECALLINFO) + lpCallInfo^.dwCallerIDSize; 
      lpCallInfo^.dwCalledIDSize := phoneno_size; 
      Move(phonenow[1], ptr^, phoneno_size * 2); 
     end; 
     end 
     else 
     begin 
     if thiscall.CallItem.CallType = 1 then 
     begin {incoming call} 
      {agent is the called party} 
      lpCallInfo^.dwCalledIDOffset := sizeof(TLINECALLINFO); 
      lpCallInfo^.dwCalledIDSize := extnid_size; 
      Move(ExtnIdw[1], ptr^, extnid_size); 
      ptr := Pointer(integer(ptr) + lpCallInfo^.dwCalledIDSize); 
      {other party is the caller} 
      if phoneno <> '' then 
      begin 
      lpCallInfo^.dwCallerIDOffset := 
       sizeof(TLINECALLINFO) + lpCallInfo^.dwCalledIDSize; 
      lpCallInfo^.dwCallerIDSize := phoneno_size; 
      Move(phonenow[1], ptr^, phoneno_size); 
      ptr := Pointer(integer(ptr) + lpCallInfo^.dwCallerIDSize); 
      end; 
     end 
     else 
     begin 
      {agnet is the caller} 
      lpCallInfo^.dwCallerIDOffset := sizeof(TLINECALLINFO); 
      lpCallInfo^.dwCallerIDSize := extnid_size; 
      Move(ExtnIdw[1], ptr^, extnid_size); 
      ptr := Pointer(integer(ptr) + lpCallInfo^.dwCallerIDSize); 
      {dialed number is the called party} 
      if phoneno <> '' then 
      begin 
      lpCallInfo^.dwCalledIDOffset := 
       sizeof(TLINECALLINFO) + lpCallInfo^.dwCallerIDSize; 
      lpCallInfo^.dwCalledIDSize := phoneno_size; 
      Move(phonenow[1], ptr^, phoneno_size); 
      ptr := Pointer(integer(ptr) + lpCallInfo^.dwCalledIDSize); 
      end; 
     end; 
     if (thiscall.CallItem.CallState = cs_Connected) and 
      (phoneno <> '') then 
     begin 
      lpCallInfo^.dwConnectedIDOffset := sizeof(TLINECALLINFO) + 
      lpCallInfo^.dwCallerIDSize + lpCallInfo^.dwCalledIDSize; 
      lpCallInfo^.dwConnectedIDSize := phoneno_size; 
      Move(phonenow[1], ptr^, phoneno_size); 
      ptr := Pointer(integer(ptr) + lpCallInfo^.dwConnectedIDSize); 
     end; 
     end; 
    end; 

    DEBUG('TSPI_lineGetCallInfo::dwCallerIDOffset=' + intToStr(lpCallInfo^.dwCallerIDOffset)); 
    DEBUG('TSPI_lineGetCallInfo::dwCallerIDSize=' + intToStr(lpCallInfo^.dwCallerIDSize)); 
    DEBUG('TSPI_lineGetCallInfo::dwCalledIDOffset=' + intToStr(lpCallInfo^.dwCalledIDOffset)); 
    DEBUG('TSPI_lineGetCallInfo::dwCalledIDSize=' + intToStr(lpCallInfo^.dwCalledIDSize)); 
    DEBUG('TSPI_lineGetCallInfo::dwConnectedIDOffset=' + intToStr(lpCallInfo^.dwConnectedIDOffset)); 
    DEBUG('TSPI_lineGetCallInfo::dwConnectedIDSize=' + intToStr(lpCallInfo^.dwConnectedIDSize)); 

답변

1

이상한 결과입니다. 코드가 체크 아웃 된 것 같습니다. 그것은 longshot 수 있지만 lpCallInfo 구조를 위해 예약 된 너무 적은 메모리로 인해 결과가 발생할 수 있습니다. 어떤 tapi 프로그램을 사용합니까? 대부분의 프로그램은 미리 큰 잉여를 예약합니다. 그러나 일반적으로 사용되는 또 다른 방법은 TSPI_lineGetCallInfo를 먼저 호출 한 다음 dwNeededSize를 설정하고 LINEERR_STRUCTURETOOSMALL을 반환 한 후 정확한 금액을 예약하는 데 필요한 정확한 양을 TSP에 '묻는 것'입니다. dwTotalSize를 확인하거나 dwNeededSize 및 dwUsedSize 필드를 설정하는 것처럼 보이지는 않습니다 (이는 위험합니다). LINEERR constants

를하고 문제가 해결되는지 알려 :

상기 봐주세요. 그렇지 않으면 Tapi Browser에서 구조 로그를 볼 수 있지만 궁금하다. 행운을 빕니다!