VC写的Dll正确,用VC的exe调用它是一切正常;
  但在Delphi中单击按钮调用它时在装载Dll,函数调用,卸载Dll时均不出错,但在按钮的最后一行代码即end;时却出错,提示access violation.
  不知怎么回事,请大家帮忙!解了!

解决方案 »

  1.   

    调用时加cdecl
        function XXXXXX(XX:XXXXXX): Integer; cdecl;
            external 'XXXXXXX.dll' name 'XXXXXXX';
      

  2.   

    上次碰到一个问题,按照ttzzj的方法做是可行的。不过还有怕别的可能,还是最好代码贴点出来看看先
      

  3.   

    在vc中把dll的该为 stdcall;
    主要是因为参数入栈的问题
      

  4.   

    看代码吧,我也有类似的问题,在dll中最头痛的
    问题就是如何去正确的创建和释放内存
      

  5.   

    贴出代码,请大家帮忙!
    在VC中函数导出方法:
    在头文件中:
      extern "C" _declspec(dllexport) void foo1(int);
    在.cpp中:
      extern "C" _declspec(dllexport) void foo1(int x)
    {
     //AFX_MANAGE_STATE(AfxGetStaticModuleState());
     if (x>0)
     {
     MessageBox(NULL,"你输入了一个正数!Dll测试成功!",NULL,MB_OK);
     }
     else
     MessageBox(NULL,"你输入了一个非正数!Dll测试成功!",NULL,MB_OK);}在Delphi中调用:
    procedure TForm1.Button1Click(Sender: TObject);
    type
      Tfoo1=procedure(X: integer);stdcall; 
    var
      TPro1:Tfoo1;
      Tp:TFarProc;
      Th:Thandle;
      X: integer;
    begin
      Th:=LoadLibrary('NewDLLBeta1.dll'); {装载DLL}
      if Th>0 then
      begin
        try
          begin
          Tp:=GetProcAddress(Th,'foo1');
            if Tp<>nil then
               begin
               TPro1:=Tfoo1(Tp);
               X := StrToInt(Edit1.Text);
               TPro1(X); //调用过程foo1
               end
            else
              ShowMessage('foo1过程没有找到');
          end;
          finally
            FreeLibrary(Th);
          end;
      end
      else
        Application.MessageBox('NewDLLBeta1.dll没有找到!','系统提示',Mb_IconInformation);
    end;   //当从这一行再往下执行结束按钮事件时提示出错,提示access violation
      

  6.   

    工程和调用窗体的uses都加上sharemem,并且放在第一个位置。
      

  7.   

    soaringsouth(栈桥捉鳖),按你的意思改了,还是不行!