Skip to content

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

ELMEC Document Center