我手里有一段用Delphi写的源码,好像是用来生成一个DLL文件的。
我想把它里面的函数内容转化为C语言或者C++编写的,不知道哪位大佬能帮我看一看,不胜感激~
library PSIdll;
const
Pkg8400Len = 4120;
Pkg8400ChNum = 1024;
type
Byte69 = array[0..68] of Byte;
Single16 = array[0..15] of Single;
Byte8400 = array[0..Pkg8400Len-1] of Byte;
Single8400 = array[0..Pkg8400ChNum-1] of Single;
DataPkgType =packed record
st: Byte;
SN: integer;
ChData: Single16;
end;//以下是PSI扫描器数据包解码函数
//单个4字节格式7->单精度浮点数
Function ToSingle(s1,s2,s3,s4:byte): Single; stdcall;
Var spt:^single;
sary:array[0..3] of byte;
begin
sary[0]:=s4;
sary[1]:=s3;
sary[2]:=s2;
sary[3]:=s1;
spt:=@sary; ToSingle:=spt^;
end;//单个4字节格式8->单精度浮点数
Function ToSingle8(s1,s2,s3,s4:byte): Single; stdcall;
Var spt:^single;
sary:array[0..3] of byte;
begin
sary[0]:=s1;
sary[1]:=s2;
sary[2]:=s3;
sary[3]:=s4;
spt:=@sary; ToSingle8:=spt^;
end;
//单个69字节数据包->16个单精度浮点数
Function Decode9000(var rBuff: Byte69; psiFormat:integer;var SN:Longint; var ChData:Single16): integer;stdcall;
var
myData: ^DataPkgType;
byteAry: Byte69;
i: integer;Begin
if (rBuff[0]>3) or (rBuff[0]<1) then
begin
Decode9000:=1;
for i:=0 to 15 do
begin
ChData[i] := 0.0;
end;
SN:= 0;
exit; end;
case psiFormat of
7:
begin
byteAry[0]:= rBuff[0];
for i:=0 to 16 do
begin //交换字节顺序,格式7->格式8
byteAry[i*4+1]:= rBuff[i*4+4];
byteAry[i*4+2]:= rBuff[i*4+3];
byteAry[i*4+3]:= rBuff[i*4+2];
byteAry[i*4+4]:= rBuff[i*4+1];
end;
myData:=@byteAry;
end;
8:
myData:=@rBuff; else
Decode9000:=1;
exit;
end;
Decode9000:=0;
ChData :=myData^.ChData;
SN:= myData^.SN;
End;//==============================
//Decode DTCInitium 和8400数据包
Function DecodeDTC8400(var rBuff: Byte8400; var SN:Longint; var ChData:Single8400): integer;stdcall;
Var spt:^single;
sary:array[0..3] of byte;
DataNum: integer;
i: integer;Begin
DecodeDTC8400:=1;
//报头解析:应答包
case rBuff[1] of
4,8,9,128: //简单应答包
begin
DecodeDTC8400:=1;
for i:=0 to 63 do
begin
ChData[i] := 0.0;
end;
SN:= 0;
end;19: //数据流包
if rBuff[0] = 250 then
begin
DecodeDTC8400:=0;
SN := rBuff[4];
SN := SN *256 + rBuff[5];
DataNum := rBuff[6];
DataNum := DataNum *256 + rBuff[7]; //得到数据点数
//字节倒序,8400总是使用格式7,大头格式
for i:=0 to DataNum-1 do //DataNum-1
begin //交换字节顺序,格式7->格式8
sary[0]:= rBuff[i*4+24+3];
sary[01]:= rBuff[i*4+24+2];
sary[02]:= rBuff[i*4+24+1];
sary[03]:= rBuff[i*4+24];
spt:=@sary;
ChData[i] := spt^;
end;
end;else //其它不解码
begin
DecodeDTC8400:=1;
for i:=0 to 63 do
begin
ChData[i] := 0.0;
end;
SN:= 0;
end;
end;
End;
exports ToSingle ,
ToSingle name 'Tosingle',
ToSingle name 'ToSingle7',
ToSingle8,
DecodeDTC8400,
Decode9000;
beginend.
我想把它里面的函数内容转化为C语言或者C++编写的,不知道哪位大佬能帮我看一看,不胜感激~
library PSIdll;
const
Pkg8400Len = 4120;
Pkg8400ChNum = 1024;
type
Byte69 = array[0..68] of Byte;
Single16 = array[0..15] of Single;
Byte8400 = array[0..Pkg8400Len-1] of Byte;
Single8400 = array[0..Pkg8400ChNum-1] of Single;
DataPkgType =packed record
st: Byte;
SN: integer;
ChData: Single16;
end;//以下是PSI扫描器数据包解码函数
//单个4字节格式7->单精度浮点数
Function ToSingle(s1,s2,s3,s4:byte): Single; stdcall;
Var spt:^single;
sary:array[0..3] of byte;
begin
sary[0]:=s4;
sary[1]:=s3;
sary[2]:=s2;
sary[3]:=s1;
spt:=@sary; ToSingle:=spt^;
end;//单个4字节格式8->单精度浮点数
Function ToSingle8(s1,s2,s3,s4:byte): Single; stdcall;
Var spt:^single;
sary:array[0..3] of byte;
begin
sary[0]:=s1;
sary[1]:=s2;
sary[2]:=s3;
sary[3]:=s4;
spt:=@sary; ToSingle8:=spt^;
end;
//单个69字节数据包->16个单精度浮点数
Function Decode9000(var rBuff: Byte69; psiFormat:integer;var SN:Longint; var ChData:Single16): integer;stdcall;
var
myData: ^DataPkgType;
byteAry: Byte69;
i: integer;Begin
if (rBuff[0]>3) or (rBuff[0]<1) then
begin
Decode9000:=1;
for i:=0 to 15 do
begin
ChData[i] := 0.0;
end;
SN:= 0;
exit; end;
case psiFormat of
7:
begin
byteAry[0]:= rBuff[0];
for i:=0 to 16 do
begin //交换字节顺序,格式7->格式8
byteAry[i*4+1]:= rBuff[i*4+4];
byteAry[i*4+2]:= rBuff[i*4+3];
byteAry[i*4+3]:= rBuff[i*4+2];
byteAry[i*4+4]:= rBuff[i*4+1];
end;
myData:=@byteAry;
end;
8:
myData:=@rBuff; else
Decode9000:=1;
exit;
end;
Decode9000:=0;
ChData :=myData^.ChData;
SN:= myData^.SN;
End;//==============================
//Decode DTCInitium 和8400数据包
Function DecodeDTC8400(var rBuff: Byte8400; var SN:Longint; var ChData:Single8400): integer;stdcall;
Var spt:^single;
sary:array[0..3] of byte;
DataNum: integer;
i: integer;Begin
DecodeDTC8400:=1;
//报头解析:应答包
case rBuff[1] of
4,8,9,128: //简单应答包
begin
DecodeDTC8400:=1;
for i:=0 to 63 do
begin
ChData[i] := 0.0;
end;
SN:= 0;
end;19: //数据流包
if rBuff[0] = 250 then
begin
DecodeDTC8400:=0;
SN := rBuff[4];
SN := SN *256 + rBuff[5];
DataNum := rBuff[6];
DataNum := DataNum *256 + rBuff[7]; //得到数据点数
//字节倒序,8400总是使用格式7,大头格式
for i:=0 to DataNum-1 do //DataNum-1
begin //交换字节顺序,格式7->格式8
sary[0]:= rBuff[i*4+24+3];
sary[01]:= rBuff[i*4+24+2];
sary[02]:= rBuff[i*4+24+1];
sary[03]:= rBuff[i*4+24];
spt:=@sary;
ChData[i] := spt^;
end;
end;else //其它不解码
begin
DecodeDTC8400:=1;
for i:=0 to 63 do
begin
ChData[i] := 0.0;
end;
SN:= 0;
end;
end;
End;
exports ToSingle ,
ToSingle name 'Tosingle',
ToSingle name 'ToSingle7',
ToSingle8,
DecodeDTC8400,
Decode9000;
beginend.
解决方案 »
- 我想做一个成绩分析系统,但怎么实现科目的随意选择和科目满分标准,谢谢
- 我的分怎么全没了?
- fastreport问题 谢谢 分不够再加
- 错误提示
- 数据库内容转word,字段必须是image类型吗?别的不行吗?
- 怎么在拖动DBGrid中数据时激发拖动事件?
- 初次学三层,请教!
- 帮我看看原程序有什么错吗?为什么会有这样的错误?[Error] Unit1.pas(47): Record, object or class type required
- select name from table在执行了此语句后,希望把取得的结果在Showmessage();中列出来,怎么做?
- 用DELPHI做的程序,如果不做特别处理,启动后,不关闭,然后在“开始”菜单里重起计算机,发现该delphi程序不能自动关闭,从而windows也无法重起。请问,我怎样使程序自动关闭呢?
- 想提取一个app生成二维码
- Delphi如何设置 PDF文件的打开密码
非要翻译,也很容易// PSIdll.cpp#include <windows.h>const int Pkg8400Len = 4120;
const int Pkg8400ChNum = 1024;typedef unsigned char byte;
typedef byte Byte69[69];
typedef float Single16[16];
typedef byte Byte8400[Pkg8400Len];
typedef float Single8400[Pkg8400ChNum];
#pragma pack(push, 1)
typedef struct tagDataPkgType
{
byte st;
int SN;
Single16 ChData;
} DataPkgType;
#pragma pack(pop) __declspec(dllexport) __stdcall float ToSingle(byte s1, byte s2, byte s3, byte s4)
{
int result = (int)s4 + ((int)s3 << 8) + ((int)s2 << 16) + ((int)s1 << 24); return *(float *)&result;
}// 剩下的你自己转吧BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, void *lpReserved)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
// ...
break; case DLL_PROCESS_DETACH:
// ...
break;
} return true;
}
感谢大佬的回复。我是想要在Labview的RT系统中使用,但是Delphi编译出来的DLL它用不了NI的工程师说用C语言编译的应该可以所以才会来问这么一个问题
另外关于代码的部分,由于我很少使用C和Delphi所以十分的小白………… 您应该是转换了数据类型定义的那些吧?剩下的4个函数我如果要转换应该放在代码的哪个地方呢,还请指教一下,蟹蟹蟹蟹~~~
这个DLL的位数问题取决于编译器所在的系统是32位还是64位吗
这个DLL的位数问题取决于编译器所在的系统是32位还是64位吗不是的哦, xe一下只有32的
xe以上可以选择平台(32,64,phone,linux,etc..)的
这个DLL的位数问题取决于编译器所在的系统是32位还是64位吗不是的哦, xe一下只有32的
xe以上可以选择平台(32,64,phone,linux,etc..)的
意思是如果我是在XP下使用Delphi7编译出来的应该就是32位的了吧?
大佬,您的两个DLL我这还是用不了
我联系了NI 的工程师,他们说如果使用他们旗下的Labview/CVI来生成DLL文件的话肯定可以用,但是这个编译器是只支持C语言生成DLL的,所以可能还是需要重构成C…… 为什么会有这样的问题啊……