2008-11-17 8 views
2

Compte tenu de la déclaration DLL Delphil suivanteComment appeler une DLL Delphi de VB6

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

quelle serait la déclaration de VB6 pour l'utiliser?

J'ai essayé une variété de déclarations, par ex.

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) 

avec le code correspondant en fonction des paramètres, mais rien ne semble fonctionner, à savoir le débogueur Delphi dit que j'ai une valeur trop assez grande à Alen une chaîne vide dans abuf.

Je travaille sur l'utilisation d'une TypeLib pour piloter la connexion, mais je faisais du prototypage avec Declares.

+0

Voici le prototype équivalent C pour la fonction Delphi: int csd_HandleData (char * abuf, int ALEN); Rien de révolutionnaire, mais peut-être obtiendra-t-il une réponse de quelqu'un qui a peur de contribuer en raison d'une méconnaissance de Delphi. –

Répondre

3

essayer

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

Semble vous avez oublié la valeur de retour.

+0

Oui, j'ai. Oh, l'embarras (rougir). – bugmagnet

+0

Cela semble fonctionner. Cela signifie que tout Unicode que je mets dans la chaîne va être ANSIfied à l'entrée de la DLL, mais seulement un Typelib va ​​l'arrêter, mais un Typelib était de toute façon l'objectif. Merci Steve et mj2008. – bugmagnet

+0

Lors du prototypage, vous pouvez déclarer des chaînes étendues "As Long", puis utiliser StrPtr pour passer votre chaîne. – rpetrich

-3

Je ne sais pas exactement comment fonctionne Vb mais PChar est un pointeur, alors essayez d'obtenir la référence au lieu de la valeur.

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

Je ne sais pas ce qu'est un PChar dans Delphi, est-ce juste un caractère? ASCII ?? Unicode?

Un nombre entier est de 16 bits dans VB6, vous devrez déclarer aLen comme Long, qui peut contenir 32 bits.

Vous devez également déclarer le type de retour de la fonction. Dans ce cas, vous devez également renvoyer une valeur longue.

Cela fonctionnera probablement: Declare Function csd_HandleData Lib "chsdet.dll" (abuf As Byte, ByVal Alen As Long) As Long

+0

PChar est un pointeur sur l'octet. – bugmagnet

+1

Non, PChar est un pointeur sur un Char.La distinction est hautement significative à partir de Delphi 2009, où SizeOf (Char) = 2, en raison de Unicode. –

+0

type PChar =^Char; –

1

entier VB est le type de données 16 bits, vous devez donc déclarer aussi longtemps qui est équivalent à entier dans Delphi et d'autres langues.

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

Pour les intéressés, voici le IDL final pour le typelib pour CHSDET. Ce qui m'a impressionné (après avoir redécouvert l'outil EditTLB de Matt Curland), c'est que je peux mettre des structures dans un typelib, et VB les manipule comme si je les avais déclarées dans le code source.

J'ai écrit à l'auteur de ChsDet et peut-être cela finira par faire partie de la distribution standard.

// 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; 
}; 
Questions connexes