含有创建实例的DLL如何转化到delphi?

一个符号存世 2017-02-16 10:03:27
这个DLL头文件如何转化为Delphi?求帮助,谢谢
//===========以下是头文件的部分内容=======================================
typedef struct FactorySDKDll BL_FactorySDKDll;
typedef void (*BL_ProcessCB) (int currentStep, bool result, char* stepDesc,char* errMsg, int errCode, char* portData, void* object);
typedef void (*BL_OpenPortCB)(bool result, void* object);

__declspec(dllexport) BL_FactorySDKDll *BL_createInstance();
__declspec(dllexport) bool BL_releaseInstance(BL_FactorySDKDll* inst);
__declspec(dllexport) bool BL_registerCallback(BL_FactorySDKDll* inst, BL_ProcessCB cb, void* object = NULL);
__declspec(dllexport) bool BL_openSerialPort(BL_FactorySDKDll* inst, BL_SerialPortInfo info, BL_OpenPortCB cb, void* object = NULL);
//========头文件说明==============
c) 结构体BL_FactorySDKDll只是一个标志,用于创建DLL实例对象,外部调用不需关心其内容。
//===============================================================
卡在第一步typedef struct FactorySDKDll BL_FactorySDKDll;这个东西如何操作,是自己声明一个类吗?
...全文
460 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
一个符号存世 2017-02-21
  • 打赏
  • 举报
回复
最后是用Utf8ToAnsi的
  • 打赏
  • 举报
回复
BL_releaseInstance函数在释放实例后,还会结束线程,这会不会是造成程序卡住的原因? ==================================================================== 如果结束的是它自己创建的线程就没有问题。 这种如何转码? ============ TBL_StepInfo = record step:Integer; desc:array [0..STEP_DESC_SIZE-1] of Char; // 如果你用高版本的 Delphi(D2009+),这里应该把char改成AnsiChar匹配C++的声明 totalStep:Integer; end;
一个符号存世 2017-02-20
  • 打赏
  • 举报
回复

这种如何转码?
一个符号存世 2017-02-19
  • 打赏
  • 举报
回复
BL_releaseInstance函数在释放实例后,还会结束线程,这会不会是造成程序卡住的原因?如果真是这样,要如何调用才能避免程序卡住?@nebula845026 @早打大打打核战争
一个符号存世 2017-02-19
  • 打赏
  • 举报
回复
感谢DelphiGuy和nebula845026的热心帮助,让我得到了知识,两位的方法都能够正常的调用前两个函数 SDK包 http://pan.baidu.com/s/1boE1D87,内的说明文档黏贴了部分功能Demo的代码文件*.cpp 固件包,函数内参数packDir的值 http://pan.baidu.com/s/1jI0qDOa 在后面的测试调用中,我又遇到了一些麻烦,周末两天都没有搞定,请@DelphiGuy @nebula845026 能够指点帮助一下 在对象释放函数BL_releaseInstance中我,运行后,程序就定住了,无任何反应 在函数BL_setPackageAndGetInfo中,我能得到返回值结构体中所有的参数值,但是此函数运行完了后就出现了access violation at address 00000005.read of address 00000005的错误 在函数BL_getStepInfo和BL_getTotalSteps的返回值部分是乱码,"杩涘叆recovery" 下面是我的函数声明和调用

//声明部分
const
  BLSDK ='FactorySDKDll.dll';
  STEP_DESC_SIZE=100;
type
  TBL_FactorySDKDll = record
  end;
  PBL_FactorySDKDll = ^TBL_FactorySDKDll;
  TBL_StepInfo = record
    step:Integer;
    desc:array [0..STEP_DESC_SIZE-1] of Char;
    totalStep:Integer;
  end;
  PBL_StepInfo = ^TBL_StepInfo;
  BL_ModuleType=(BL_ModuleCommon,BL_Module433Device,BL_ModuleJLink,BL_ModuleUndefined);
  TBL_PackageInfo = record
    isOK:Boolean;
    moduleType:BL_ModuleType;
    totalSteps:Integer;
  end;
  PBL_PackageInfo = ^TBL_PackageInfo;
  function BL_getSDKVersion(): PChar; cdecl; external BLSDK; //pass
  function BL_createInstance(): PBL_FactorySDKDll; cdecl; external BLSDK;  //pass
  function BL_releaseInstance(inst:PBL_FactorySDKDll): Boolean; cdecl; external BLSDK;
  function BL_setPackage(inst:PBL_FactorySDKDll;packDir:PChar): Boolean; cdecl; external BLSDK; //pass
  function BL_setPackageAndGetInfo(inst:PBL_FactorySDKDll;packDir:PChar):TBL_PackageInfo; cdecl; external BLSDK;
  function BL_getTotalSteps(inst:PBL_FactorySDKDll):PBL_StepInfo; cdecl; external BLSDK;
  function BL_getTotalStepsCount(inst:PBL_FactorySDKDll):Integer; cdecl; external BLSDK;  //pass
  function BL_getStepInfo(inst:PBL_FactorySDKDll;step:Integer):PChar; cdecl; external BLSDK;
//调用部分,根据流程
var
  pRet: PBL_FactorySDKDll;//全局变量
//创建对象并设置固件包,packDir是路径
procedure TForm1.btnBL_setPackageClick(Sender: TObject);
var
  PathStr:PChar;
begin
  Memo1.Clear;
  //创建DLL实例
  pRet:=BL_createInstance();
  PathStr:=PChar(Edit1.Text);
  //设置固件包
  if BL_setPackage(pRet,PathStr) then
    Memo1.Lines.Add('BL_setPackage:true')
  else
    Memo1.Lines.Add('BL_setPackage:false');
end;
//这个函数运行结束后错误
procedure TForm1.btnBL_setPackageAndGetInfoClick(Sender: TObject);
var
  BL_PackageInfo:TBL_PackageInfo;
  i:Integer;
  PathStr:PChar;
  ModuleType:string;
begin
  //返回值正确,但是函数执行完毕报内存错误
  pRet:=BL_createInstance();
  PathStr:=PChar(Edit1.Text);
    BL_PackageInfo:=BL_setPackageAndGetInfo(pRet,PathStr);
    if BL_PackageInfo.isOK then
      Memo1.Lines.Add('isOK:true')
    else 
      Memo1.Lines.Add('isOK:false');
    ModuleType:=GetEnumName(TypeInfo(BL_ModuleType),Ord(BL_PackageInfo.moduleType));
    Memo1.Lines.Add(ModuleType);
    Memo1.Lines.Add(IntToStr(BL_PackageInfo.totalSteps));
end;
//这个释放对象,直接卡死
procedure TForm1.btnBL_releaseInstanceClick(Sender: TObject);
begin
  if BL_releaseInstance(pRet) then
    Memo1.Lines.Add('BL_releaseInstance:true')
  else
    Memo1.Lines.Add('BL_releaseInstance:false');
end;
//返回值乱码
procedure TForm1.btnBL_getStepInfoClick(Sender: TObject);
var
  S:string;
  P:PChar;
begin
  P:=BL_getStepInfo(pRet,0);
  Memo1.Lines.Add(P);
{乱码内容为:皢	铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪~?,F^}
end;
//也是乱码
procedure TForm1.btnBL_getTotalStepsClick(Sender: TObject);
var
  XBL_StepInfo:PBL_StepInfo;
  i,:Integer;
begin
  XBL_StepInfo:=BL_getTotalSteps(pRet) ;
  for i := 0 to 20 do // 
  begin
    Memo1.Lines.Add(XBL_StepInfo^.desc);
    inc(XBL_StepInfo);
  end;
{乱码内容:
杩涘叆recovery
鐑у綍mac
妫€娴媘ac涓€鑷存€?
鍗囩骇udp鍥轰欢
鍐嶆鎵爜
铪铪
铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪}
end;

  • 打赏
  • 举报
回复
type FactorySDKDll = record // ... 你要找到C++中该结构的定义 end; BL_FactorySDKDll = FactorySDKDll; PBL_FactorySDKDll = ^BL_FactorySDKDll; function BL_createInstance: PBL_FactorySDKDll; stdcall; external 'xxx.dll'; function BL_releaseInstance(inst: PBL_FactorySDKDll): boolean; stdcall; external 'xxx.dll'; 这是声明,调用象普通函数一样就可以了。
一个符号存世 2017-02-17
  • 打赏
  • 举报
回复
typedef struct FactorySDKDll BL_FactorySDKDll; __declspec(dllexport) const char* BL_getSDKVersion(); __declspec(dllexport) BL_FactorySDKDll *BL_createInstance(); __declspec(dllexport) bool BL_releaseInstance(BL_FactorySDKDll* inst); __declspec(dllexport) bool BL_setPackage(BL_FactorySDKDll* inst, char* packDir); 补充楼上的提问 要如何声明,调用
一个符号存世 2017-02-17
  • 打赏
  • 举报
回复
__declspec(dllexport) BL_FactorySDKDll *BL_createInstance(); __declspec(dllexport) bool BL_releaseInstance(BL_FactorySDKDll* inst); 转换成delphi 应该如何调用?
一个符号存世 2017-02-17
  • 打赏
  • 举报
回复
那如果这就是一个空的结构体呢
nebula845026 2017-02-17
  • 打赏
  • 举报
回复
这个BL_FactorySDKDll就是一个标志,没什么意义,就像Windows中的句柄一样,它应该只存的是一个数值而已,在创建的时候SDK函数会返回一个数值,应该是一个内存地址,释放的时候也是根据这个地址去释放其中的内容,主要看这个DLL是32位还是64位的,然后你定义一个相应的数值变量就行了,你只要翻译对这句话就可以了" __declspec(dllexport) BL_FactorySDKDll *BL_createInstance();" 定义一个结构体,比如 TBL_FactorySDKDLL = Integer; 然后再声明一个变量: g_dll:TBL_FactorySDKDLL; g_dll := BL_createInstance(); 就完了 很多动态库都这样,就像delphi中的TColor实际上也是Integer,只不过变了一个名称而已
  • 打赏
  • 举报
回复
既然他这么说:结构体BL_FactorySDKDll只是一个标志,用于创建DLL实例对象,外部调用不需关心其内容。 这样试试: function BL_createInstance: pointer; stdcall; external 'xxx.dll'; function BL_releaseInstance(inst: pointer): boolean; stdcall; external 'xxx.dll'; 看他这意思,BL_createInstance返回的指针要保存,其他函数还要用到,比如下面那个inst。
一个符号存世 2017-02-17
  • 打赏
  • 举报
回复
好像还是不行啊, 这是SDK包 http://pan.baidu.com/s/1boE1D87 这是7681passthrough 文件夹 http://pan.baidu.com/s/1dEM5izJ 调用顺序是 1、BL_createInstance 2、BL_setPackage function BL_setPackage(inst:PBL_FactorySDKDll;packDir:PChar)中的packDir为7681passthrough 文件夹的路径 @DelphiGuy
  • 打赏
  • 举报
回复
因为 FactorySDKDll = record // ... 你要找到C++中该结构的定义 end; 你要找到C++中的实际结构定义,否则空结构它的函数一写就出问题了。 实在不行你先填充一下: type FactorySDKDll = record Padding: array[0.255] of byte; end;
一个符号存世 2017-02-17
  • 打赏
  • 举报
回复
引用 11 楼 DelphiGuy 的回复:
type FactorySDKDll = record // ... 你要找到C++中该结构的定义 end; BL_FactorySDKDll = FactorySDKDll; PBL_FactorySDKDll = ^BL_FactorySDKDll; function BL_createInstance: PBL_FactorySDKDll; stdcall; external 'xxx.dll'; function BL_releaseInstance(inst: PBL_FactorySDKDll): boolean; stdcall; external 'xxx.dll'; 这是声明,调用象普通函数一样就可以了。
我现在就是在调用这步上出错, 我是这样声明的

type
  TBL_FactorySDKDll = record
  end;
  PBL_FactorySDKDll = ^TBL_FactorySDKDll;
  function BL_createInstance(): PBL_FactorySDKDll; stdcall; external BL_DLL;
  function BL_setPackage(inst:PBL_FactorySDKDll;packDir:PChar): Boolean; stdcall; external BL_DLL;
调用

var
  pRet: PBL_FactorySDKDll;
//第一步创建
procedure TForm1.btn2Click(Sender: TObject);
begin
    pRet:=BL_createInstance();
    Edit1.Text := Format('%p', [ @pRet]);//看看是否为空
end;
//第二步,这里出错
procedure TForm1.btn3Click(Sender: TObject);
var
  TF:Boolean;
begin
  TF:=BL_setPackage(pRet,'E:\\7681passthrough');
end;
santiaodahan 2017-02-16
  • 打赏
  • 举报
回复
结构体在Delphi中叫记录类型。BL_FactorySDKDll是结构体FactorySDKDll的别名。
santiaodahan 2017-02-16
  • 打赏
  • 举报
回复
结构类型是自定义类型,必须知道怎样声明的才能转换成其他语言。
  • 打赏
  • 举报
回复
这里也没有啊,你应该批量文件查找它的SDK源码。
一个符号存世 2017-02-16
  • 打赏
  • 举报
回复
找到word文档里贴了一个mainwindow.h文件,不知道有没有用@DelphiGuy

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>
#include <QLibrary>
#include "sdkdllinterface.h"
#include <QFile>
#include <QDir>

namespace Ui {
class MainWindow;
}

typedef BL_FactorySDKDll* (*CreateDLLFunc)();
typedef bool (*DeleteDllFunc)(BL_FactorySDKDll*);
typedef bool (*SetPackageFunc)(BL_FactorySDKDll*, char*);
typedef bool (*SetDidLicenseFunc)(BL_FactorySDKDll*, char*, int, char*, int);
typedef BL_StepInfo* (*GetTotalStepFunc)(BL_FactorySDKDll*);
typedef bool (*RegisterCBFunc)(BL_FactorySDKDll*, BL_ProcessCB, void*);
typedef bool (*ExecuteStepFunc)(BL_FactorySDKDll*, int);
typedef bool (*OpenPortFunc)(BL_FactorySDKDll*, BL_SerialPortInfo, BL_OpenPortCB, void*);
typedef bool (*ClosePortFunc)(BL_FactorySDKDll*);


void callBack(int step, bool ret, char* desc, char* errMsg, int errCode, char* portData, void* object);

void openPortResult(bool isOK, void* object);

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void initFunction();
    void showMessage(int step, bool ret, char* desc, char* errMsg, int errCode, char* portData);

private slots:
    void on_btnCreate_clicked();

    void on_btnSetPack_clicked();

    void on_btnSetLicense_clicked();

    void on_btnGetSteps_clicked();

    void on_btnRegister_clicked();

    void on_btnOpen_clicked();

    void on_btnExecute_clicked();

    void on_btnClose_clicked();

    void on_btnRelease_clicked();

private:
    Ui::MainWindow *ui;
    CreateDLLFunc createFunc;
    DeleteDllFunc deleteFunc;
    SetPackageFunc setPackFunc;
    SetDidLicenseFunc setLicenseFunc;
    GetTotalStepFunc totalStepFunc;
    RegisterCBFunc registerCBFunc;
    ExecuteStepFunc executeFunc;
    OpenPortFunc openFunc;
    ClosePortFunc closeFunc;
    BL_FactorySDKDll *dll;
 
  • 打赏
  • 举报
回复
那它的定义必然在其他.h、.hpp或者.cpp中,否则C++也不能编译通过。
一个符号存世 2017-02-16
  • 打赏
  • 举报
回复
下面是全部头文件的内容,FactorySDKDll的定义真的没有啊,关于它的说明也只有一句话 @santiaodahan @lyhoo163 @DelphiGuy “结构体BL_FactorySDKDll只是一个标志,用于创建DLL实例对象,外部调用不需关心其内容。”

#ifndef SDKDLLINTERFACE_H
#define SDKDLLINTERFACE_H

#include <cstddef>

#define STEP_DESC_SIZE 100

typedef struct BL_SerialPortInfo
{
    char portName[100];
    int baduRate;
    int dataBit;
    int parity;
    int stopBit;
} BL_SerialPortInfo;

typedef struct BL_StepInfo
{
    int step;
    char desc[STEP_DESC_SIZE];
    int totalStep;
}BL_StepInfo;

enum BL_ModuleType {            
    BL_ModuleCommon,
    BL_Module433Device,
    BL_ModuleJLink,
    BL_ModuleUndefined
};

typedef struct BL_PackageInfo  
{
    bool isOK;
    BL_ModuleType moduleType;
    bool isNeedLicense;
    int totalSteps;
}BL_PackageInfo;
typedef void (*BL_ProcessCB) (int currentStep, bool result, char* stepDesc,
                              char* errMsg, int errCode, char* portData, void* object);
typedef void (*BL_OpenPortCB)(bool result, void* object);
typedef void (*BL_JLinkProcessCB)(int currentStep, int totalStep, bool result, char* msg, void* object); 
typedef void (*BL_JLinkScheduleCB)(int value, void* object);   
typedef struct FactorySDKDll BL_FactorySDKDll;

extern "C" {
    __declspec(dllexport) const char* BL_getSDKVersion();
    __declspec(dllexport) BL_FactorySDKDll *BL_createInstance();
    __declspec(dllexport) bool BL_releaseInstance(BL_FactorySDKDll* inst);
    __declspec(dllexport) bool BL_setPackage(BL_FactorySDKDll* inst, char* packDir);
    __declspec(dllexport) BL_PackageInfo BL_setPackageAndGetInfo(BL_FactorySDKDll* inst, char* packDir);
    __declspec(dllexport) bool BL_isNeedLicense(BL_FactorySDKDll* inst);
    __declspec(dllexport) char* BL_makeLicense(BL_FactorySDKDll* inst, char* did, char* license, char* facPubKey, char* dsig);
    __declspec(dllexport) bool BL_setDidLicense(BL_FactorySDKDll* inst, char* did, int didSize,
                                             char* license, int licenseSize);
    __declspec(dllexport) BL_StepInfo* BL_getTotalSteps(BL_FactorySDKDll* inst);
    __declspec(dllexport) int BL_getTotalStepsCount(BL_FactorySDKDll* inst);
    __declspec(dllexport) char* BL_getStepInfo(BL_FactorySDKDll* inst, int step);
    __declspec(dllexport) bool BL_registerCallback(BL_FactorySDKDll* inst, BL_ProcessCB cb, void* object = NULL);
    __declspec(dllexport) bool BL_executeStep(BL_FactorySDKDll* inst, int step);
    __declspec(dllexport) bool BL_openSerialPort(BL_FactorySDKDll* inst, BL_SerialPortInfo info, BL_OpenPortCB cb, void* object = NULL);
    __declspec(dllexport) bool BL_closeSerialPort(BL_FactorySDKDll* inst);
    __declspec(dllexport) char* BL_getLastError(BL_FactorySDKDll* inst);
    __declspec(dllexport) bool BL_setLastScanDid(BL_FactorySDKDll* inst, char* did, int didSize);
    __declspec(dllexport) BL_ModuleType BL_getModuleType(BL_FactorySDKDll* inst);                               //12.16新增
    __declspec(dllexport) bool BL_startJLINK(BL_FactorySDKDll* inst, char* mac, BL_JLinkProcessCB cb,
                                             BL_JLinkScheduleCB scheduleCb, void* object = NULL);          //12.16新增
}

#endif // SDKDLLINTERFACE_H
加载更多回复(1)
所有需求全部来自生产实际,源自生产,贴近实战,提高技能。 生产案例生产库A是一台2012年的数据库服务器,存储是戴尔sc8000数据量有20T。数据库版本是11.2.0.3,该数据库是单实例数据库。使用操作系统目录存储,没有使用ASM存储。需要进行数据库服务器和存储迁移。迁移到新服务器和新存储。迁移到新的rac环境,使用本地方式进行升级。 目标:我们需要迁移数据库A到新服务器,新存储。 源库A数据库版本11.2.0.3数据库类型单实例数据存储使用操作系统目录存储,非ASM存储容量20TosRhel6 目标库B数据库版本19.19数据库类型Rac数据存储ASM容量21TOsRhel7 难点。1-数据库服务器需要进行替换2-存储需要进行替换3-容量大,存储没有多余空间,只能才有原地升级方式4-版本跨度大,需要从11203->11204->1919单实例->1919-pdb-rac. 具体步骤1-源服务器数据库命令行创建11203数据库软件2-源服务器数据库命令行创建11203数据库实例3-在目标服务器克隆源库11.2.0.3数据软件。并且在目标服务器搭建源库的dg库。4-开始真正的割接,割接的时候没有业务的。激活11203dg为主库。5-升级11203到112046-升级11204到19.197-配置19.19单实例数据库为rac数据库中的某个pdb。Over. 针对以前学员提出文档不全的意见,其实文档都是有的,都已经上传到百度网盘。这次实战课程整理文档如下:0-创建源库11203单实例1-通过克隆方式在目标服务器rac上面创建11203数据库软件2-在目标库rac数据库上面创建11203的单实例的dg3-目标库rac安装11204单实例软件和升级11203到112044-11204升级到19c数据库

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧