2009-06-05 16 views
4

マイクロチップのPIC USB DLLをUnicodeで正しく動作させるのに時間を費やす人を助けるための声明です。Delphi 2009を使用してMicrochip PIC USB DLLを呼び出す方法

複数の文字列が必要ですが、これらは単純ですが、PAnsiCharですが、DLLの呼び出し規則の正しい組み合わせを取得するのは私の年齢です。このDLLにはDelphi(非Unicode)を使用し、殺人で逃げるネット上には多くの人がいます。

unit UArtPic32USBDriver; 

interface 

uses 
    Windows, 
    SysUtils, 
    UArtGeneralHwDefs; 


type 
    EArtPic32Usb = class(EArtGeneralHw); 

function Pic32Usb_GetDllVersion : integer; 
// Returns a number representing the DLL version. 

function Pic32Usb_GetDeviceCount(const AVendorProductID : string) : integer; 
// Returns the number of devices with this vendor ID 

function Pic32Usb_Open(
      AInstance : DWORD; 
      const AVendorProductID, AEndpointID : string; 
      ADirectionCode : integer; 
      ARaise   : boolean) : THANDLE; 
// Opens an endpoint. Can raise an exception if no valid handle is returned. 


procedure Pic32Usb_Close(AHandle : THandle); 
// Closes the device 

function Pic32Usb_Write(
      AHandle    : THANDLE; 
      ABufferPtr   : pointer; 
      ALengthBytes   : integer) : DWORD; 
// Performs a write using this handle. Returns the number of bytes written 

function Pic32Usb_Read(
      AHandle    : THANDLE; 
      ABufferPtr   : pointer; 
      ALengthBytes   : integer) : DWORD; 
// Performs a Read using this handle. Returns the number of bytes read 

const 
    MP_WRITE     = 0; 
    MP_READ     = 1; 

implementation 



var 

    _MPUSBGetDLLVersion : function() :DWORD; cdecl stdcall; 

    // Number of vid & pid matching USB Devices 
    _MPUSBGetDeviceCount : function(pVID_PID : PAnsiChar) : DWORD; cdecl; 

    _MPUSBOpen   : function (instance : DWORD; 
            pVID_PID : PAnsiChar; 
            pEP  : PAnsiChar; 
            dwDir  : DWORD; 
            dwReserved : DWORD) : THANDLE; cdecl; 

    _MPUSBClose   : function (handle :THANDLE) : DWORD; cdecl; 

    _MPUSBRead   : function ( handle   : THANDLE; 
             pData   : pointer; 
             dwLen   : DWORD; 
            var pLength   : DWORD; 
             dwMilliseconds : DWORD ) : DWORD; cdecl; 

    _MPUSBReadInt  : function ( handle   : THANDLE; 
            var pData   : pointer; 
             dwLen   : DWORD; 
            var pLength  : PDWORD; 
             dwMilliseconds : DWORD ) : DWORD; cdecl; 

    _MPUSBWrite   : function ( handle   : THANDLE; 
             pData   : pointer; 
             dwLen   : DWORD; 
            var pLength  : DWORD; 
             dwMilliseconds : DWORD) : DWORD; cdecl; 


    UsbDllHandle : THandle = 0; 

const 

    MillisecondPollingInterval = 100; //Represents 1 ms is hardware 
    CharBufSize = 64; 

type 
    TAnsiCharBuf64 = array[0..CharBufSize-1] of AnsiChar; 


function LoadDLL : THandle; 
var 
    S : string; 
begin 
    S := 'mpusbapi.dll'; 
    UsbDllHandle := LoadLibrary(PChar(S)); 

    If UsbDllHandle = 0 then 
    Raise EArtPic32Usb.CreateFmt(
     'The usb library is required but cannot be loaded. Check that it is installed. (%s)', 
     [S] 
     ); 

    @_MPUSBGetDLLVersion := GetProcAddress(UsbDllHandle,'_MPUSBGetDLLVersion'); 
    Assert(@_MPUSBGetDLLVersion <> nil); 

    @_MPUSBGetDeviceCount := GetProcAddress(UsbDllHandle,'_MPUSBGetDeviceCount'); 
    Assert(@_MPUSBGetDeviceCount <> nil); 

    @_MPUSBOpen := GetProcAddress(UsbDllHandle,'_MPUSBOpen'); 
    Assert(@_MPUSBOpen <> nil); 

    @_MPUSBClose := GetProcAddress(UsbDllHandle,'_MPUSBClose'); 
    Assert(@_MPUSBClose <> nil); 

    @_MPUSBRead := GetProcAddress(UsbDllHandle,'_MPUSBRead'); 
    Assert(@_MPUSBRead <> nil); 

    @_MPUSBReadInt := GetProcAddress(UsbDllHandle,'_MPUSBReadInt'); 
    Assert(@_MPUSBReadInt <> nil); 

    @_MPUSBWrite := GetProcAddress(UsbDllHandle,'_MPUSBWrite'); 
    Assert(@_MPUSBWrite <> nil); 

    Result := UsbDllHandle; 

end; 

procedure NeedDLL; 
begin 
    If UsbDllHandle = 0 then 
    LoadDll; 
end; 



function Pic32Usb_GetDllVersion : integer; 
// Returns a number representing the DLL version. 
begin 
    NeedDLL; 
    Result := _MPUSBGetDLLVersion(); 
end; 


function Pic32Usb_GetDeviceCount(const AVendorProductID : string) : integer; 
// Returns the number of devices with this vendor ID 
var 
    bufVendorProductID : TAnsiCharBuf64; 
begin 
    NeedDLL; 

    StrPCopy(bufVendorProductID, AnsiString(AVendorProductID)); 

    Result := _MPUSBGetDeviceCount(@bufVendorProductID); 
end; 


function Pic32Usb_Open(
      AInstance : DWORD; 
      const AVendorProductID, AEndpointID : string; 
      ADirectionCode : integer; 
      ARaise : boolean) : THANDLE; 
// Opens an endpoint. Can raise an exception if no valid handle is returned. 
var 
    bufVendorProductID, bufEndpointID : TAnsiCharBuf64; 
begin 
    NeedDLL; 

    StrPCopy(bufVendorProductID, AnsiString(AVendorProductID)); 
    StrPCopy(bufEndpointID, AnsiString(AEndpointID)); 

    Result := _MPUSBOpen(
    AInstance, 
    @bufVendorProductID, 
    @bufEndpointID, 
    DWORD(ADirectionCode), 
    0); 

    if Result = 0 then 
    If ARaise then 
     Raise EArtPic32Usb.CreateFmt(
     'Unable to open USB device "%s", endpoint "%s"', [AVendorProductID, AEndpointID]); 
end; 


procedure Pic32Usb_Close(AHandle : THandle); 
begin 
    If UsbDllHandle <> 0 then 
    _MPUSBClose(AHandle); 
end; 


function Pic32Usb_Write(
      AHandle    : THANDLE; 
      ABufferPtr   : pointer; 
      ALengthBytes   : integer) : DWORD; 
// Performs a write using this handle. Returns the number of bytes written 
var 
    I : integer; 
begin 
    I := _MPUSBWrite(
    AHandle, 
    ABufferPtr, 
    DWORD(ALengthBytes), 
    Result, 
    MillisecondPollingInterval); 
    if I <> 1 then 
    Raise EArtPic32Usb.CreateFmt('Error performing USB write', []); 
end; 


function Pic32Usb_Read(
      AHandle    : THANDLE; 
      ABufferPtr   : pointer; 
      ALengthBytes   : integer) : DWORD; 
// Performs a Read using this handle. Returns the number of bytes read 
var 
    I : integer; 
begin 
    I := _MPUSBRead(
    AHandle, 
    ABufferPtr, 
    DWORD(ALengthBytes), 
    Result, 
    MillisecondPollingInterval); 
    if I <> 1 then 
    Raise EArtPic32Usb.CreateFmt('Error performing USB read', []); 
end; 



initialization 
finalization 
    If UsbDllHandle <> 0 then 
    FreeLibrary(UsbDllHandle) 
end. 
+6

hm ...厳密に言うと、これは問題ではありません。私はそれを閉じるのが理にかなっているとは思わないが、おそらくあなたは共通のことをして、実際に答えの部分を編集するべきである。次に、それをアクチュアルアンサーとして掲示し、それを受け入れます。 – unwind

答えて

1

私は一時的な回答としてこれを投稿します。 @Brian Frostは完全なコードを投稿できます。 ストーリーの要点は、期待しているドライバを扱うときに、1バイトのANSI文字列を使用することです。

StrPCopy(bufVendorProductID, AnsiString(AVendorProductID)); 
関連する問題