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

중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

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에 의해 기고물입니다.

경고: 이 문서는 자동으로 번역되었습니다.

속성

문서 ID: 167668 - 마지막 검토: 12/04/2015 16:54:21 - 수정: 3.1

Microsoft Foundation Class Library 4.2, Microsoft Visual C++ .NET 2003 Standard Edition

  • kbnosurvey kbarchive kbmt kbautomation kbfaq kbhowto KB167668 KbMtko
피드백