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("没有短信!");
}
在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("没有短信!");
}
我的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中使用的名称。希望能对你有用。
我是不知道在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;
----------------------------------------------------------
函数声明有问题。
改为:
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;
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;
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.
我的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);