SafeArray는 문자열의 전달하는 한 VARIANT 1 에서 Visual C++ 및 Visual Basic 6 사이의 방법

기술 자료 번역 기술 자료 번역
기술 자료: 167668 - 이 문서가 적용되는 제품 보기.
참고 Microsoft Visual C++ .NET (2002) Microsoft .NET Framework에서 제공하는 관리되는 코드 모델과 관리되지 않는 네이티브 Microsoft Windows 코드 모델을 모두 지원합니다. 이 문서에 나와 있는 정보는 관리되지 않는 Visual C++ 코드에만 적용됩니다.
모두 확대 | 모두 축소

요약

전달 매개 변수에서 SafeArrays Visual C++ 및 Visual Basic 6 .0에서는 대부분의 사이에 있는 SafeArray 전달할 때 사용할 수 있는 정보를 볼 때 VARIANT 입력합니다. MFC에서 이 있는 "const VARIANT & varname" 매개 변수로 변환합니다.

대신이 이 문서에서는 한 VARIANT 어떤 MFC "VARIANT FAR 1 varname" 매개 변수로 선언된 1, 전달하는 방법을 탐색합니다.

왜 다른 한 가지 방법을 사용해야 합니까? 대부분의 응용 프로그램을 수정할 VARIANT, 있지만 모든 전달된 SafeArray 수 있도록 하기 때문입니다. Excel 95 사용자가 있는 SafeArray에서 VARIANT Visual C++ 전달할 수 서버, 서버 값 수정, 수정된 SafeArray 반환 및 Excel 95에서 변경되지 않습니다. 초기 바인딩을 사용하면 Visual Basic 6.0 에서 제한을 해결하기 위해 이 기술을 사용하는 다른 이유입니다.

추가 정보

이 개념을 보여 주기 위해 StrArray 라는 새 "MFC AppWizard(exe)" 프로젝트를 시작하십시오. "3 중 6단계 자동화, 마침 을 클릭하여 선택하고 프로젝트 파일을 생성하도록 확인 누릅니다.

참고: Visual Studio.NET을 사용하여 경우: 만들기, 새 "MFC 응용 프로그램" 프로젝트를 StrArray 호출됩니다. 고급 기능 탭에서 자동화 를 선택하고 프로젝트 파일을 생성하도록 마침 을 클릭하십시오.

이제 클래스 사용하여 단일 자동화 메서드를 만듭니다. 클래스 내의 "CStrArrayDoc" 선택합니다 "클래스 이름:". 자동화 탭을 클릭한 다음 메서드 추가 클릭하십시오. 메서드 추가 대화 상자에 다음 값을 입력하십시오.

참고: Visual Studio.NET을 사용하여 경우: 클래스 보기 사용하여 단일 자동화 메서드를 추가. 클래스 뷰 트리를 확장하고 대한 VCCOdeIDLLibrary 찾을 항목. 해당 노드 아래에 IStrArray 인터페이스를 찾습니다. 인터페이스를 마우스 오른쪽 단추로 클릭한 다음 메서드 추가 선택하십시오. 메서드 추가 대화 상자에 다음 값을 입력합니다:
   External Name : Sort
   Internal Name : Sort
   Return Type   : long
   Parameter List:

      Name       : vArray
      Type       : VARIANT*
				


확인코드 편집 을 클릭하십시오.

아래의 참조 부분에 언급한 MFCARRAY 샘플 FastSort 메서드를 사용하여 Sort 메서드를 구현합니다. 이 매개 변수를 사용하여 "const VARIANT & varName 같이" 전달 간의 차이를 볼 수 있습니다. 및 있는 "VARIANT 1 varname". Sort 메서드를 다음과 같이 수정하십시오.

   ...
   #include <afxpriv.h>
   ...
   long CStrArrayDoc::Sort(VARIANT FAR* vArray)
   {

      long i, j, min;
      BSTR bstrTemp;
      SAFEARRAY FAR* psa = NULL;
      BSTR HUGEP *pbstr;
      HRESULT hr;
      DWORD dwTimeStart;
      LONG cElements, lLBound, lUBound;

      USES_CONVERSION;

      // Type check VARIANT parameter. It should contain a BSTR array
      // passed by reference. The array must be passed by reference it is
      // an in-out-parameter.
      if (V_VT(vArray) != (VT_ARRAY | VT_BSTR))
         AfxThrowOleDispatchException(1001,
           "Type Mismatch in Parameter. Pass a string array by reference");
      psa = V_ARRAY(vArray);
      // Check dimensions of the array.
      if (SafeArrayGetDim(psa) != 1)
         AfxThrowOleDispatchException(1002,
           "Type Mismatch in Parameter. Pass a one-dimensional array");

      dwTimeStart = GetTickCount();

      // Get array bounds.
      hr = SafeArrayGetLBound(psa, 1, &lLBound);
      if (FAILED(hr))
          goto error;
      hr = SafeArrayGetUBound(psa, 1, &lUBound);
      if (FAILED(hr))
          goto error;

      // Get a pointer to the elements of the array.
      hr = SafeArrayAccessData(psa, (void HUGEP* FAR*)&pbstr);
      if (FAILED(hr))
         goto error;

      // Bubble sort.
      cElements = lUBound-lLBound+1;
      for (i = 0; i < cElements-1; i++)
      {
         min = i;
         for (j = i+1; j < cElements; j++)
         {
            // NULL is a valid value for a BSTR. This code treats a NULL
            // BSTR as less than other string values.
            if (pbstr[min] == NULL)
               continue;
            else if (pbstr[j] == NULL
               || wcscmp(pbstr[j], pbstr[min]) < 0)
               min = j;
         }

         //Swap array[min] and array[i].
         bstrTemp = pbstr[min];
         pbstr[min] = pbstr[i];
         pbstr[i] = bstrTemp;
      }

      hr = SafeArrayUnaccessData(psa);
      if (FAILED(hr))
         goto error;

      return GetTickCount()-dwTimeStart;

   error:

      AfxThrowOleDispatchException(1003,
        "Unexpected Failure in FastSort method");
      return 0;

   }
				


이제 빌드 및 자동화 서버를 테스트할 수 있습니다. 서버 빌드 후 독립 실행형 파일로 등록해야 실행하십시오. Visual Basic 6.0 실행 및 Visual Basic 6.0 프로젝트를 새로 만듭니다. 폼에 단추를 놓고 아래 코드와 일치하도록 처리기를 수정합니다.

   Private Sub Command1_Click()
      Dim o As Object
      Dim v As Variant
      ReDim v(50) As String
      Dim SortTime As Long

      Set o = CreateObject("StrArray.Document")

      upperbound = 1
      lowerbound = 100
      For n = 0 To 50
          v(n) = "Entry " & Int((upperbound-lowerbound+1)*Rnd+lowerbound)
      Next n

      SortTime = o.Sort(v)
      MsgBox ("Done")
   End Sub
				


이 구문은 Visual Basic 6.0에서 작동하도록 가져오는 키를 문자열 배열을 포함하는 Variant 되도록 ReDim 및 첫 번째 Dim, Variant 배열 변수로 것입니다. 이제 서버를 테스트할 수 있습니다. 정렬 호출 전후에 Visual Basic 6.0 코드에서 중단점을 설정하십시오. Visual Basic 6.0 응용 프로그램을 실행하려면 Command1 클릭한 조사식 창을 사용하여 v 값을 확인하십시오.

참조

자세한 내용은 Microsoft 기술 자료에 있는 문서를 보려면 다음 문서 번호를 클릭하시기 바랍니다:
122287자동화 컨트롤러에서 같이 Visual Basic 3.0 & Disptest 제한
131046Binary.exe는 OLE 자동화를 사용하여 이진 데이터를 전송합니다.
131086자동화 안전 배열 사용
140202MFC 자동화 안전 배열을 사용하여 MFCArray
122289OLE 자동화의 구조체를 전달
154172ActiveX 컨트롤 및 VB 사이에 이진 데이터를 전달하는 방법
Microsoft 시스템 필기장, 6월 1996 Don 상자에 의해 Q&A OLE.

(c) Microsoft의 1997 년 예약 모든 권한. Shawn 작업 Karr, Microsoft Corporation에 의해 기고물입니다.

속성

기술 자료: 167668 - 마지막 검토: 2006년 11월 21일 화요일 - 수정: 3.1
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Foundation Class Library 4.2?을(를) 다음과 함께 사용했을 때
    • Microsoft Visual C++ 2.0 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 2.2
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 4.1 Subscription
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
키워드:?
kbmt kbautomation kbfaq kbhowto KB167668 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com