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 2021-05-21 12:17  lydstory  阅读(201)  评论(0)    收藏  举报

导航