我需要将多个值传递给内存,我需要将各个国家/地区设为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();
}
}
答案 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