VC写动态库:
extern "C" __declspec( dllexport )  void SetValue( BOOL bHook )
{
g_bHook = bHook;
if( bHook ){
AfxMessageBox( "TRUE " );
}
else {
AfxMessageBox( "FALSE" );
}
}Delphi调用:
1. 静态调用
procedure SetValue( bHook : boolean ) ;stdcall;external testdll.dll';
2. 动态加载
type TFunction = procedure( bHook : boolean );var
fun : Tfunction;
Hinst : Thandle;
Begin
Hinst := LoadLibrary( ‘testdll.dll’ );
@fun := GetProcAddress( Hinst, PCHAR(‘SetValue’) );
end;
当我调用fun( true ) 和 fun(false)时,在动态库中都会弹出’TRUE’的对话框(AfxMessageBox( "TRUE " );),即传递到动态库的参数好象总是true。但我用静态调用时,会正确传递参数,但delphi程序会报异常哦!!!

解决方案 »

  1.   

    Boolean是一个字节
    C里的BOOL类型是四个字节
    类型要一致
    procedure SetValue( bHook : BOOL) ;stdcall;external testdll.dll';type TFunction = procedure( bHook : BOOL); stdcall;
    静态需要加上stdcall;
      

  2.   

    我把参数改为Int型,都是四个字节了吧。但还是一样的结局。
    在type的时候,加上stdcall,也会像静态调用一样,报错!!!
      

  3.   

    哥们我已经把声明给出了
    procedure SetValue(bHook: BOOL); stdcall; external 'testdll.dll';procedure TForm1.Button1Click(Sender: TObject);
    type
      TFunction = procedure(bHook: BOOL); stdcall;
    var
      fun: TFunction;
      Hinst: THandle;
    begin
      SetValue(False);
      SetValue(True);  Hinst := LoadLibrary('testdll.dll');
      if Hinst = 0 then 
      begin
        ShwoMessage('载入testdll.dll失败');
        Exit;
      end;
      @fun := GetProcAddress(Hinst, PChar('SetValue'));
      if Assigned(fun) then
      begin
        fun(False);
        fun(True);
      end else ShowMessage('没有找到SetValue函数');
      FreeLibrary(Hinst);
    end;
      

  4.   

    1.VC的函数声明,最好也加上__stdcallextern "C" __declspec( dllexport ) void __stdcall SetValue( BOOL bHook )
    {
    ...
    ...
    }2.楼上检查用下,编译出来的dll输出的函数名,是不否正确,
    一般来说,函数通过关键字__declspec(dllexport)导出,会发生函数名的变化3.VC编译的DLL,给delphi用,最好还是用DEF吧如void WINAPI SetValue( BOOL bHook )
    {
    g_bHook = bHook;
    if( bHook ){
    AfxMessageBox( "TRUE " );
    }
    else {
    AfxMessageBox( "FALSE" );
    }
    }然后写def文件LIBRARY DllEXPORTS
        SetValue具体参考:http://www.cnsdn.com.cn/inc/show.asp?id=2510