library HealthDocDll;uses
  SysUtils,
  Classes,
  Forms,
  Dialogs,
  Windows,
  HealthDoc in 'HealthDoc.pas' {frmHealthDoc},
  pub in 'pub.pas';{$R *.res}
procedure ShowForm(DoctorName,UserName:string);stdcall;
begin
  sDoctorName:=DoctorName;
  sUserName:=UserName;
  showmessage(sdoctorname);
  showmessage(susername);
end;exports
  ShowForm;beginend.HINSTANCE hDll; 
    hDll=LoadLibrary( _T("HealthDocDLL.DLL") ); 
    typedef int(_stdcall *func)(const char*,const char*);    func SmartWord= (func)GetProcAddress( hDll , "ShowForm"  );
    SmartWord( "aaaaaa" , "b" );
VC调用DELPHI DLL失败,我想用GETLASTERROR 来获得错误原因,如何使用
VC新手,最好能详细些,谢谢

解决方案 »

  1.   

    在一个API调用之后去调用GetLastError,就可以得到这个API出错的代码,然后去查这个返回码的含义。
      

  2.   

    GetLastError只能获得由系统API调用所产生的错误,你自己写的除非你用SetLastError设置了错误,否则是得不到错误信息的。
    从你给的代码看,如果你调用SmartWord失败,而SmartWord内又没有设置错误信息的话,你将什么也得不到
      

  3.   

    hDll=LoadLibrary( _T("HealthDocDLL.DLL") ); 
    这句,根本就没有加载成功的
      

  4.   

    在一个API调用之后调用GetLastError,就可以得到这个API出错的代码,就可以查它的含义,另外,也可以通过FormatMessage得到描述信息,以下代码来自MSDN:
    #include <windows.h>
    #include <strsafe.h>void ErrorExit(LPTSTR lpszFunction) 

        // Retrieve the system error message for the last-error code    LPVOID lpMsgBuf;
        LPVOID lpDisplayBuf;
        DWORD dw = GetLastError();     FormatMessage(
            FORMAT_MESSAGE_ALLOCATE_BUFFER | 
            FORMAT_MESSAGE_FROM_SYSTEM |
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,
            dw,
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            (LPTSTR) &lpMsgBuf,
            0, NULL );    // Display the error message and exit the process    lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, 
            (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR)); 
        StringCchPrintf((LPTSTR)lpDisplayBuf, 
            LocalSize(lpDisplayBuf),
            TEXT("%s failed with error %d: %s"), 
            lpszFunction, dw, lpMsgBuf); 
        MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK);     LocalFree(lpMsgBuf);
        LocalFree(lpDisplayBuf);
        ExitProcess(dw); 
    }void main()
    {
        // Generate an error    if(!GetProcessId(NULL))
            ErrorExit(TEXT("GetProcessId"));
    }
      

  5.   

    这个dll在你的工程目录下么?
      

  6.   

    对,GetLastError可以获取LoadLibrary和GetProcAddress失败的原因。
      

  7.   

    路径是正确的,其实这是对RTX二次开发所用到的,用VC的一个EXE来调用没有问题,但是放到他里面就出错了
      

  8.   

    hDll=LoadLibrary( _T("HealthDocDLL.DLL") ); 之后直接
    GetLastError
    看看返回值是多少
      

  9.   

    咋使用,直接这样AfxMessageBox(GetLastError());?
    什么也没返回
      

  10.   

    DWORD dwErrorID = GetLastError();
    然后查返回值看看是什么错误
    如果没返回错误那就没办法了
      

  11.   

    hDll = LoadLibrary(_T("..."));
    DWORD dwRet = GetLastError();
    CString strText(_T(""));
    strText.Format(_T("%d"), dwRet);
    AfxMessageBox(strText);