如何之间 Visual c + + 和 Visual Basic 6.0 中 VARIANT * 传递的字符串 safearray 之所以

文章翻译 文章翻译
文章编号: 167668 - 查看本文应用于的产品
注意Microsoft Visual c + +.net (2002) 支持托管的代码模型所提供的 Microsoft.net 框架和非托管本机 Windows 代码模型。本文中的信息仅适用于非托管的 Visual c + + 代码。
展开全部 | 关闭全部

概要

当您查看有关 Visual c + + 和 Visual Basic 6.0 大多数之间 SafeArrays 将在 safearray 之所以传递的参数中传递的可用信息时键入 VARIANT。在 MFC 中,这转换为"const VARIANT & varName"的参数。

作为一种替代方法本文探讨了如何将传递一个 VARIANT *,它在 MFC 中将被声明为"VARIANT 远处 * varName"参数。

为什么使用一种方法,通过其他呢?因为大多数应用程序允许 safearray 之所以传入一个 VARIANT,但不是所有的修改。在 Excel 95 中,可以将传递 safearray 之所以在一个 VARIANT 给 Visual c + + 服务器,修改在 $ 服务器中的值,返回该已修改 safearray 之所以和在 Excel 95 中没有更改。使用此技术的另一个原因是解决在 Visual Basic 6.0 中的一个限制,当您使用早期绑定。

更多信息

演示了这一概念,请从新的"MFC AppWizard(exe)"项目开始到调用 StrArray。在"步骤 3 的 6,"中选择 自动化,单击 完成,然后单击 确定 以生成项目文件。

: 如果使用可视 Studio.NET: 创建一个新的"MFC 应用"项目称为 StrArray。在 高级功能 选项卡上选择 自动化,然后单击以生成项目文件的 完成

现在创建使用类向导一个单个的自动化方法。在类向导,请选择"CStrArrayDoc"下"类名:"。单击 自动化 选项卡,然后单击 添加方法。添加方法对话框中输入下列值:

: 如果使用可视 Studio.NET: 添加单个的自动化方法使用"类视图"。展开类视图树,并查找该 VCCOdeIDLLibrary 条目。找到 IStrArray 接口,该节点下。用鼠标右键单击界面,然后选择 添加方法。添加方法对话框中输入下列值:
   External Name : Sort
   Internal Name : Sort
   Return Type   : long
   Parameter List:

      Name       : vArray
      Type       : VARIANT*
				


单击 确定编辑代码

若要实现 Sort 方法,使用 $ MFCARRAY 示例下面的参考部分中提到的 FastSort 方法。这使您可以看到差异作为一个"const VARIANT & varName"传递参数和一个"VARIANT * 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 中使用此语法是第一个 Dim 一个变量为数组变量,并以使其成为变体包含一个字符串数组,然后 ReDim。现在,您就可以测试服务器。之前和之后调用排序,请在 Visual Basic 6.0 代码中设置断点。运行 Visual Basic 6.0 应用程序并单击 Command1 来检查的 v 值使用监视窗口。

参考

有关详细的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
122287限制的 Visual Basic 3.0 &amp; Disptest 为自动化控制器
131046Binary.exe 传输使用 OLE 自动化的二进制数据
131086在自动化中的安全数组的使用
140202使用 MFC 自动化中的安全数组的 MFCArray
122289OLE 自动化中传递结构
154172如何将一个 ActiveX 控件和 VB 之间传递二进制数据
Microsoft 系统日志,六月 1996年"问答 OLE"通过 Don Box。

(c) Microsoft Corporation 1997 年,保留的所有权限。由 Shawn 工时 Karr,Microsoft 公司的贡献。

属性

文章编号: 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 标准版
    • Microsoft Visual C++ 4.0 标准版
    • Microsoft Visual C++ 4.1 Subscription
    • Microsoft Visual C++ 4.2 专业版
    • Microsoft Visual C++ 4.2 企业版
    • Microsoft Visual C++ 5.0 企业版
    • Microsoft Visual C++ 6.0 企业版
    • Microsoft Visual C++ 4.2 专业版
    • Microsoft Visual C++ 5.0 专业版
    • Microsoft Visual C++ 6.0 专业版
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 标准版
  • Microsoft Visual C++ .NET 2003 Standard Edition
关键字:?
kbmt kbautomation kbfaq kbhowto KB167668 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 167668
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