Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[c++, WinPRC] Dodawanie zewnętrznej biblioteki

Ostatnio zmodyfikowano 2015-09-21 18:35
Autor Wiadomość
jawka7
Temat założony przez niniejszego użytkownika
[c++, WinPRC] Dodawanie zewnętrznej biblioteki
» 2015-09-17 20:53:51
Witam,

Na wstępie chciałbym zaznaczyć, że nie programuje na codzień w języku C++, jednak wyjątkowo muszę wykonać w nim pewne zadanie.
W VS 2013 stworzyłem projekt Windows Phone Runtime Component, oraz mam skompilowana zewnętrzna biblioteczkę (przeznaczoną dla Windows Phone) pobraną ze strony producenta pewnej drukarki, slużąca jako sterownik do niej.

strona producenta:
MODEL SW40
http://www.woosim.com/english​/bbs/message/download.list.do​?boardId=4&amp%3BmessageId=69

W jaki najprostrzy sposób dodać do mojego projektu zewnętrzną skompilowaną bibliotekę?
Paczka od producenta zawiera pliki .h .lib oraz .dll.
W C# normalnie dotajemy poprzez Add Reference, niestety w C++ moje metody linkowania tej biblioteki kończą sie fiaskiem (wszystkie metody, które znajdują się wpliku .h wywalają błąd "may not be initialized").
Bardzo proszę o szczegółowe zaprezentowanie, w jaki sposób taką biblioteczkę podpiąć, aby była widoczna w projekcie.

Dodam, że korzystam z junstrukcji podanej na tej stronie:

http://www.mathworks.com​/matlabcentral/answers​/182851-how-do-i-integrate-my-c-shared-library-generated-from-matlab-r2013b-in-visual-studio-2013

Przesyłam również screen z błędami jakie otrzymuję:

http://s24.postimg.org​/s4fazzm79​/2015_09_17_22h01_26.png
P-137617
DejaVu
» 2015-09-18 09:59:05
https://msdn.microsoft.com/en-us/library/aa984739(v=vs.71).aspx
P-137624
jawka7
Temat założony przez niniejszego użytkownika
» 2015-09-18 10:22:25
Niestety Windows Phone nie obsługuje DllImport i muszę korzystać z zastępczego rozwiązania zaprezentowanego tutaj:

http://blogs.msdn.com/b​/chrisbarker/archive/2014/10/08​/consuming-a-c-library-project-from-a-windows-phone-store-app.aspx

Udało mi się już zaimportować bibliotekę, jednak gdy korzystam z jej metod otrzymuję błędy.
Gdy wywołałem metodę ClearSpool() otrzymałem błędy:



Error 1 error LNK2019: unresolved external symbol __imp__ClearSpool referenced in function "public: bool __thiscall PrinterDLL::PrinterDLL::Close(void)" (?Close@PrinterDLL@1@QAE_NXZ) E:\Staz\PaymentCollectionSystem\PaymentCollectionSystem.PrinterDLL\PaymentCollectionSystem.PrinterDLL.obj PaymentCollectionSystem.PrinterDLL
Error 2 error LNK1120: 1 unresolved externals E:\Staz\PaymentCollectionSystem\Debug\PaymentCollectionSystem.PrinterDLL\PaymentCollectionSystem.PrinterDLL.dll PaymentCollectionSystem.PrinterDLL

Błąd ten wyświetla się podczas budowy projektu, czego on może dotyczyć?
Pliki .h, .lib oraz. .dll są pobrane ze strony producenta i nie ingerowałem w ich zawartość.

Poniżej implementacja metody w mojej bibliotece:


//PaymentCollectionSystem.PrinterDLL.h
#pragma once

namespace PrinterDLL
{
class PrinterDLL
{
public:
virtual bool Close();
};
}


// PaymentCollectionSystem.PrinterDLL.cpp : Defines the exported functions for the DLL application.
//

#include "pch.h"
#include "PaymentCollectionSystem.PrinterDLL.h"
#include "WOOSIM_PRINTER_LIB.h"

namespace PrinterDLL
{
bool PrinterDLL::Close()
{
ClearSpool();

return true;
}
}

Oraz nagłówek biblioteki, z której korzystam ("WOOSIM_PRINTER_LIB.h"):



#define MSG_RECEIVE_CHECK    _T("WOOSIM_PRT_OK")

/****************************************************************************
CONST DEFINE
****************************************************************************/
//Message used in Protocol mode
#define FRAME_START 0xc0 // Frame Start
#define FRAME_END           0xc1 // Frame End
#define ACK 0x06 //
#define NACK 0x15 //
#define ENQ 0x05 //
#define DATA 0x44 //
#define STATUS_REQUEST 0x51 //Inquiry of printer status
#define STATUS_ANSWER 0x53 //Response of printer status
#define EOT 0x04 //
#define ETX 0x03 //
#define CAN 0x18 //
#define MSR_FAIL 0x4d //

#define INSERT_BYTE 0x7d // 0xc0,0xc1,0x7d case 0x7d insert.
#define XOR_BYTE            0x20 // after XOR


//Set buffer size
#define BUFF_SIZE 0x19000 // Buffer size
#define TEMP_BUFF_SIZE 0x19000 // Temporary buffer size
#define MSR_BUFF_SIZE 0x400 // MSR buffer size


// Return Message
//serial, Bluetooth
#define SUCCESS 1
#define ALREADY_OPENED -1
#define UNABLE_TO_OPEN_THE_PORT -2
#define UNABLE_TO_CONFIGURE_THE_SERIAL_PORT -3
#define UNABLE_TO_SET_THE_TIMEOUT_PARAMETERS -4
#define NO_RESPONSE_FROM_PRINTER -5

// WLAN
#undef SOCKET_ERROR
#define SOCKET_ERROR -1
#define CONNECT_FAIL -2
#define ALREADY_CONNECTED -3


#define NOT_OPEN_THE_PORT -11
#define BUFFER_OVERFLOW                         -12
#define OPERATOR_ERROR -13

//barcode type
#define UPCA 65
#define UPCE 66
#define EAN13 67
#define EAN8 68
#define CODE39 69
#define ITF 70
#define CODABAR 71
#define CODE93 72
#define CODE128 73

//printer width
#define _2INCH 384
#define _3INCH 576
#define _4INCH 832

/****************************************************************************
END
****************************************************************************/



/******************************************************************************************
IMPORT
******************************************************************************************/
extern "C" __declspec(dllimport) int InitPrinter(TCHAR *sPortName, int iBaudRate=57600,BOOL bProtocol=TRUE);
extern "C" __declspec(dllimport) int InitWlanPrinter(TCHAR *sIP_ADDR, int iPortNum, int iTimeout,BOOL bProtcol);
extern "C" __declspec(dllimport) BOOL ClosePrinter();
extern "C" __declspec(dllimport) int ControlCommand(BYTE *Cmds, int iLength);
extern "C" __declspec(dllimport) int SaveSpool(TCHAR *sData, int iFontValue=0, BOOL bEmphasis = FALSE);
extern "C" __declspec(dllimport) int PrintSpool(BOOL bDelete_Spool = TRUE);
extern "C" __declspec(dllimport) void ClearSpool();
extern "C" __declspec(dllimport) void CardRead(BOOL bTrack2 = TRUE);
extern "C" __declspec(dllimport) void CardCancel();
extern "C" __declspec(dllimport) int BmpSaveSpool(TCHAR* sBmpFilePath,int iXPosition, int iYPosition);
extern "C" __declspec(dllimport) int BarcodeSaveSpool(BYTE ucBarcodeType, BYTE ucBarWidth, BYTE ucBarHeight, BOOL HRI_On,
  TCHAR* BarcodeData, int iPrtWidth,int iPrtHeight,int iXPos);


P-137626
DejaVu
» 2015-09-18 16:31:54
To jest błąd linkera, który mówi, że linker nie widzi implementacji funkcji ClearSpool, która jest wywoływana przez metodę PrinterDLL::PrinterDLL::Close. Czytaj: prawdopodobnie nie dołączyłeś do projektu pliku *.lib w opcjach linkera.
P-137632
jawka7
Temat założony przez niniejszego użytkownika
» 2015-09-19 12:42:36
W linku poniżej przesyłam wszystkie ustawienia jakie wykonałem aby podpiąć biblioteczkę, jest również pokazana ścieżka do folderu z plikami:

http://postimg.org/image​/v5k1ljsqp/

Bardzo proszę o wskazanie co źle zrobiłem.
Czy opócz tych ustawień powinienem wykonać coś jeszcze?
W zakładce VC++ Directores ustawiłem Executable Directores oraz Include Directores ponieważ nie jestem pewien które jest poprawne, ustawiałem również każde z nich osobno ale niestety również nie działa.
Pliki .lib .h .dll wrzuciłem do jednego folderu aby nie było problemu ze ścieżkami (jak wspomniałem nie programuje na codzień w C++ i mogę coś pomylić)
Po pobraniu paczki zdziwiła mnie nazwa pliku .h, ta nazwa różni się od nazw plików .dll oraz .lib, czy to ma jakieś znaczenie?


P-137673
DejaVu
» 2015-09-19 22:52:54
Tak na szybkiego sprawdziłem, że wykonując podstawową konfigurację tej biblioteki faktycznie dostaje się linker error. No ale masz przecież w paczkach dostarczone projekty z przykładami. Na Windows Mobile piszesz W C++, że C++ tak męczysz?
P-137695
jawka7
Temat założony przez niniejszego użytkownika
» 2015-09-20 10:41:30
Piszę w C# ale biblioteki są skompilowane pod Win32. Przykłady podane w paczkach są w C# ale importują biblioteki C++ za pomocą atrybutu [ImportDLL] i są to przykłady tylko dla wersji desktopowych, niestety Windows Phone nie wspiera tej metody i trzeba troszkę pokombinować. Udało mi się zaimportowac biblioteki pobrane dla Windows 7 i kompilują się poprawnie jednak mimo wszystko chyba nic z tego, ponieważ problem kolejny polega na tym że architektura procesora, na który programuje jest ARM, a biblioteki są Win 32. Pzostaje napisać do producenta o udostępnienie odpowiedniej biblioteki albo pomyślec nad zmianą drukarki. Czy może jest jakieś inne rozwiązanie? Wiem że można napisać bezpośrednio driver komunikując się za pomocą bluetooth i wysyłając komunikaty. Chciałbym jednak tego uniknąć ponieważ wiem ile czasu zajmie rozszyfrowanie słabo rozpisanego manuala dostarczonego do tej wersji drukarki. Wszystko wskazuje na to że firma Woosim słabo wspiera programistów którzy chcą programować korzystając z ich sprzętu. Ogólnie celem jest jakkolwiek skomunikować się z drukarką Porti W40 firmy Woosim bezprzewodowo, wykorzystując Windows Phone.
P-137705
DejaVu
» 2015-09-20 16:03:20
Przecież masz tam sporo różnych wariantów sterownika - w tym na urządzenia mobilne.

(...)\Downloads\WinCE Woosim Library(Ver2.0.1.2)_Eng.zip\Dynamic Library\Window Mobile\C#\C#(WM)_Serial\Sample_Print_CSharp
P-137713
« 1 » 2
  Strona 1 z 2 Następna strona