vc写的dll文件 pReadAllMsg函数
在BCB中调进用正常,我在DELPHI中调用不成功,请大家帮助解决一下!      
typedef int  (__stdcall *ReadAllMsg )(int type,char* PhoneID,char* SmsContent,char* Date,char* Index);
 
这是用BCB写的过程,pReadAllMsg是一个从DLL文件中调用的函数!  int i,type,count;
char PhoneID[30][20];
char SmsContent[30][512];
char Date[30][20];
char Index[30][3];
type=0;
        i=0; count = pReadAllMsg(type,*PhoneID,*SmsContent,*Date,*Index);
        ListView1->Clear();        while(i<count) {
            TListItem *pItem = ListView1->Items->Add();
            pItem->Caption = Index[i];
            pItem->SubItems->Add(PhoneID[i]);
            pItem->SubItems->Add(SmsContent[i]);
            pItem->SubItems->Add(pInvertTime(Date[i]).c_str());
           i++;
}        if(count==0){
                ShowMessage("没有短信!");
}

解决方案 »

  1.   

    由于VC开发的动态库导出函数名在非C++环境下调用时不规则,请使用动态调用,如下:
    我的VC DLL导出函数源代码:
    extern "C" __declspec(dllexport) void WINAPI ShowDlg()
    {
    ::MessageBox(0,"","",MB_OK+MB_ICONINFORMATION);
    }
    我使用Borland Impdef.exe工具查看导出函数,结果:
    LIBRARY     DLLTEST.DLLEXPORTS
        ShowDlg                       = _ShowDlg@0 
    如果使用C++开发工具,可以以ShowDlg名称来调用导出函数,但是如果使用Delphi来调用,只能如下:
    procedure TForm1.Button1Click(Sender: TObject);
    type
      TPFNShowDlg = procedure ();stdcall;
    var
      pfnShowDlg:TPFNShowDlg;
      hMoudle:THandle;
    begin
      hMoudle := LoadLibrary('DllTest.dll');
      if hMoudle <> INVALID_HANDLE_VALUE then
      begin
        pfnShowDlg := TPFNShowDlg(GetProcAddress(hMoudle,'_ShowDlg@0'));
        if @pfnShowDlg <> NIL then
          pfnShowDlg()
        else
          ShowMessage('Can''t Find the Function!');
        FreeLibrary(hMoudle);
      end
      else
      begin
        ShowMessage('Can'' Load Library!');
      end;
    end;
    注意:GetProcAddress中使用的名称。希望能对你有用。
      

  2.   

    不好意思! 我的意思没有表答清楚!
    我是不知道在DELPHI中怎么调用pReadAllMsg这个函数!    TReadAllMsg   = function (_type  :integer; var PhoneID,SmsContent,Date,index :pchar ):integer ; stdcall;这是我在DELPHI中写的过程:
    var
     __PhoneID,__SmsContent,__Date,__index : array [0..30,0..200] of char;
     PhoneID,SmsContent,Date,index : pchar; //PAnsiChar;
     i,count :integer;
     test1 : array [0..5,0..100] of char;
    begin
        GetMem(PhoneID, sizeof(char)* 1000);
        GetMem(SmsContent, sizeof(char) * 1000);
        GetMem(Date, sizeof(char) * 1000);
        GetMem(index, sizeof(char) * 1000);    //PhoneID    := @__PhoneID;
        //SmsContent := @__SmsContent;
        //Date       := @__Date;   // inc(PhoneID);
       // inc(SmsContent);
       // inc(Date);
       //  a := @PhoneID;
      i := 0;
      //count := 3;
      count := ReadAllMsg(4,PhoneId,SmsContent,Date,index);
     // count := ReadAllMsg(4,(@__PhoneID)^,(@__SmsContent)^,(@__Date)^,__index[0,0]);  while i < count do
      begin
       Memo1.Lines.Add(PhoneId);
      //  Memo1.Lines.Add(__SmsContent[0]);
      //  Memo1.Lines.Add(Date);
       i := i+1;
      end;
    end;
      

  3.   

    TReadAllMsg   = function (_type  :integer; var PhoneID,SmsContent,Date,index :pchar ):integer ; stdcall;
    ----------------------------------------------------------
    函数声明有问题。
    改为:
    TReadAllMsg   = function (_type  :integer; {var} PhoneID,SmsContent,Date,index :pchar ):integer ; stdcall;或者:
    TReadAllMsg   = function (_type  :integer; var PhoneID,SmsContent,Date,index :{p}char ):integer ; stdcall;
      

  4.   

    按你的说法做了,就是运行不通! 这是我写的调用过程! 就是运行不通! 
    var
     __PhoneID,__SmsContent,__Date,__index : array [0..30,0..200] of char;
     PhoneID,SmsContent,Date,index : char; //PAnsiChar;
     i,count :integer;
    begin    //PhoneID    := @__PhoneID;
        //SmsContent := @__SmsContent;
        //Date       := @__Date;  i := 0;
       count := ReadAllMsg(4,PhoneId,SmsContent,Date,index);
      // count := ReadAllMsg(4,__PhoneID[0,0],__SmsContent[0,0],__Date[0,0],__index[0,0]);  while i < count do
      begin
       Memo1.Lines.Add(PhoneId[i]);
       i := i+1;
      end;
      

  5.   

    给个例子你:DLL:#include "stdafx.h"BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
        return TRUE;
    }extern "C" void __declspec(dllexport) GetData(char *s)
    {
    strcpy(s, "Hello World!");
    }Exe:program MyApp;{$APPTYPE CONSOLE}uses
      SysUtils;procedure GetData1(s: pchar); cdecl; external 'MyDll.dll' name 'GetData';
    procedure GetData2(var s: char); cdecl; external 'MyDll.dll' name 'GetData';
    procedure GetData3(var s); cdecl; external 'MyDll.dll' name 'GetData';
    procedure GetData4(const s); cdecl; external 'MyDll.dll' name 'GetData';var
      s: array[0..127] of char;
    begin
      FillChar(s, sizeof(s), 0);
      GetData1(@s);
      WriteLn(s);  FillChar(s, sizeof(s), 0);
      GetData2(s[0]);
      WriteLn(s);  FillChar(s, sizeof(s), 0);
      GetData3(s);
      WriteLn(s);  FillChar(s, sizeof(s), 0);
      GetData4(s);
      WriteLn(s);  ReadLn;
    end.
      

  6.   

    clasj
    我的QQ子:4274612 我还是没有搞出来!你的QQ或MSN?
    用这种方式,我取出来数据了,便取第二笔时没有!
    因为DLL文件中返回的数据是多条型试的

     s[0] := '111';
     s[1] := '222';var
      s: array[0..127] of char;
    begin
      FillChar(s, sizeof(s), 0);
      GetData1(@s);
      WriteLn(s);