Theme
BCB编程注意点
ELMEC 2021年5月29日
CheckBox点击事件
给CheckBox赋值时,如果CheckBox状态有变化,会自动触发点CheckBox事件。
因此,在点击事件中尽量不要做过多操作(如保存其它关联参数等等)。
动态调用DLL时注意
用XE4动态调用DLL函数时,发现一个奇怪的问题。
问题代码
DLL源码(VC6编写)
cpp
// 定义DLL导出宏
#define ECM_KEY_DLL extern "C" __declspec(dllexport) int __stdcall
// 根据Seed码和nIndex(类型)计算出Key码及长度
ECM_KEY_DLL SeedToKey(BYTE* byKey, int* pKeySize, BYTE* bySeed, int nIndex)
{
switch(nIndex)
{
case 0:
return SeedToKeyM9T(byKey, bySeed, pKeySize);
}
return -1;
}动态调用源码(XE4编写)
cpp
// Get Key from ECM_Key.dll
int nRet = -2;
// 获取DLL文件名(全路径)
String sDllFile;
sDllFile = ExtractFilePath(ParamStr(0));
sDllFile += _T("ECM_Key.dll");
// 动态装入DLL
HINSTANCE hdll=LoadLibrary(sDllFile.c_str());
if(hdll)
{
// 定义DLL函数
typedef int (*FUNC)(BYTE*, int*, BYTE*, int);
// 根据函数名,从DLL中查找并返回函数指针
FUNC func = (FUNC)GetProcAddress(hdll, "SeedToKey");
if(func)
{
// 调用DLL中的函数
nRet = func(byKey, &nKeySize, bySeed, nECMType);
}
// 释放DLL
FreeLibrary(hdll);
}问题现象
通过debug调试,当运行FreeLibrary(hdll)代码后,从函数返回的数据(byKey)会发生改变。
原因及对策
原因是调用DLL的约定不相同,在函数定义代码中增加__stdcall后正常,修改代码如下
cpp
typedef int (*FUNC)(BYTE*, int*, BYTE*, int); // 有问题的函数定义
typedef int (__stdcall *FUNC)(BYTE*, int*, BYTE*, int); // 增加__stdcall约定后正常Windows10 20H2下BCB6.0提示没有注册
问题现象
电脑升级win10后,使用着的BCB6.0提示没有注册,使用注册机注册后,虽然弹出了注册成功,但是关闭那个界面后,依然提示未注册,而且根本不让你使用!
对策
此时可以找到BCB6.0的安装目录,找到bin目录下的BCB6RegClean.exe,运行一下,然后重新用注册机再次注册一下就就可以了!!!
注:以前安装的第三方控件会消失,需要重新安装……
连接时不能打开文件
日期:2014/7/8 20:29:24
现象:[ilink64 Error] Fatal: Unable to open file 'XML.XMLINTF.O'
工程:Daq3
对策:删除以下内容
cpp
//#pragma link "VCLTee.CandleCh"
//#pragma link "VCLTee.StatChar"
//#pragma link "OscBaseFrm"
//#pragma link "VCLTee.TeeTools"爱立迈科(宁波)计测仪器有限公司
浙江省宁波市中山东路369号中山首府B-708
URL: www.elmec-gms.com.cn
TEL: 0086-0574-8733-7211
Mail: nb_branch@elmec-gms.com.cn