【问题标题】:Create a DLL in VC++ for VB 4.0在 VC++ 中为 VB 4.0 创建一个 DLL
【发布时间】:2014-07-23 16:35:23
【问题描述】:

我正在 Visual C++ 1.5 中创建一个 DLL,以便在 Visual Basic 4.0 中使用(我正在使用 16 位 Windows 95)。我创建的一个函数接收一个字符串并返回另一个字符串,参数声明是:

NPSTR CALLBACK __ export (NPSTR chain)
{
    ....
}

我还用 LPSTR 和 char * 进行了测试。

在 Visual Basic 中使用 ByVal 参数作为字符串函数将语句作为字符串,但 VC++ 不接收链,并且当我运行 VB 程序时给我一个错误,说类型不匹配。

接收一个 Visual Basic 字符串并返回另一个字符串的正确声明语句是什么? 当我返回整个步骤并且没有问题时。 我也想知道传递数组的方法是什么。

【问题讨论】:

    标签: c++


    【解决方案1】:

    除了“如何声明这样一个函数”的问题之外,你的 DLL 函数的问题是它应该从 DLL 返回一个字符串,除非它是指向原始的指针传递的字符串。

    大多数(如果不是所有)处理字符串的 Windows API 函数都以这种方式进行:

    1. DLL 函数的调用者负责创建字符串/缓冲区,包括在调用函数之前对其进行适当调整。

    2. 调用者提供另一个参数,即传递的缓冲区的最大长度。

    在 DLL 方面,DLL 执行以下操作:

      1234563 /p>
    1. 然后,DLL 函数将此字符串信息复制到传入的缓冲区,并遵守调用者提供的传入最大大小。因此,如果字符串信息确实是 1,000 字节,但用户传递了 100 作为最大缓冲区大小,那么您只复制 99(或 100)个字符。

    2. DLL 函数返回复制的字符数。如果发现原始传入的缓冲区很大,调用者可以使用它来将缓冲区大小调整为实际大小(请注意,处理终止 NULL 是您必须在函数的调用者和 DLL 函数之间达成的约定,所以这里我没有详细说明是否应该在最后复制一个NULL。)

    3. 此外,DLL 还可以返回存储整个字符串信息所需的字符总数。通常为了发生这种情况,DLL 函数有一个特殊的“模式”,它可以在输出字符串为 NULL 时工作。如果输出字符串为 NULL,DLL 函数仍会获取信息,但不会将其复制到输出缓冲区,而是返回字符总数。因此调用者将对 DLL 函数进行两次调用,一次是为了确定信息将包含多少字符,以便调用者相应地调整其缓冲区的大小,而对 DLL 函数的第二次调用将是实际调用,将字符复制到缓冲。

    这基本上就是它的工作原理。如果你的函数需要一个输入字符串和一个输出字符串,那么你的函数应该变成这样:

    LONG CALLBACK __ export SomeDLLFunction(NPSTR strIn, NPSTR strOut, LONG maxOutSize)
    

    现在在 VB 方面:

    Public Declare Function SomeDLLFunction Lib "YourDLL" (ByVal strIn As String, ByVal strOut As String, ByVal strMaxLen As Long) As Long
    

    现在,Windows 这样做的原因是 DLL 函数不再 返回指向局部变量的指针或引用(这是未定义的行为),并且不再需要弄清楚如何动态创建字符串(然后需要一些模块来释放字符串,并且还确切地知道 how 来释放字符串,即调用什么函数来执行此操作——这很让人头疼)。

    一切都依赖于调用者提供缓冲区和要写入的缓冲区的最大大小。

    【讨论】:

      【解决方案2】:

      GetHostByName函数为例:

      // C
      struct hostent* FAR gethostbyname(
        _In_  const char *name
      );
      
      // VB
      Public Declare Function gethostbyname 
          Lib "ws2_32.DLL" (ByVal host_name As String) As Long
      

      你可以使用:

      const char* CALLBACK __ export (const char* chain)
      {
          ....
      }
      

      在 VB 声明中:

      // VB
      Public Declare Function functionname 
          Lib "yourdll.DLL" (ByVal chain As String) As String
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-24
        • 1970-01-01
        相关资源
        最近更新 更多