读书人

bcb中DLL函数定义有关问题

发布时间: 2012-03-09 16:54:57 作者: rapoo

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里的数是随机的 所以肯定要出错了

读书人网 >C++ Builder

热点推荐