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;
}
复制代码

 

posted on   lydstory  阅读(183)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.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 高信达通

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示