运行是没有什么问题,可是我测试到Delphi用了那个DLL却没有执行里面的代码

解决方案 »

  1.   

    可能是参数传递的问题,找一找c与delphi的变量定义长度,比如c的bool就不是delphi中的boolean,另外要求传递地址的参数是否在delphi的函数参数中加了var标识符,否则肯定不干活的。
    ps:我有一个pdf是o-pascal与vc和vb变量类型转换的对照表。
      

  2.   


    //VCDLL.CPP#include "stdafx.h"int __declspec( dllexport )  max_ab(int,int) ;
    int __declspec(dllexport) GetInfo(int);
    extern "C" int __declspec(dllexport) GetInfoA(int);
    extern "C" int _declspec(dllexport)  __stdcall GetInfoB(int);
     
    BOOL APIENTRY DllMain( HANDLE hModule, 
    DWORD ul_reason_for_call, 
    LPVOID lpReserved)
    {
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
    break;
    }
    return TRUE;
    }
    int __declspec( dllexport )   max_ab(int a,int b)
    {
    return a>b?a:b;
    }int __declspec(dllexport) GetInfo(int a)
    {
      return a*3;
    }extern "C" int __declspec(dllexport)  GetInfoA(int a) 
    {
    return a+a;
    }extern "C" int _declspec(dllexport)  __stdcall GetInfoB(int a)
    { return a+a; 
    }//Delphi 测试程序
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Button4: TButton;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;  function max_ab(a:integer;b:integer):integer; cdecl;external 'vcdll.dll' index 2;
      function GetInfo(a:integer):integer;cdecl;external 'vcdll.dll' index 1;
      function GetInfoA(a:integer):integer;cdecl;external 'vcdll.dll';
      function GetInfoB(a:integer):integer;stdcall;external 'vcdll.dll' index 4;
    implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
     var i:integer;
    begin
      i:= max_ab(33,22);
      showMessage(intTostr(i));
    end;procedure TForm1.Button2Click(Sender: TObject);
     var i:integer;
    begin
      i:=GetInfo(32);
      showMessage(intTostr(i));
    end;procedure TForm1.Button3Click(Sender: TObject);
     var i:integer;
    begin
      i:=GetInfoA(12);
      showMessage(intTostr(i));
    end;procedure TForm1.Button4Click(Sender: TObject);
     var i:integer;
    begin
      i:=StrtoInt(edit1.Text);
      i:=GetInfoB(i);
      showMessage(intTostr(i));end;procedure TForm1.FormCreate(Sender: TObject);
    beginend;end.
      

  3.   

    Delphi调用VC写的Dll最好用静态调用,动态调用的话返回值会有问题,不知道是为什么。一般默认的编译器使用__cdecl做为参数传送约定,但如果是给Delphi调用的Dll,最好设置为__stdcall,它与pascal的数据类型比较兼容