实用脚本四:C++导出DLL并传递Char*值

记录一下项目中遇到的bug

首先是char*作为函数参数时,它是不会被直接赋值的,需要在函数内构建一个char*,在用memcpy函数拷贝给输入的char*。

VS导出DLL,在h文件里加上这样子的头定义

#ifndef PDDETECT
#define PDDETECT

//宏定义导出
#ifdef PDDETECTDLL__
#define PDDETECTDLL __declspec(dllexport)//导出
#else
#define PDDETECTDLL __declspec(dllimport)//导入
#endif 

然后对需要导出的函数加上extern "C" PDDETECTDLL即可,注意extern "C"必须要加,不然动态调用的时候会找不到该函数,另一个做法是用def文件导出函数,作用和extern "C"一样。

在调用的时候,动态调用不需要h和lib文件,直接在调用的CPP里加上函数定义。

typedef bool(*DpDetect)(MV3D_LP_DEPTH_DATA* , char* , int& , bool& );

然后再调用的函数里

    HINSTANCE pdDll = LoadLibrary(L"pdDetect.dll");

    HINSTANCE pdDll = LoadLibrary(L"pdDetect.dll");
    if (pdDll==NULL) {
        cout << "调用失败" << endl;
    }
    DpDetect detect_dp = (DpDetect)GetProcAddress(pdDll, "detect_dp");
    CsDetect detect_cs = (CsDetect)GetProcAddress(pdDll, "detect_cs");
    ClDetect detect_cl = (ClDetect)GetProcAddress(pdDll, "detect_cl");

    if (detect_dp == NULL || detect_cs == NULL || detect_cl==NULL)
    {
        cout << "cant get func" << endl;
    }

只要函数提取成功,就可以直接用DLL里的这个函数了。

静态调用就和正常调用其他库类似,加上h和lib,然后include h文件,直接调用函数即可。

说起来,DLL这件事去年就干过,但是忘记得差不多了,还是要多记录才行。

这里额外提一句,对于深度学习模型打包成DLL后,如果调用了GPU一定要及时释放内存,不然就会报错,

    DetectorItem->init_model(model_param, model_bin);
    objects = DetectorItem->detect_model(matImg);
    DetectorItem->~Detector();

还有图像cv::Mat和char*之间的相互转换

    //char* to cv::Mat
	cv::Mat matImg = cv::Mat(nInHight, nInWide, CV_8UC3, pInClData);

    //cv::Mat to char*
    //方法一
    unsigned char* ucImg = img.data;
    char* uImg = (char*)ucImg;
    //方法二,推荐用方法2,nOutSize就是图像的尺寸,如果是灰度图就是H*W,RGB图就是H*W*3
    memcpy(pOutClData, (char*)matImg.data, nOutSize);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值