在内存中分配多个结构

时间:2017-02-20 15:39:23

标签: c++ dll struct cen-xfs

我需要将多个值传递给内存,我需要将各个国家/地区设为CEN / XFS。

这个api:CashDispenser - CDM

结构参考:WFSCDMCURRENCYEXP

我是怎么做的:

HRESULT WINAPI WFPGetInfo(HSERVICE hService, DWORD dwCategory, LPVOID lpQueryDetails, DWORD dwTimeOut, HWND hWnd, REQUESTID ReqID) {
WFSRESULT * lpWFSResult;
WFSCDMSTATUS CdmStatus;
WFSCDMCAPS CdmCapabilities; 
WFSCDMCASHUNIT CdmCash;
WFSCDMCURRENCYEXP CdmCurrency;
HRESULT result;

result = WFMAllocateBuffer(sizeof(WFSRESULT), WFS_MEM_ZEROINIT | WFS_MEM_SHARE, (void**)&lpWFSResult); 

    if(result != WFS_SUCCESS){
        return WFS_ERR_INTERNAL_ERROR;
    }

if(dwCategory == WFS_INF_CDM_CURRENCY_EXP){

    const int countCurrencies = 2;

    WFSCDMCURRENCYEXP** ppCdmCurrencies;

    result = WFMAllocateMore(sizeof(WFSCDMCURRENCYEXP*) * (countCurrencies+1), lpWFSResult, (void**)&ppCdmCurrencies);

    lpWFSResult->hService=hService;      
    lpWFSResult->RequestID=ReqID;
    lpWFSResult->u.dwEventID=WFS_INF_CDM_CURRENCY_EXP;
    lpWFSResult->hResult=WFS_SUCCESS;

    result = WFMAllocateMore(sizeof(WFSCDMCURRENCYEXP), lpWFSResult, (void**)&ppCdmCurrencies[0]);

    WFSCDMCURRENCYEXP& cmdCurrency0(*ppCdmCurrencies[0]);
    memcpy(cmdCurrency0.cCurrencyID, "AED", 3);
    cmdCurrency0.sExponent = 0;

    WFSCDMCURRENCYEXP& cmdCurrency1(*ppCdmCurrencies[1]);
    memcpy(cmdCurrency1.cCurrencyID, "AFA", 3);
    cmdCurrency1.sExponent = 0;

    lpWFSResult->lpBuffer = ppCdmCurrencies;
    logFile.close();
}
}

5 个答案:

答案 0 :(得分:3)

你的代码看起来很C-ish。

在c ++中执行此操作的惯用方法是:

require('./bootstrap');
Vue.component('example', require('./components/Example.vue'));

const app = new Vue({
    el: '#app'
});

<强>更新

我刚刚注意到您显然与c风格的API进行了互动,并且原始形式可能需要使用resources/assets/js/app.js。 虽然在c ++中你仍然可以使用require('./bootstrap'); Vue.component('example', require('./components/Example.vue')); const app = new Vue({ el: '#app' }); 来管理该结构的动态分配的连续数组:

struct WFSCDMCURRENCYEXP
{
   std::string     cCurrencyID;
   SHORT           sExponent;
};

std::vector<WFSCDMCURRENCYEXP> CdmCurrencies {
    { "ARG", 3 } ,
    { "EUA", 3 } ,
    // lots more countries
};

答案 1 :(得分:1)

声明一个数组:

WFSCDMCURRENCYEXP CdmCurrency[2];
memcpy( CdmCurrency[0].cCurrencyID, "ARG", 3);
CdmCurrency[0].sExponent = 0; 
memcpy( CdmCurrency[1].cCurrencyID, "EUA", 3);
CdmCurrency[1].sExponent = 0;

memcpy(lpWFSResult->lpBuffer, CdmCurrency, 2*sizeof(WFSCDMCURRENCYEXP));
//                                         ^^

不要忘记你需要复制更多内存。

另请注意,我已修复了.cCurrencyID的设置 - 字符文字(带单引号)只能包含一个字符。要移动多个字符,您需要从字符串中调用memcpy。通常我会建议使用std::string而不是char [3],但如果你这样做就不能使用memcpy,并且在{DLL}中传递std::string可能不是一个好主意。边界。

答案 2 :(得分:0)

您可以调用malloc来分配多个结构,如果它们是所谓的POD - 普通旧数据 - 或没有析构函数,成员函数或具有这些特征的成员类的结构。

这样做的唯一原因是与C兼容,或者编写非常低级别的代码。

作为一般规则,您要创建一个std :: vector。向量为您处理所有内存,您可以根据需要push_back尽可能多的成员。如果效率很重要,请使用保留(或调整大小)。还有一个名为data()的成员,它与C兼容(但C不能调用你的向量,至少不容易)。

答案 3 :(得分:0)

我认为您尝试处理WFS_INF_CDM_CURRENCY_EXP消息以获取有关CDM中货币的信息。

仔细阅读XFS规范:

  

输出参数LPWFSCDMCURRENCYEXP * lppCurrencyExp;指向以NULL结尾的WFSCDMCURRENCYEXP结构指针数组

的指针

这意味着您必须为WFSCDMCURRENCYEXP分​​配一个大小为N + 1的指针数组,并将最后一项设置为null。

在CEN / XFS中,您不能使用标准new或malloc进行内存分配。 您需要使用WFMAllocateBuffer和WFMAllocateMore为返回给调用方的XFS结构分配内存。

对于你的任务,你需要这样的东西:

HRESULT WINAPI WFPGetInfo(HSERVICE hService, DWORD dwCategory, LPVOID lpQueryDetails, DWORD dwTimeOut, HWND hWnd, REQUESTID ReqID) {

WFSRESULT * lpWFSResult;
WFSCDMSTATUS CdmStatus;
WFSCDMCAPS CdmCapabilities; 
WFSCDMCASHUNIT CdmCash;
WFSCDMCURRENCYEXP CdmCurrency;
HRESULT result;

result = WFMAllocateBuffer(sizeof(WFSRESULT), WFS_MEM_ZEROINIT | WFS_MEM_SHARE, (void**)&lpWFSResult); 

    if(result != WFS_SUCCESS){
        return WFS_ERR_INTERNAL_ERROR;
    }

if(dwCategory == WFS_INF_CDM_CURRENCY_EXP){

    const int countCurrencies = 2;

    WFSCDMCURRENCYEXP** ppCdmCurrencies;
    result = WFMAllocateBuffer(sizeof(WFSCDMCURRENCYEXP*) * (countCurrencies+1), WFS_MEM_ZEROINIT | WFS_MEM_SHARE, (void**)&ppCdmCurrencies);

    lpWFSResult->hService=hService;      
    lpWFSResult->RequestID=ReqID;
    lpWFSResult->u.dwEventID=WFS_INF_CDM_CURRENCY_EXP;
    lpWFSResult->hResult=WFS_SUCCESS;

    result = WFMAllocateMore(sizeof(WFSCDMCURRENCYEXP), lpWFSResult, (void**)&ppCdmCurrencies[0]);

    WFSCDMCURRENCYEXP& cmdCurrency0(*ppCdmCurrencies[0]);
    memcpy(cmdCurrency0.cCurrencyID, "AED", 3);
    cmdCurrency0.sExponent = 0;

    result = WFMAllocateMore(sizeof(WFSCDMCURRENCYEXP), lpWFSResult, (void**)&ppCdmCurrencies[1]);

    WFSCDMCURRENCYEXP& cmdCurrency1(*ppCdmCurrencies[1]);
    memcpy(cmdCurrency1.cCurrencyID, "AFA", 3);
    cmdCurrency1.sExponent = 0;

    lpWFSResult->lpBuffer = ppCdmCurrencies;
    logFile.close();
    return WFS_SUCCESS;
}
}

使用XFS进行操作并不是那么简单。它有太多复杂的API结构,具有不同的分配和数据表示规则。请仔细阅读XFS手册。在第一本书ftp://ftp.cen.eu/CWA/CEN/WS-XFS/CWA16926/CWA%2016926-1.pdf中描述了许多概念性的东西。关于配置,内存管理等。

答案 4 :(得分:0)

您的代码不断抛出WFS_ERR_INTERNAL_ERROR,因为您没有完整的XFS环境设置,设置正确的配置或模拟一个(注册表项,sdk,dll等)然后再次测试,请确保您的代码包含正确的标题并确保链接到msxfs.lib,xfs_conf.lib和xfs_supp.lib