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; }
浙公网安备 33010602011771号