gpt4 book ai didi

C# 从 C++ DLL 编码(marshal) Unsigned Char 返回值

转载 作者:太空宇宙 更新时间:2023-11-04 12:52:39 25 4
gpt4 key购买 nike

<分区>

我正在将函数从 C++ DLL 导入到 C# 应用程序中。我能够导入一些功能,但不能导入其他功能。 C++ DLL 附带了一个 C++ 项目,展示了如何从 C++ 使用它。我想在 C# 中复制它,但我在编码方面遇到了问题。这是 C++:

头文件声明:

unsigned long __stdcall mfcs_initialisation(unsigned short serial);
unsigned long __stdcall mfcsez_initialisation(unsigned short serial);
unsigned char __stdcall mfcs_close(unsigned long handle);
unsigned char __stdcall mfcs_set_purge_on(unsigned long int handle);
unsigned char __stdcall mfcs_set_purge_off(unsigned long int handle);

unsigned char __stdcall mfcs_get_purge(unsigned long int handle,
unsigned char * c);

unsigned char __stdcall mfcs_get_status(
unsigned long int handle,
unsigned char * c);

unsigned char __stdcall mfcs_read_chan(
unsigned long int handle,
unsigned char canal,
float * pressure,
unsigned short * chrono);

unsigned char __stdcall mfcs_data_chan(
unsigned long int handle,
unsigned char canal,
unsigned char * unite,
unsigned short * max,
unsigned short * zero,
unsigned short * mesure,
unsigned short * chrono);

unsigned char __stdcall mfcs_get_serial(unsigned long int handle,
unsigned short * us);

unsigned char __stdcall mfcs_set_auto(
unsigned long int handle,
unsigned char canal,
float pcons);

unsigned char __stdcall mfcs_set_alpha(
unsigned long int handle,
unsigned char canal,
unsigned char alpha);

unsigned char __stdcall mfcs_set_manual(
unsigned long int handle,
unsigned char canal,
float pcons);

unsigned char __stdcall mfcs_set_zero(
unsigned long int handle,
unsigned char canal,
unsigned short zero);

unsigned char __stdcall mfcs_detect(unsigned short table[256]);
unsigned char __stdcall mfcsez_detect(unsigned short table[256]);

C++代码:

/* Define functions prototype */
typedef unsigned long(__stdcall *init)(int);
typedef unsigned char(__stdcall *purgeOn)(unsigned long handle);
typedef unsigned char(__stdcall *purgeOff)(unsigned long handle);
typedef unsigned char(__stdcall *serial)(unsigned long handle, unsigned short *serial);
typedef unsigned char(__stdcall *close)(unsigned long handle);
typedef unsigned char(__stdcall *setAuto)(unsigned long int handle, unsigned
char canal, float pcons);
typedef unsigned char(__stdcall *readChannel)(unsigned long handle, unsigned
char chan, float * pressure, unsigned short * chrono);
typedef unsigned char(__stdcall *setAlpha)(unsigned long int handle, unsigned
char canal, unsigned char alpha);

int main(int argc, char *argv[])
{
/* System settings variable definition */
float start_pressure = 70; //Pressure set (mbar) at the beginning
float target_pressure = 100; //Maximal pressure setpoint (mbar)
unsigned char pressureChannel = 1; //Selected channel (0 for all channels or put the channel number you would like to control)
HINSTANCE hGetProcIDDLL=NULL; // Define dll handler

/* Load DLL into memory */
hGetProcIDDLL = LoadLibrary(TEXT("mfcs_c.dll"));

/* Declare pointers on dll functions */
init dll_init;
purgeOn dll_purgeOn;
purgeOff dll_purgeOff;
serial dll_serial;
close dll_close;
setAuto dll_setAuto;
readChannel dll_readChannel;
setAlpha dll_setAlpha;

/* Link dll pointers with functions prototype */
dll_init = (init)GetProcAddress(hGetProcIDDLL, "mfcsez_initialisation");
dll_serial = (serial)GetProcAddress(hGetProcIDDLL, "mfcs_get_serial");
dll_purgeOn = (purgeOn)GetProcAddress(hGetProcIDDLL, "mfcs_set_purge_on");
dll_purgeOff = (purgeOff)GetProcAddress(hGetProcIDDLL, "mfcs_set_purge_off");
dll_close = (close)GetProcAddress(hGetProcIDDLL, "mfcs_close");
dll_setAuto = (setAuto)GetProcAddress(hGetProcIDDLL, "mfcs_set_auto");
dll_readChannel = (readChannel)GetProcAddress(hGetProcIDDLL, "mfcs_read_chan");
dll_setAlpha = (setAlpha)GetProcAddress(hGetProcIDDLL, "mfcs_set_alpha");

/* Define variables used for MFCS device */
unsigned long mfcsHandle;
unsigned short mySerial;
float read_pressure;
unsigned short chrono;
int loop_index;


if (hGetProcIDDLL != NULL) { // If dll loaded
std::cout << "mfcs_c.dll is loaded" << std::endl;

/* Initialize device */
if (dll_init != NULL) { // Check if function was properly linked to the dll file
/* Initialize the first MFCS in Windows enumeration list */
mfcsHandle = dll_init(0);
/* After the initialization we need to add a delay of 500ms to make sure that the USB communication is properly established */
Sleep(500);
std::cout << "MFCS initialized" << std::endl;
}

/* Read device serial number */
if (dll_serial != NULL) {
/*Get the serial number of the MFCS*/
dll_serial(mfcsHandle, &mySerial);
std::cout << "MFCS SN: " << mySerial << std::endl;
}

/* Set pressure regulation servitude coefficient */
if (dll_setAlpha != NULL) {
dll_setAlpha(mfcsHandle ,pressureChannel, 4); // Default value (just after power on) is 0
} // Alpha value has to be grather than 0 in order to regulate pressure

/* Change and read pressure every second until reaching 'target_pressure' value */
for (loop_index = int(start_pressure); loop_index<target_pressure; loop_index++){
dll_setAuto(mfcsHandle,pressureChannel,float(loop_index)); // Set required output pressure value
Sleep(1000); // Wait 1 s
dll_readChannel(mfcsHandle, pressureChannel, &read_pressure, &chrono); // Get the pressure value on the specified channel
std::cout << "Set pressure at: " << loop_index << "mbar" << "; Read pressure: " << read_pressure
<< "mbar" << std::endl; // Display pressure setpoint and channel pressure value
}

/* Close MFCS session */
if (dll_close != NULL) {
dll_close(mfcsHandle);
std::cout << "MFCS closed" << std::endl;
}
}

/* Release the DLL */
FreeLibrary(hGetProcIDDLL);
std::cout << "mfcs_c.dll unloaded" << std::endl;

/* Exit application */
system("PAUSE");

return EXIT_SUCCESS;

基本上,我已经尝试了很多导入函数的排列组合,以及任何包含无符号字符或指针的排列组合,但我不知道如何映射。

非常感谢 DAVID 插入我从我这边变得更有用。

注意:一个对我有帮助的示例是基于上面的 C++ 代码的清晰说明,用于拉入 mfcs_get_serial(unsigned long int handle, unsigned short * serial) 到 C#。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com