delphi调用c++ mfc dll
ansean基本把这个问题说清楚了。
1、保证你传递的参数要正确:C++中的char *对应PASCAL中的pchar。
2:C++中导出的函数的参数调用方式要和你DELPHI中的导入的函数参数调用方式要一致!
例如: C++的参数调用方式 对应的DELPHI的参数调用方式
_declspec cdecl
WINAPI,CALLBACK stdcall
PASCAL pascal
我遇到过你同样的问题,后来把STDCALL改为cdecl,问题就解决了,因为我在C++导出函数时使用的是“_declspec(dllexport)”,也就是C参数调用格式。
别人回答的以上
https://www.cnblogs.com/pcdelphi/archive/2009/04/30/2018032.html
//函数功能:判断登陆SSH账户密码是否正确 //参数1:ip == 服务器IP //参数2:user == 账户 //参数3:pw == 密码 //函数返回值:1 =正常 ,-2 = 账户密码错误。-3 = SSH无法正常使用。 extern "C" _declspec(dllexport) int WINAPI login_lib(char * ip, char * user, char * pw) { if (!Sftplibssh2::Inst()->init(ip, 22)) { return -1; } if (Sftplibssh2::Inst()->Connect(user, pw) < 0) { return -2; } Sftplibssh2::Inst()->Disconnect(); // 断开连接 return 1; }
//函数功能:获取远程计算机内存信息 //参数1:ip == 服务器IP //参数2:user == 账户 //参数3:pw == 密码 //参数4:返回数据:szRetBuf ---- > json格式数据 json["total"] = total;json["used"] = used;json["free"] = free; //函数返回值:成功 >0 ,失败< 0 extern "C" _declspec(dllexport) int WINAPI command_memory_lib(char * ip, char * user, char * pw, char* szRetBuf) { OutputDebugString("command_memory_lib in"); int nRet = -1; Init_soctet(); Ssh2 ssh(ip); if (!ssh.Connect(user, pw)) { return -2; } Channel* channel = ssh.CreateChannel(); if (channel == NULL) { return -3; } channel->Write("free -m"); string data = channel->Read(); string total, used, free; size_t pos = data.find("Mem:"); if (pos != std::string::npos) { string meminfo = data.substr(pos + 4, data.size()); for (int i = 0; i < 3; i++) { string tem = meminfo; int nullsize = 0; int datasize = 0; int flag = 0; for (int j = 0; j < tem.size(); j++) { if (tem[j] == ' ') { if (!flag) { nullsize++; } else { break; } } else { datasize++; flag = 1; } } if (i == 0) { total = tem.substr(nullsize, datasize); } else if (i == 1) { used = tem.substr(nullsize, datasize); } else { free = tem.substr(nullsize, datasize); } meminfo = tem.substr(datasize + nullsize, tem.size()); } Json::Value json; json["total"] = total; json["used"] = used; json["free"] = free; string out = json.toStyledString(); memcpy(szRetBuf, out.c_str(),out.size()); nRet = 1; } delete channel; ssh.Disconnect(); OutputDebugString("command_memory_lib out"); return nRet; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2020-05-21 原则:能用代码实现的 不用第三方
2020-05-21 gethostname 环境 -》错
2020-05-21 http代理验证所需要的用户名密码是base64编码的
2019-05-21 excel ppt文字搜索
2019-05-21 java http httpclient
2019-05-21 java 基本包
2019-05-21 高信达通