bcb中DLL函数定义问题 - C++ Builder / Windows SDK/API
DLL函数定义如下:
int DAWDataIndex=0;
extern "C" __declspec(dllexport)_stdcall __int64 WtSys_GetCount(void)//
{
if(DAWDataIndex>=0)
return DAWDataIndex;
else
return -1;
}
调用的时候如下:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Edit3->Text=WtSys_GetCount();
if(WtSys_GetCount()>0)
{
vehcount++;
Label1->Caption= vehcount;
}
}
其中Edit3->Text显示为:0;是正确的。
可是如果DLL这样定义:
int DAWDataIndex=0;
extern "C" __declspec(dllexport)_stdcall int WtSys_GetCount(void)//
{
if(DAWDataIndex>=0)
return DAWDataIndex;
else
return -1;
}
调用还是和上面一样,
这个时候Edit3->Text显示为:89057710250655744;WtSys_GetCount()返回值显然是错误的。
请问int 与__int64区别在哪儿,不是可以相互转换吗?
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i=10;
__int64 j=12345;
i=j;
Edit1->Text=i;
}
这个显示是:12345;是对的;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
__int64 i=10;
int j=12345;
i=j;
Edit1->Text=i;
}
这个显示是:12345;也是是对的;
[解决办法]
最好定义对应的类型变量获得WtSys_GetCount 的返回值
int i = WtSys_GetCount();
int64 i = WtSys_GetCount();
[解决办法]
int是32位的 int64是64位的
你如果dll里定义的函数原型返回值是int那么exe里也要一致
你在dll里返回的值通过eax寄存器返回的只有32位
但是你exe里声明的原型需要的返回值是64位所以就要从edx寄存器取另外的32位
而edx里的数是随机的 所以肯定要出错了