API函数原型封装在一个DLL文件中
BOOL ValidateUser(LPBIOVALIDATEUSER_INFO lpValidateUserInfo );
typedef struct tagBVUI {
DWORD dwStructSize;
HWND hwndOwner;
HINSTANCE hInstance;
LPTSTR lpstrUsername;
LPTSTR lpstrDomain;
DWORD dwAuthProvider;
DWORD dwDialogType;
LPCSTR lpstrTitle;
DWORD dwFlags;
DWORD dwExtendedResult;
LPARAM lCustData;  LPBIOHOOKPROC           lpfnHook;
LPCTSTR lpTemplateName;
} BIOVALIDATEUSER_INFO;
在VB中的的定义如下:Public Declare Function BioValidateUser _
    Lib "xxx.dll" _
    Alias "BioValidateUserA" _
    (ByRef UserInfo As BIOVALIDATEUSER_INFOA) _
    As LongPublic Type BIOVALIDATEUSER_INFOA
    dwStructSize As Long
    hwndOwner As Long
    hInstance As Long
    lpstrUsername As String
    lpstrDomain As String
    dwAuthProvider As Long
    dwDialogType As Long
    lpstrTitle As String
    dwFlags As Long
    dwExtendedResult As Long
    lCustData As Long
    lpfnHook As Long
    lpstrTemplateName As String
End Type
我在DELPHI中调用老提示说地址错误,拜托各位弟兄帮忙

解决方案 »

  1.   

    函数的参数说明如下:
    dwStructSize是指结构的SIZE,我用SIZEOF获得;
    hwndOwner是指调用本函数的窗体句柄;可为0;
    hInstance可为0
    lpstrUserName\lpstrDomain的必须为256长度的字符串,不可为空,如为空字符串必须以“\0”为开头
    dwAuthProvider固定为1
    dwDialoType固定为0
    lpstrTitle是一可为空的字符串参数
    dwFlags可为0,1,$20000
    dwExtenedResult\lCustData\lpTemplateName不可用
    lpfnHook可为0调用后老是返回以上错误信息,是否我使用SIZEOF函数不正确,如果是我该用什么函数获得此结构的长度值
      

  2.   

    别的我没看:但是请注意:你在DLL中的函数返回值别用BOOL类型的!改成int;好对应delphi中的integer类型,你用bool类型的一定会错的 !一般情况下delphi和pchar和integer来对应vc++中的* char  和 int
      

  3.   

    bool型其实就是int型,楼上地说的感觉没道理。
      

  4.   

    如果返回类型用INT是否表示如果返回0结果就是TRUE,其他值就是FALSE!
      

  5.   

    楼上的两位的观点和我以前的一样,可在实践中,我用VC++和delphi混合编程的话就确实存在这样的问题,所以我们公司研发就这样规定的!‘如果返回类型用INT是否表示如果返回0结果就是TRUE,其他值就是FALSE!‘::::老兄,你在delphi中用看看!不报错才有鬼!
      

  6.   

    delphi中:布尔型:Boolean,只包含true或False两个值,占用1字节内存。
                                                                 但是:
    1.FALSE/TRUE与false/true的区别:false/true是标准C++语言里新增的关键字,而FALSE/TRUE是通过#define,这要用途是解决程序在C与C++中环境的差异,以下是FALSE/TRUE在windef.h的定义:#ifndef FALSE
    #define FALSE 0
    #endif#ifndef TRUE
    #define TRUE 1
    #endif
    也就是说FALSE/TRUE是int类型,而false/true是bool类型;所以两者不一样的,只不过我们在使用中没有这种感觉,因为C++会帮你做隐式转换。2.bool的大小与BOOL的区别:bool在C++里是占用1字节,而BOOL是int类型,int类型的大小是视具体环境而定的;所以来说:false/true只占用1个字节,而TRUE/FALSE视具体环境而言,以下是BOOL在windef.h中的定义:typedef int BOOL;3.NULL与0的区别:还是让我们看一下windef.h中NULL的定义:#ifndef NULL
    #ifdef __cplusplus//这个是指示是用C++来编译程序
    #define NULL 0
    #else
    #define NULL ((void *)0)
    #endif
    #endif所以说:它们没有区别,只不过在C里面会做一个强制类型转换。//难道改成int类型有错吗?BOOL类型导出供DELPHI用就有问题,难道不对?
      

  7.   

    是否这个API函数是否不支持DELPHI的调用,
    从VB的实例来看,这个调用并不困难,楼上兄弟的讨论问题我都试过了,
    但转为DELPHI的调用就老是报错。
    该放弃么???
      

  8.   

    可以这样说:你不改VC++中的dll的导出函数,就会一直报错
      

  9.   

    xiangwangz(<*敝屣荣华 浮云生死 此身何惧*>)
    为何这么说?
    我用C#很快就可以调用了,delphi真没用
      

  10.   

    beetaim(何为风) ,听你的口气就知道你也很没用!那我写个DLL用string,boolean导出接口 ,你让vc++,或你的c#调用看看!白痴!
      

  11.   

    zjpwm1980(哎 !我咋都不知道):
    其实我开始也是不相信delphi不能调用的,到结果由不得你相信delphi。
    况且产品的开发商也没在产品上注明支持delphi调用,但却注明可以用C/VB/BOLAND C调用
      

  12.   

    呵呵 !俺来说几句,delphi好不好不是你我说了算的,群众的眼光是亮的!当然不能说就这个DLL用delphi不能调用就说delphi不好,我想这样的思想是要不得的!本来嘛delphi也好,vc++也好,c#也好都是编程工具,就看你的水平了,难道在delphi中就不能编出完成该功能的函数了吗?你在一味强调些没什么意义的东西的话,还不如提高自己的水平了,呵呵 !一家之言,得罪之处,还请多多包涵!
      

  13.   

    delphi中有BOOL类型,这个不是问题,调用方式应该是stdcall吧,加了没?
      

  14.   

    c++中返回BOOL型让delphi调用没有错误.
    你最好还是把delphi的调用代码贴出来看看.
      

  15.   

    Mark________________________________________________________________________________GO  ON
      

  16.   

    TO : zjpwm1980(哎 !我咋都不知道)
    请注意你的言语,“白痴!”
    这些,要少说点!
      

  17.   

    我的印象中DLL调用时对大小写的要求很严格。
    你先检查DLL函数的名字的大小写有没有写错?
    否则,就会报错!