用VC++编写的DLL文件在DELPHI是否都能够调用?

解决方案 »

  1.   

    一般都能够调用,但是要注意:
      1、VC++的函数名是大小写敏感的,在Delphi引入时要注意;
      2、调用方式,VC++自己缺省为C方式,对应Delphi的“Cdel”,最好都用StdCall;
      3、参数对应关系,如*对应指针,&对应Var等。
      4、如果VC++输出的是个类,则Delphi也能够调用,可以采用包装法,但是,最好采用虚拟表法。
      5、我曾回答FigoZhu(朱德飞)的一个问题“Delphi可以使用VC做的DLL还原的LIB吗?”讲过类似问题,你可以去看一看。(2003-9-8 21:27:20发布,已结贴)。
      

  2.   

    以下给你一个例子,你可以借鉴以下,这是从一个已经完全调通的程序在录下来的。 希望对你有帮助。 ----------------------------------------------------------------------------- VC++的定义: // MYProcess.cpp: 一定是 .CPP文件!! #include "stdafx.h" 
    #include "myProcess.h" #ifdef _DEBUG 
    #undef THIS_FILE 
    static char THIS_FILE[]=__FILE__; 
    #define new DEBUG_NEW 
    #endif extern "C" __declspec(dllexport) DWORD CDWORDProcess() 

    return .......; 

    extern "C" __declspec(dllexport) BOOL CBOOLProcess() 

    CASmoothProcess* pASmoothProcess = new CASmoothProcess; 
    return ......; 
    } extern "C" __declspec(dllexport) void CvoidProcess() 

    return; 
    } 以下是Delphi的引入单元: 
    unit MYUnit; {$ALIGN ON} 
    {$MINENUMSIZE 1} interface Uses Windows,SysUtils; Type TCDWORDProcess=Function(...) Dword; Cdecl; //注意与VC++中对应函数的参数说明一致 
    TCBOOLProcess=Function(...) Bool;Cdecl;         //注意参数次序、类型对应 
    TCvoidProcess=Procedure(...);Cdecl;             //对应“过程” implementation Var CDWORDProcess: TCDWORDProcess; 
    CBOOLProcess: TCBOOLProcess; 
    CvoidProcess: TCvoidProcess; Var DLL_Handle: THandle; Function LoadDLL: Bool; //动态连接库加载 
    Var Loadok: Bool; //动态连接库加载路径 
    SysDLLPath: String; 
    Begin 
    Loadok:=True; 
    LoadDLLsOk:=False; 
    SysDLLPath:=.... //DLL所在的目录; 
    DLL_Handle:=LoadLibrary(PChar(SysDLLPath)); //安给定的路径加载 
    If DLL_Handle>0 Then //若加载成功, 
    Begin //则依次定位三个函数 
    Try 
    LoadDLLsOk:=True; 
    @CDWORDProcess:=GetProcAddress(DLL_Handle,'CDWORDProcess');//致意注意大小写! 
    @CBOOLProcess:=GetProcAddress(DLL_Handle,'CBOOLProcess'); 
    @CvoidProcess:=GetProcAddress(DLL_Handle,'CvoidProcess'); 
    Except 
    FreeLibrary(DLL_Handle); 
    Loadok:=False; 
    End 
    End 
    Else 
    Loadok:=False; 
    Result:=Loadok; 
    End; initialization //初始化处理 
    LoadSmooths; 
    finalization 
    If DLL_Handle>0 Then //退出处理 
    FreeLibrary(DLL_Handle); end. 
    -----------------------------------------------------------------
      

  3.   

    对不起,有一个错误:
    initialization //初始化处理 
      LoadDLL;    //不是LoadSmooths; 
      

  4.   

    调用DLL注意以下几个问题:
    1、调用方式,
    2、参数类型,
      

  5.   

    可以的,
    我都知道怎样做
    不好意思, 借你的地方用一下,delphi高手们,你们好!我是一位delphi初学者,     希望各位指点小弟一下,     
    小弟在此谢过啦,  
                       小弟的邮箱是:   [email protected]