[ad_1]
これは私のコードです:
void CScaricoDoc::PrintCodeZebraTesto(TCHAR *szPrinter, TCHAR *szBarcode, std::string &strPathZebra) { BOOL bRet, bEsisPrinter; BYTE *pchTesto, *pchBuffOut; CHAR chBarcode[256]; TCHAR chDriverName[256], chDoc[256]; size_t nLenBarcode; int nbytes; WORD buffLen, *pLen; DWORD cbNeeded; FILE *fp; HDC hdc; HANDLE han; DEVMODE DM; DOCINFO infsta; PRINTER_INFO_2 *pprint; CString cs(strPathZebra.c_str()); TCHAR * szPathZebra = cs.GetBuffer(); CStringA chCodLeather = "230208010013"; bRet = TRUE; bEsisPrinter = FALSE; chDriverName[0] = '\0'; if (OpenPrinter(szPrinter, &han, NULL)) { GetPrinter(han, 2, NULL, 0, &cbNeeded); // richiedo informazioni if (cbNeeded > 0) { pprint = (PRINTER_INFO_2 *)calloc(cbNeeded, sizeof(BYTE)); if (pprint) { if (GetPrinter(han, 2, (LPBYTE)pprint, cbNeeded, &cbNeeded)) { if (pprint->pDevMode) { _tcscpy_s(chDriverName, 256, pprint->pDriverName); memcpy(&DM, pprint->pDevMode, sizeof(DEVMODE)); bEsisPrinter = TRUE; } } free(pprint); pprint = NULL; } } ClosePrinter(han); } if (bEsisPrinter) { pchTesto = NULL; pchBuffOut = NULL; #ifdef _UNICODE WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, szBarcode, -1, chBarcode, 256, NULL, NULL); #else _tcscpy_s(chBarcode, 256, szBarcode); #endif nLenBarcode = strlen(chBarcode); { nbytes = strPathZebra.size()*2; if (nbytes > 0) { //pchTesto = (BYTE *)calloc(nbytes + 1, sizeof(BYTE)); CT2A temp(cs); // convert from CString to CT2A pchTesto = (BYTE *)(char *)temp; //BYTE *p = (BYTE*)(const char*)cs; pchBuffOut = (BYTE *)calloc(nbytes + nLenBarcode + 3, sizeof(BYTE)); //pchTesto = pByte; //nbytes = (int)fread(pchFile, sizeof(unsigned char), nbytes + 1, fp); if (nbytes > 0) // Ho letto il file testo { //sprintf_s((char *)pchBuffOut + 2, nbytes + nLenBarcode + 1, /*(char *)pchTesto*/cs, chBarcode); sprintf_s((char *)pchBuffOut + 2, nbytes + nLenBarcode + 1, "%s%s", (char *)pchTesto, chBarcode); //sprintf_s((char *)cs.GetBuffer() + 2, nbytes + nLenBarcode + 1, (char *)nbytes, chBarcode); pLen = (WORD *)pchBuffOut; buffLen = (WORD)strlen((char *)pchBuffOut + 2); (*pLen) = buffLen; _tcscpy_s(chDoc, 256, _T("Label zebra")); std::memset(&infsta, 0, sizeof(infsta)); infsta.cbSize = sizeof(DOCINFO); infsta.lpszDocName = chDoc; hdc = CreateDC(chDriverName, szPrinter, NULL, &DM); if (hdc) { StartDoc(hdc, &infsta); bRet = (ExtEscape(hdc, PASSTHROUGH, buffLen + 2, (LPCSTR)pchBuffOut, 0, NULL) > 0) ? FALSE : TRUE; EndDoc(hdc); DeleteDC(hdc); } } if (pchTesto) { free(pchTesto); pchTesto = NULL; } if (pchBuffOut) { free(pchBuffOut); pchBuffOut = NULL; } } } } return; }
私が試したこと:
インターネットで検索しようとしたところ、メモリの損失であると読みました。メモリを解放するときは、ポインタ pchTesto と pchBuffOut に依存すると思います。
解決策 2
これがメモリのバグであることは明らかなので、「mystory」コード行を分析してください。 API 呼び出しに十分なメモリが提供されていないと思われます。 API はデータとそのサイズを埋めるためにメモリ ブロックを取得する必要がある場合があるため、関数に関するドキュメントを詳しく読んでください。
コード内でシングル ステップ モードを実行して、場所を見つけます。 知識を高めるために、いくつかのデバッグ チュートリアルにアクセスしてください。
幸運を ;-)
解決策 3
まず、「malloc」を使用して、作業中のデータに十分なメモリが割り当てられていることを確認します。
コードには、メモリが割り当てられるインスタンス (pprint、pchTesto、pchBuffOut) がいくつかありますが、解放するのは最後に pprint だけです。 割り当てられたすべてのメモリを必ず解放してください。
「pchTesto」と「pchBuffOut」にメモリを正しく割り当てるには、次のようなことを試してください –
// Allocate memory for pchTesto BYTE* pchTesto = nullptr; size_t nLen = strPathZebra.size(); if (nLen > 0) { pchTesto = (BYTE*)malloc(nLen + 1); memcpy(pchTesto, szPathZebra, nLen + 1); } // Allocate memory for pchBuffOut size_t buffSize = nbytes + nLenBarcode + 3; BYTE* pchBuffOut = (BYTE*)malloc(buffSize);
完了したら、すべてのメモリ割り当てをクリアします –
// Free allocated memory for pchTesto free(pchTesto); // Free allocated memory for pchBuffOut free(pchBuffOut);
[ad_2]
コメント