如何从VB6调用Delphi DLL

时间:2008-11-17 14:01:37

标签: delphi dll vb6 declare

给出以下Delphil DLL声明

function csd_HandleData(aBuf: PChar; aLen: integer): integer; stdcall;

使用它的VB6声明是什么?

我尝试了各种声明,例如

Declare Function csd_HandleData Lib "chsdet.dll" (ByVal aBuf As String, ByVal aLen As Integer)
Declare Function csd_HandleData Lib "chsdet.dll" (aBuf As Long, ByVal aLen As Integer)
Declare Function csd_HandleData Lib "chsdet.dll" (aBuf As Byte, ByVal aLen As Integer)

使用适合参数的相关代码,但似乎没有任何工作,即Delphi调试器说我在aLen中有一个太大的值,在aBuf中有一个空字符串。

我正在努力使用TypeLib来驱动连接,但正在使用Declares进行原型设计。

5 个答案:

答案 0 :(得分:3)

Declare Function csd_HandleData Lib "chsdet.dll" (ByVal aBuf As String, 
ByVal aLen As Integer) As Integer

好像你忘记了返回值。

答案 1 :(得分:1)

VB整数数据类型是16位,因此您应该将其声明为long,这相当于Delphi和其他语言中的整数。

Declare Function csd_HandleData Lib "chsdet.dll" (ByVal aBuf As String, ByVal aLen As long) as long

答案 2 :(得分:0)

我不知道Delphi中的PChar是什么,它只是一个字符吗? ASCII?的Unicode?

VB6中的整数是16位,你必须将aLen声明为Long,它可以保存32位。

您还必须声明函数的返回类型,在这种情况下,您还需要返回Long值。

这可能会奏效: 声明函数csd_HandleData Lib“chsdet.dll”(aBuf as Byte,ByVal aLen as Long)As long

答案 3 :(得分:0)

对于那些感兴趣的人,这里是CHSDET的类型库的最终IDL。令我印象深刻的是(在重新发现Matt Curland的EditTLB工具之后)我可以将结构放入类型库中,VB处理它们就像我在源代码中声明它们一样。

我已经写过ChsDet的作者了,也许这最终会成为标准发行版的一部分。

// Generated .IDL file (by the OLE/COM Object Viewer)
// 
// typelib filename: chsdet.tlb

[
  uuid(316A83D7-8BF4-490E-BDDE-75EBC332C355),
  version(1.0),
  helpstring("Charset Detector - as the name says - is a stand alone executable module for automatic charset detection of a given text.\r\n\t\r\nIt can be useful for internationalisation support in multilingual applications such as web-script editors or Unicode editors.\r\n\t\r\nGiven input buffer will be analysed to guess used encoding. The result can be used as control parameter for charset conversation procedure.\r\n\t\r\nCharset Detector can be compiled (and hopefully used) for MS Windows (as dll - dynamic link library) or Linux.\r\n\t\r\nBased on Mozilla's i18n component - http://www.mozilla.org/projects/intl/. \r\n\r\nCharset Detector is open source project and distributed under Lesser GPL.\r\nSee the GNU Lesser General Public License for more details - http://www.opensource.org/licenses/lgpl-license.php\r\n\r\nNikolaj Yakowlew \xFFFFFFA9 2006-2008 \r\nTypeLib by Bruce M. Axtens, 2008.")
]
library CHSDET
{
    // TLib :     // Forward declare all types defined in this typelib

    [
      dllname("CHSDET.dll"),
      version(1.0),
      helpstring("Functions in CHSDET.DLL")
    ]
    module CHSDETFunctions {
    [entry(0x60000000), helpstring("Returns rAbout record (qv)")]
    void _stdcall GetAbout([in, out] rAbout* AboutRec);
    [entry(0x60000001), helpstring("Reset detector. Prepares for new analysis.")]
    void _stdcall Reset();
    [entry(0x60000002), helpstring("Analyse given buffer of specified length.

Return value is of eHandleDataErrors, either 
NS_ERROR_OUT_OF_MEMORY (Unable to create internal objects) or NS_OK.

Function can be called more that one time to continue guessing. Charset Detector remembers last state until Reset called.")]
    void _stdcall HandleData(
            [in] BSTR aBuf, 
            [in] short aLen, 
            [out, retval] short* retVal);
    [entry(0x60000003), helpstring("Returns either TRUE (Charset Detector is sure about text encoding.) or FALSE.

NB: If input buffer is smaller then 1K, Charset Detector returns FALSE.")]
    void _stdcall IsDone([out, retval] short* retVal);
    [entry(0x60000004), helpstring("Signal data end. If Charset Detector hasn't sure result (IsDone = FALSE) the best guessed encoding will be set as result.")]
    void _stdcall DataEnd();
    [entry(0x60000005), helpstring("Returns guessed charset as rCharsetInfo record")]
    void _stdcall GetDetectedCharset([out, retval] rCharsetInfo* retVal);
    [entry(0x60000006), helpstring("Returns all supported charsets in form "0x0A Name - CodePage"")]
    void _stdcall GetKnownCharsets(
            [in, out] long* sList, 
            [out, retval] long* retVal);
    [entry(0x60000007), helpstring("Return eBOMKind value matching byte order mark (if any) of input data.")]
    void _stdcall GetDetectedBOM([out, retval] eBOMKind* retVal);
    [entry(0x60000008), helpstring("Remove CodePage from consideration as a possible match")]
    void _stdcall DisableCharsetCP([in] long CodePage);
    };

    typedef [uuid(91694067-30AB-44A9-A210-F5602935475F)]
    struct tagrAbout {

long lMajor;

long lMinor;

long lRelease;

long sAbout;
    } rAbout;

    typedef [uuid(3C8B7420-D40B-458B-8DE8-9B3D28607396)]
    enum {
    BOM_Not_Found = 0,
    BOM_UCS4_BE = 1,
    BOM_UCS4_LE = 2,
    BOM_UCS4_2143 = 3,
    BOM_UCS4_3412 = 4,
    BOM_UTF16_BE = 5,
    BOM_UTF16_LE = 6,
    BOM_UTF8 = 7
    } eBOMKind;

    typedef [uuid(9B231DEF-93FB-440D-B06B-D760AECE09D0)]
    struct tagrCharsetInfo {

long Name;

short CodePage;

long Language;
    } rCharsetInfo;

    typedef enum {
    NS_OK = 0,
    NS_ERROR_OUT_OF_MEMORY = -2147024882
    } eHandleDataErrors;
};

答案 4 :(得分:-2)

我不确切知道Vb是如何工作的,但PChar是一个指针,所以试着获取引用而不是值。

Declare Function csd_HandleData Lib "chsdet.dll" (**ByReference <--guessing here :D** aBuf As String, ByVal aLen As Integer)