Use A DLL File which contains API???

Hi
I have a DLL file, say MyLib.dll, which contains some API commands and functions.
But I know in this library, there are some functions such as Func1,Func2 and etc.
Also, I have the API representation ( or C++ defination) of these functions such as follows:

pdtErr Func1
(
pdtHandle Handle
);

or
pdtErr Func2
(
PdtHandle Handle,
PdtCaptureMode* pMode
);

Note that, I have also the C++ header file of it (MyLib.h) and the library format file (MyLib.Lib), but I want to use this DLL file in Delphi.
Could you please tell me how I can do this work?
Thanks

Comments

  • : Hi
    : I have a DLL file, say MyLib.dll, which contains some API commands and functions.
    : But I know in this library, there are some functions such as Func1,Func2 and etc.
    : Also, I have the API representation ( or C++ defination) of these functions such as follows:
    :
    : pdtErr Func1
    : (
    : pdtHandle Handle
    : );
    :
    : or
    : pdtErr Func2
    : (
    : PdtHandle Handle,
    : PdtCaptureMode* pMode
    : );
    :
    : Note that, I have also the C++ header file of it (MyLib.h) and the library format file (MyLib.Lib), but I want to use this DLL file in Delphi.
    : Could you please tell me how I can do this work?
    : Thanks
    :
    In your program, you need to reproduce the function headers, and all the associating types:
    [code]
    type
    pdtErr = SomeTypeDefinition;
    PdtCaptureMode = SomeTypeDefinition;

    function Func1(Handle: THandle): pdtErr; cdecl; external 'MyLib.dll';
    function Func2(Handle: THandle; pMode: PdtCaptureMode): pdtErr; cdecl; external 'MyLib.dll';
    [/code]
    Now you can use those functions as if they are written in your program.
    Note: The cdecl directive makes sure that Delphi treats them as C functions instead of Pascal functions. Often it is better to use the StdCall in both the program as well as the library.
    Also this code will not unless you define those two types based on the header of the library, but it should get you started.
  • : : Hi
    : : I have a DLL file, say MyLib.dll, which contains some API commands and functions.
    : : But I know in this library, there are some functions such as Func1,Func2 and etc.
    : : Also, I have the API representation ( or C++ defination) of these functions such as follows:
    : :
    : : pdtErr Func1
    : : (
    : : pdtHandle Handle
    : : );
    : :
    : : or
    : : pdtErr Func2
    : : (
    : : PdtHandle Handle,
    : : PdtCaptureMode* pMode
    : : );
    : :
    : : Note that, I have also the C++ header file of it (MyLib.h) and the library format file (MyLib.Lib), but I want to use this DLL file in Delphi.
    : : Could you please tell me how I can do this work?
    : : Thanks
    : :
    : In your program, you need to reproduce the function headers, and all the associating types:
    : [code]
    : type
    : pdtErr = SomeTypeDefinition;
    : PdtCaptureMode = SomeTypeDefinition;
    :
    : function Func1(Handle: THandle): pdtErr; cdecl; external 'MyLib.dll';
    : function Func2(Handle: THandle; pMode: PdtCaptureMode): pdtErr; cdecl; external 'MyLib.dll';
    : [/code]
    : Now you can use those functions as if they are written in your program.
    : Note: The cdecl directive makes sure that Delphi treats them as C functions instead of Pascal functions. Often it is better to use the StdCall in both the program as well as the library.
    : Also this code will not unless you define those two types based on the header of the library, but it should get you started.
    :

    Thanks. But in the C header file(MyLib.h) there are many types such as the two cases below:
    //---------------------------------------------------------------------
    typedef enum
    {
    errSuccess = 0,
    errBadParameter = 1,
    errBadHandle = 2,
    __err_force_32 = 0xFFFFFFFF

    } PdtErr;

    /----------------------------------------------------------------------
    typedef struct
    {
    //----- In -----

    void* Buffer;
    unsigned long BufferSize;
    void* Context[4];
    unsigned long _reserved1[8];

    PdtErr Status;

    unsigned long _reserved2[30];

    } PdtFrame;
    //---------------------------------------------------------------------

    Now,Could you please tell me, how I can define these types in Delphi?
    And the next question is: Is there any easier way to do this works? (This way is very complicated as the header file is too big!!!)
    (This Library is written for acquiring images from a digital camera. I want to send it for you. So, Please send me your email)

    Thanks
  • : : : Hi
    : : : I have a DLL file, say MyLib.dll, which contains some API commands and functions.
    : : : But I know in this library, there are some functions such as Func1,Func2 and etc.
    : : : Also, I have the API representation ( or C++ defination) of these functions such as follows:
    : : :
    : : : pdtErr Func1
    : : : (
    : : : pdtHandle Handle
    : : : );
    : : :
    : : : or
    : : : pdtErr Func2
    : : : (
    : : : PdtHandle Handle,
    : : : PdtCaptureMode* pMode
    : : : );
    : : :
    : : : Note that, I have also the C++ header file of it (MyLib.h) and the library format file (MyLib.Lib), but I want to use this DLL file in Delphi.
    : : : Could you please tell me how I can do this work?
    : : : Thanks
    : : :
    : : In your program, you need to reproduce the function headers, and all the associating types:
    : : [code]
    : : type
    : : pdtErr = SomeTypeDefinition;
    : : PdtCaptureMode = SomeTypeDefinition;
    : :
    : : function Func1(Handle: THandle): pdtErr; cdecl; external 'MyLib.dll';
    : : function Func2(Handle: THandle; pMode: PdtCaptureMode): pdtErr; cdecl; external 'MyLib.dll';
    : : [/code]
    : : Now you can use those functions as if they are written in your program.
    : : Note: The cdecl directive makes sure that Delphi treats them as C functions instead of Pascal functions. Often it is better to use the StdCall in both the program as well as the library.
    : : Also this code will not unless you define those two types based on the header of the library, but it should get you started.
    : :
    :
    : Thanks. But in the C header file(MyLib.h) there are many types such as the two cases below:
    : //---------------------------------------------------------------------
    : typedef enum
    : {
    : errSuccess = 0,
    : errBadParameter = 1,
    : errBadHandle = 2,
    : __err_force_32 = 0xFFFFFFFF
    :
    : } PdtErr;
    :
    : /----------------------------------------------------------------------
    : typedef struct
    : {
    : //----- In -----
    :
    : void* Buffer;
    : unsigned long BufferSize;
    : void* Context[4];
    : unsigned long _reserved1[8];
    :
    : PdtErr Status;
    :
    : unsigned long _reserved2[30];
    :
    : } PdtFrame;
    : //---------------------------------------------------------------------
    :
    : Now,Could you please tell me, how I can define these types in Delphi?
    : And the next question is: Is there any easier way to do this works? (This way is very complicated as the header file is too big!!!)
    : (This Library is written for acquiring images from a digital camera. I want to send it for you. So, Please send me your email)
    :
    : Thanks
    :
    Here are two ways of defining the pdtErr:
    [code]
    type
    PdtErr = (errSuccess, errBadParameter, errBadHandle);

    // or

    type
    PdtErr = type cardinal;

    const
    errSuccess = 0;
    errBadParameter = 1;
    errBadHandle = 2;
    errForce32 = $FFFFFFFF;
    [/code]
    I would suggest the second method, because the first one cannot handle the _err_force_32 value.
    [code]
    type
    PdtFrame = record
    Buffer: pointer; (void*)
    BufferSize: cardinal; (unsigned long)
    Context: array[0..3] of pointer;
    reserved1: array[0..7] of cardinal;
    Status: PdtErr;
    reserved2: array[0..29] of cardinal;
    end;
    [/code]
    I cannot make the time to completely convert the header file. But based on this you might already convert some things yourself.
  • : : : : Hi
    : : : : I have a DLL file, say MyLib.dll, which contains some API commands and functions.
    : : : : But I know in this library, there are some functions such as Func1,Func2 and etc.
    : : : : Also, I have the API representation ( or C++ defination) of these functions such as follows:
    : : : :
    : : : : pdtErr Func1
    : : : : (
    : : : : pdtHandle Handle
    : : : : );
    : : : :
    : : : : or
    : : : : pdtErr Func2
    : : : : (
    : : : : PdtHandle Handle,
    : : : : PdtCaptureMode* pMode
    : : : : );
    : : : :
    : : : : Note that, I have also the C++ header file of it (MyLib.h) and the library format file (MyLib.Lib), but I want to use this DLL file in Delphi.
    : : : : Could you please tell me how I can do this work?
    : : : : Thanks
    : : : :
    : : : In your program, you need to reproduce the function headers, and all the associating types:
    : : : [code]
    : : : type
    : : : pdtErr = SomeTypeDefinition;
    : : : PdtCaptureMode = SomeTypeDefinition;
    : : :
    : : : function Func1(Handle: THandle): pdtErr; cdecl; external 'MyLib.dll';
    : : : function Func2(Handle: THandle; pMode: PdtCaptureMode): pdtErr; cdecl; external 'MyLib.dll';
    : : : [/code]
    : : : Now you can use those functions as if they are written in your program.
    : : : Note: The cdecl directive makes sure that Delphi treats them as C functions instead of Pascal functions. Often it is better to use the StdCall in both the program as well as the library.
    : : : Also this code will not unless you define those two types based on the header of the library, but it should get you started.
    : : :
    : :
    : : Thanks. But in the C header file(MyLib.h) there are many types such as the two cases below:
    : : //---------------------------------------------------------------------
    : : typedef enum
    : : {
    : : errSuccess = 0,
    : : errBadParameter = 1,
    : : errBadHandle = 2,
    : : __err_force_32 = 0xFFFFFFFF
    : :
    : : } PdtErr;
    : :
    : : /----------------------------------------------------------------------
    : : typedef struct
    : : {
    : : //----- In -----
    : :
    : : void* Buffer;
    : : unsigned long BufferSize;
    : : void* Context[4];
    : : unsigned long _reserved1[8];
    : :
    : : PdtErr Status;
    : :
    : : unsigned long _reserved2[30];
    : :
    : : } PdtFrame;
    : : //---------------------------------------------------------------------
    : :
    : : Now,Could you please tell me, how I can define these types in Delphi?
    : : And the next question is: Is there any easier way to do this works? (This way is very complicated as the header file is too big!!!)
    : : (This Library is written for acquiring images from a digital camera. I want to send it for you. So, Please send me your email)
    : :
    : : Thanks
    : :
    : Here are two ways of defining the pdtErr:
    : [code]
    : type
    : PdtErr = (errSuccess, errBadParameter, errBadHandle);
    :
    : // or
    :
    : type
    : PdtErr = type cardinal;
    :
    : const
    : errSuccess = 0;
    : errBadParameter = 1;
    : errBadHandle = 2;
    : errForce32 = $FFFFFFFF;
    : [/code]
    : I would suggest the second method, because the first one cannot handle the _err_force_32 value.
    : [code]
    : type
    : PdtFrame = record
    : Buffer: pointer; (void*)
    : BufferSize: cardinal; (unsigned long)
    : Context: array[0..3] of pointer;
    : reserved1: array[0..7] of cardinal;
    : Status: PdtErr;
    : reserved2: array[0..29] of cardinal;
    : end;
    : [/code]
    : I cannot make the time to completely convert the header file. But based on this you might already convert some things yourself.
    :
    Thanks.
    The First Try:

    In the MyLib.dll, there is a function as follows:
    [code]
    unsigned long PdListCameras
    (
    PdtCamListItem* Plist,
    unsigned long ListLength,
    unsigned long* pConnectedNum

    );
    [/code]
    This function lists cameras using Camera driver on my system.
    The parameters of this function are described bellow:

    plist: Array of PdtCamListItem;
    ListLength:Length of plist array
    pConnectedNum:Number of cameras found.Maybe greater than listLength. NULL pointer is allowed.


    Also,The defination of PdtCamListItem exists in the C header file (MyLib.h):
    [code]
    typedef struct
    {
    unsigned long UniqueId;
    char SerialString[32];
    unsigned short PartNumber;
    unsigned short PartVersion;
    unsigned long InUse;
    } PdtCamListItem;
    [/code]
    Here, there is an example in C++ which uses this function:
    [code]
    PdtCamListItem list[10];
    unsigned long numCameras;

    numCameras=PdListCameras(list,10,NULL);
    [/code]
    I tried to translate the above code into Delphi such as follows:
    [code]
    type
    pdtCamListItem=record
    UniqueId:LongInt;
    SerialString:array[0..20] of char;
    PartNumber:word;
    PartVersion:word;
    InUse:Cardinal;
    end;

    implementation

    {$R *.dfm}
    function PdListCameras(var pList:pdtCamListItem;ListLength:cardinal;var PConnectedNum:cardinal):cardinal; cdecl; external 'MyLib.dll';

    procedure TForm1.Button1Click(Sender: TObject);
    var item: pdtCamListItem;
    s:cardinal;
    begin
    s:=PdListCameras(item,10,NULL);
    end;
    [/code]
    But the mentioned code rises this exception:
    "Access Violation at address 0012F598"
    Now, whats the wrong?

  • : : : : : Hi
    : : : : : I have a DLL file, say MyLib.dll, which contains some API commands and functions.
    : : : : : But I know in this library, there are some functions such as Func1,Func2 and etc.
    : : : : : Also, I have the API representation ( or C++ defination) of these functions such as follows:
    : : : : :
    : : : : : pdtErr Func1
    : : : : : (
    : : : : : pdtHandle Handle
    : : : : : );
    : : : : :
    : : : : : or
    : : : : : pdtErr Func2
    : : : : : (
    : : : : : PdtHandle Handle,
    : : : : : PdtCaptureMode* pMode
    : : : : : );
    : : : : :
    : : : : : Note that, I have also the C++ header file of it (MyLib.h) and the library format file (MyLib.Lib), but I want to use this DLL file in Delphi.
    : : : : : Could you please tell me how I can do this work?
    : : : : : Thanks
    : : : : :
    : : : : In your program, you need to reproduce the function headers, and all the associating types:
    : : : : [code]
    : : : : type
    : : : : pdtErr = SomeTypeDefinition;
    : : : : PdtCaptureMode = SomeTypeDefinition;
    : : : :
    : : : : function Func1(Handle: THandle): pdtErr; cdecl; external 'MyLib.dll';
    : : : : function Func2(Handle: THandle; pMode: PdtCaptureMode): pdtErr; cdecl; external 'MyLib.dll';
    : : : : [/code]
    : : : : Now you can use those functions as if they are written in your program.
    : : : : Note: The cdecl directive makes sure that Delphi treats them as C functions instead of Pascal functions. Often it is better to use the StdCall in both the program as well as the library.
    : : : : Also this code will not unless you define those two types based on the header of the library, but it should get you started.
    : : : :
    : : :
    : : : Thanks. But in the C header file(MyLib.h) there are many types such as the two cases below:
    : : : //---------------------------------------------------------------------
    : : : typedef enum
    : : : {
    : : : errSuccess = 0,
    : : : errBadParameter = 1,
    : : : errBadHandle = 2,
    : : : __err_force_32 = 0xFFFFFFFF
    : : :
    : : : } PdtErr;
    : : :
    : : : /----------------------------------------------------------------------
    : : : typedef struct
    : : : {
    : : : //----- In -----
    : : :
    : : : void* Buffer;
    : : : unsigned long BufferSize;
    : : : void* Context[4];
    : : : unsigned long _reserved1[8];
    : : :
    : : : PdtErr Status;
    : : :
    : : : unsigned long _reserved2[30];
    : : :
    : : : } PdtFrame;
    : : : //---------------------------------------------------------------------
    : : :
    : : : Now,Could you please tell me, how I can define these types in Delphi?
    : : : And the next question is: Is there any easier way to do this works? (This way is very complicated as the header file is too big!!!)
    : : : (This Library is written for acquiring images from a digital camera. I want to send it for you. So, Please send me your email)
    : : :
    : : : Thanks
    : : :
    : : Here are two ways of defining the pdtErr:
    : : [code]
    : : type
    : : PdtErr = (errSuccess, errBadParameter, errBadHandle);
    : :
    : : // or
    : :
    : : type
    : : PdtErr = type cardinal;
    : :
    : : const
    : : errSuccess = 0;
    : : errBadParameter = 1;
    : : errBadHandle = 2;
    : : errForce32 = $FFFFFFFF;
    : : [/code]
    : : I would suggest the second method, because the first one cannot handle the _err_force_32 value.
    : : [code]
    : : type
    : : PdtFrame = record
    : : Buffer: pointer; (void*)
    : : BufferSize: cardinal; (unsigned long)
    : : Context: array[0..3] of pointer;
    : : reserved1: array[0..7] of cardinal;
    : : Status: PdtErr;
    : : reserved2: array[0..29] of cardinal;
    : : end;
    : : [/code]
    : : I cannot make the time to completely convert the header file. But based on this you might already convert some things yourself.
    : :
    : Thanks.
    : The First Try:
    :
    : In the MyLib.dll, there is a function as follows:
    : [code]
    : unsigned long PdListCameras
    : (
    : PdtCamListItem* Plist,
    : unsigned long ListLength,
    : unsigned long* pConnectedNum
    :
    : );
    : [/code]
    : This function lists cameras using Camera driver on my system.
    : The parameters of this function are described bellow:
    :
    : plist: Array of PdtCamListItem;
    : ListLength:Length of plist array
    : pConnectedNum:Number of cameras found.Maybe greater than listLength. NULL pointer is allowed.
    :
    :
    : Also,The defination of PdtCamListItem exists in the C header file (MyLib.h):
    : [code]
    : typedef struct
    : {
    : unsigned long UniqueId;
    : char SerialString[32];
    : unsigned short PartNumber;
    : unsigned short PartVersion;
    : unsigned long InUse;
    : } PdtCamListItem;
    : [/code]
    : Here, there is an example in C++ which uses this function:
    : [code]
    : PdtCamListItem list[10];
    : unsigned long numCameras;
    :
    : numCameras=PdListCameras(list,10,NULL);
    : [/code]
    : I tried to translate the above code into Delphi such as follows:
    : [code]
    : type
    : pdtCamListItem=record
    : UniqueId:LongInt;
    : SerialString:array[0..20] of char;
    : PartNumber:word;
    : PartVersion:word;
    : InUse:Cardinal;
    : end;
    :
    : implementation
    :
    : {$R *.dfm}
    : function PdListCameras(var pList:pdtCamListItem;ListLength:cardinal;var PConnectedNum:cardinal):cardinal; cdecl; external 'MyLib.dll';
    :
    : procedure TForm1.Button1Click(Sender: TObject);
    : var item: pdtCamListItem;
    : s:cardinal;
    : begin
    : s:=PdListCameras(item,10,NULL);
    : end;
    : [/code]
    : But the mentioned code rises this exception:
    : "Access Violation at address 0012F598"
    : Now, whats the wrong?
    :
    :
    Well, SerialString has 32 elements in the C++ code, while it only has 21 elements in the Delphi code. A description of an array declaration in Delphi is this:
    [code]
    ArrayVariableName: array[LowestIndex..HighestIndex] of VariableType
    [/code]
    UniqueID is described as a unsigned long in the C++ code, while Delphi's LontInt is a "signed long".
    As for the actual call: item is only 1 element in a list. The C++ call example used an 10-element array of items. C++ NULL is in Delphi "nil".
  • : : : : : : Hi
    : : : : : : I have a DLL file, say MyLib.dll, which contains some API commands and functions.
    : : : : : : But I know in this library, there are some functions such as Func1,Func2 and etc.
    : : : : : : Also, I have the API representation ( or C++ defination) of these functions such as follows:
    : : : : : :
    : : : : : : pdtErr Func1
    : : : : : : (
    : : : : : : pdtHandle Handle
    : : : : : : );
    : : : : : :
    : : : : : : or
    : : : : : : pdtErr Func2
    : : : : : : (
    : : : : : : PdtHandle Handle,
    : : : : : : PdtCaptureMode* pMode
    : : : : : : );
    : : : : : :
    : : : : : : Note that, I have also the C++ header file of it (MyLib.h) and the library format file (MyLib.Lib), but I want to use this DLL file in Delphi.
    : : : : : : Could you please tell me how I can do this work?
    : : : : : : Thanks
    : : : : : :
    : : : : : In your program, you need to reproduce the function headers, and all the associating types:
    : : : : : [code]
    : : : : : type
    : : : : : pdtErr = SomeTypeDefinition;
    : : : : : PdtCaptureMode = SomeTypeDefinition;
    : : : : :
    : : : : : function Func1(Handle: THandle): pdtErr; cdecl; external 'MyLib.dll';
    : : : : : function Func2(Handle: THandle; pMode: PdtCaptureMode): pdtErr; cdecl; external 'MyLib.dll';
    : : : : : [/code]
    : : : : : Now you can use those functions as if they are written in your program.
    : : : : : Note: The cdecl directive makes sure that Delphi treats them as C functions instead of Pascal functions. Often it is better to use the StdCall in both the program as well as the library.
    : : : : : Also this code will not unless you define those two types based on the header of the library, but it should get you started.
    : : : : :
    : : : :
    : : : : Thanks. But in the C header file(MyLib.h) there are many types such as the two cases below:
    : : : : //---------------------------------------------------------------------
    : : : : typedef enum
    : : : : {
    : : : : errSuccess = 0,
    : : : : errBadParameter = 1,
    : : : : errBadHandle = 2,
    : : : : __err_force_32 = 0xFFFFFFFF
    : : : :
    : : : : } PdtErr;
    : : : :
    : : : : /----------------------------------------------------------------------
    : : : : typedef struct
    : : : : {
    : : : : //----- In -----
    : : : :
    : : : : void* Buffer;
    : : : : unsigned long BufferSize;
    : : : : void* Context[4];
    : : : : unsigned long _reserved1[8];
    : : : :
    : : : : PdtErr Status;
    : : : :
    : : : : unsigned long _reserved2[30];
    : : : :
    : : : : } PdtFrame;
    : : : : //---------------------------------------------------------------------
    : : : :
    : : : : Now,Could you please tell me, how I can define these types in Delphi?
    : : : : And the next question is: Is there any easier way to do this works? (This way is very complicated as the header file is too big!!!)
    : : : : (This Library is written for acquiring images from a digital camera. I want to send it for you. So, Please send me your email)
    : : : :
    : : : : Thanks
    : : : :
    : : : Here are two ways of defining the pdtErr:
    : : : [code]
    : : : type
    : : : PdtErr = (errSuccess, errBadParameter, errBadHandle);
    : : :
    : : : // or
    : : :
    : : : type
    : : : PdtErr = type cardinal;
    : : :
    : : : const
    : : : errSuccess = 0;
    : : : errBadParameter = 1;
    : : : errBadHandle = 2;
    : : : errForce32 = $FFFFFFFF;
    : : : [/code]
    : : : I would suggest the second method, because the first one cannot handle the _err_force_32 value.
    : : : [code]
    : : : type
    : : : PdtFrame = record
    : : : Buffer: pointer; (void*)
    : : : BufferSize: cardinal; (unsigned long)
    : : : Context: array[0..3] of pointer;
    : : : reserved1: array[0..7] of cardinal;
    : : : Status: PdtErr;
    : : : reserved2: array[0..29] of cardinal;
    : : : end;
    : : : [/code]
    : : : I cannot make the time to completely convert the header file. But based on this you might already convert some things yourself.
    : : :
    : : Thanks.
    : : The First Try:
    : :
    : : In the MyLib.dll, there is a function as follows:
    : : [code]
    : : unsigned long PdListCameras
    : : (
    : : PdtCamListItem* Plist,
    : : unsigned long ListLength,
    : : unsigned long* pConnectedNum
    : :
    : : );
    : : [/code]
    : : This function lists cameras using Camera driver on my system.
    : : The parameters of this function are described bellow:
    : :
    : : plist: Array of PdtCamListItem;
    : : ListLength:Length of plist array
    : : pConnectedNum:Number of cameras found.Maybe greater than listLength. NULL pointer is allowed.
    : :
    : :
    : : Also,The defination of PdtCamListItem exists in the C header file (MyLib.h):
    : : [code]
    : : typedef struct
    : : {
    : : unsigned long UniqueId;
    : : char SerialString[32];
    : : unsigned short PartNumber;
    : : unsigned short PartVersion;
    : : unsigned long InUse;
    : : } PdtCamListItem;
    : : [/code]
    : : Here, there is an example in C++ which uses this function:
    : : [code]
    : : PdtCamListItem list[10];
    : : unsigned long numCameras;
    : :
    : : numCameras=PdListCameras(list,10,NULL);
    : : [/code]
    : : I tried to translate the above code into Delphi such as follows:
    : : [code]
    : : type
    : : pdtCamListItem=record
    : : UniqueId:LongInt;
    : : SerialString:array[0..20] of char;
    : : PartNumber:word;
    : : PartVersion:word;
    : : InUse:Cardinal;
    : : end;
    : :
    : : implementation
    : :
    : : {$R *.dfm}
    : : function PdListCameras(var pList:pdtCamListItem;ListLength:cardinal;var PConnectedNum:cardinal):cardinal; cdecl; external 'MyLib.dll';
    : :
    : : procedure TForm1.Button1Click(Sender: TObject);
    : : var item: pdtCamListItem;
    : : s:cardinal;
    : : begin
    : : s:=PdListCameras(item,10,NULL);
    : : end;
    : : [/code]
    : : But the mentioned code rises this exception:
    : : "Access Violation at address 0012F598"
    : : Now, whats the wrong?
    : :
    : :
    : Well, SerialString has 32 elements in the C++ code, while it only has 21 elements in the Delphi code. A description of an array declaration in Delphi is this:
    : [code]
    : ArrayVariableName: array[LowestIndex..HighestIndex] of VariableType
    : [/code]
    : UniqueID is described as a unsigned long in the C++ code, while Delphi's LontInt is a "signed long".
    : As for the actual call: item is only 1 element in a list. The C++ call example used an 10-element array of items. C++ NULL is in Delphi "nil".
    :
    Excuse Me, But the problem is still remained!!!

    The New Code:
    [code]
    type
    pdtCamListItem=record
    UniqueId:Cardinal;
    SerialString:array[0..32] of char;
    PartNumber:word;
    PartVersion:word;
    InUse:Cardinal;
    end;

    implementation

    {$R *.dfm}
    function PdListCameras(var pList:array of pdtCamListItem;ListLength:cardinal;var PConnectedNum:cardinal):cardinal; cdecl; external 'MyLib.dll';

    procedure TForm1.Button1Click(Sender: TObject);
    var item:array [0..10] of pdtCamListItem;
    w,s:Cardinal;
    begin
    s:=PdListCameras(item,10,w);
    end;
    [/code]

    When I run this code, I get the following error:
    [code]
    Access Viloation at address 10003DB0 in module 'Mylib.dll'
    [/code]

    Now, what is the problem?!!!!
  • : : : : : : : Hi
    : : : : : : : I have a DLL file, say MyLib.dll, which contains some API commands and functions.
    : : : : : : : But I know in this library, there are some functions such as Func1,Func2 and etc.
    : : : : : : : Also, I have the API representation ( or C++ defination) of these functions such as follows:
    : : : : : : :
    : : : : : : : pdtErr Func1
    : : : : : : : (
    : : : : : : : pdtHandle Handle
    : : : : : : : );
    : : : : : : :
    : : : : : : : or
    : : : : : : : pdtErr Func2
    : : : : : : : (
    : : : : : : : PdtHandle Handle,
    : : : : : : : PdtCaptureMode* pMode
    : : : : : : : );
    : : : : : : :
    : : : : : : : Note that, I have also the C++ header file of it (MyLib.h) and the library format file (MyLib.Lib), but I want to use this DLL file in Delphi.
    : : : : : : : Could you please tell me how I can do this work?
    : : : : : : : Thanks
    : : : : : : :
    : : : : : : In your program, you need to reproduce the function headers, and all the associating types:
    : : : : : : [code]
    : : : : : : type
    : : : : : : pdtErr = SomeTypeDefinition;
    : : : : : : PdtCaptureMode = SomeTypeDefinition;
    : : : : : :
    : : : : : : function Func1(Handle: THandle): pdtErr; cdecl; external 'MyLib.dll';
    : : : : : : function Func2(Handle: THandle; pMode: PdtCaptureMode): pdtErr; cdecl; external 'MyLib.dll';
    : : : : : : [/code]
    : : : : : : Now you can use those functions as if they are written in your program.
    : : : : : : Note: The cdecl directive makes sure that Delphi treats them as C functions instead of Pascal functions. Often it is better to use the StdCall in both the program as well as the library.
    : : : : : : Also this code will not unless you define those two types based on the header of the library, but it should get you started.
    : : : : : :
    : : : : :
    : : : : : Thanks. But in the C header file(MyLib.h) there are many types such as the two cases below:
    : : : : : //---------------------------------------------------------------------
    : : : : : typedef enum
    : : : : : {
    : : : : : errSuccess = 0,
    : : : : : errBadParameter = 1,
    : : : : : errBadHandle = 2,
    : : : : : __err_force_32 = 0xFFFFFFFF
    : : : : :
    : : : : : } PdtErr;
    : : : : :
    : : : : : /----------------------------------------------------------------------
    : : : : : typedef struct
    : : : : : {
    : : : : : //----- In -----
    : : : : :
    : : : : : void* Buffer;
    : : : : : unsigned long BufferSize;
    : : : : : void* Context[4];
    : : : : : unsigned long _reserved1[8];
    : : : : :
    : : : : : PdtErr Status;
    : : : : :
    : : : : : unsigned long _reserved2[30];
    : : : : :
    : : : : : } PdtFrame;
    : : : : : //---------------------------------------------------------------------
    : : : : :
    : : : : : Now,Could you please tell me, how I can define these types in Delphi?
    : : : : : And the next question is: Is there any easier way to do this works? (This way is very complicated as the header file is too big!!!)
    : : : : : (This Library is written for acquiring images from a digital camera. I want to send it for you. So, Please send me your email)
    : : : : :
    : : : : : Thanks
    : : : : :
    : : : : Here are two ways of defining the pdtErr:
    : : : : [code]
    : : : : type
    : : : : PdtErr = (errSuccess, errBadParameter, errBadHandle);
    : : : :
    : : : : // or
    : : : :
    : : : : type
    : : : : PdtErr = type cardinal;
    : : : :
    : : : : const
    : : : : errSuccess = 0;
    : : : : errBadParameter = 1;
    : : : : errBadHandle = 2;
    : : : : errForce32 = $FFFFFFFF;
    : : : : [/code]
    : : : : I would suggest the second method, because the first one cannot handle the _err_force_32 value.
    : : : : [code]
    : : : : type
    : : : : PdtFrame = record
    : : : : Buffer: pointer; (void*)
    : : : : BufferSize: cardinal; (unsigned long)
    : : : : Context: array[0..3] of pointer;
    : : : : reserved1: array[0..7] of cardinal;
    : : : : Status: PdtErr;
    : : : : reserved2: array[0..29] of cardinal;
    : : : : end;
    : : : : [/code]
    : : : : I cannot make the time to completely convert the header file. But based on this you might already convert some things yourself.
    : : : :
    : : : Thanks.
    : : : The First Try:
    : : :
    : : : In the MyLib.dll, there is a function as follows:
    : : : [code]
    : : : unsigned long PdListCameras
    : : : (
    : : : PdtCamListItem* Plist,
    : : : unsigned long ListLength,
    : : : unsigned long* pConnectedNum
    : : :
    : : : );
    : : : [/code]
    : : : This function lists cameras using Camera driver on my system.
    : : : The parameters of this function are described bellow:
    : : :
    : : : plist: Array of PdtCamListItem;
    : : : ListLength:Length of plist array
    : : : pConnectedNum:Number of cameras found.Maybe greater than listLength. NULL pointer is allowed.
    : : :
    : : :
    : : : Also,The defination of PdtCamListItem exists in the C header file (MyLib.h):
    : : : [code]
    : : : typedef struct
    : : : {
    : : : unsigned long UniqueId;
    : : : char SerialString[32];
    : : : unsigned short PartNumber;
    : : : unsigned short PartVersion;
    : : : unsigned long InUse;
    : : : } PdtCamListItem;
    : : : [/code]
    : : : Here, there is an example in C++ which uses this function:
    : : : [code]
    : : : PdtCamListItem list[10];
    : : : unsigned long numCameras;
    : : :
    : : : numCameras=PdListCameras(list,10,NULL);
    : : : [/code]
    : : : I tried to translate the above code into Delphi such as follows:
    : : : [code]
    : : : type
    : : : pdtCamListItem=record
    : : : UniqueId:LongInt;
    : : : SerialString:array[0..20] of char;
    : : : PartNumber:word;
    : : : PartVersion:word;
    : : : InUse:Cardinal;
    : : : end;
    : : :
    : : : implementation
    : : :
    : : : {$R *.dfm}
    : : : function PdListCameras(var pList:pdtCamListItem;ListLength:cardinal;var PConnectedNum:cardinal):cardinal; cdecl; external 'MyLib.dll';
    : : :
    : : : procedure TForm1.Button1Click(Sender: TObject);
    : : : var item: pdtCamListItem;
    : : : s:cardinal;
    : : : begin
    : : : s:=PdListCameras(item,10,NULL);
    : : : end;
    : : : [/code]
    : : : But the mentioned code rises this exception:
    : : : "Access Violation at address 0012F598"
    : : : Now, whats the wrong?
    : : :
    : : :
    : : Well, SerialString has 32 elements in the C++ code, while it only has 21 elements in the Delphi code. A description of an array declaration in Delphi is this:
    : : [code]
    : : ArrayVariableName: array[LowestIndex..HighestIndex] of VariableType
    : : [/code]
    : : UniqueID is described as a unsigned long in the C++ code, while Delphi's LontInt is a "signed long".
    : : As for the actual call: item is only 1 element in a list. The C++ call example used an 10-element array of items. C++ NULL is in Delphi "nil".
    : :
    : Excuse Me, But the problem is still remained!!!
    :
    : The New Code:
    : [code]
    : type
    : pdtCamListItem=record
    : UniqueId:Cardinal;
    : SerialString:array[0..32] of char;
    : PartNumber:word;
    : PartVersion:word;
    : InUse:Cardinal;
    : end;
    :
    : implementation
    :
    : {$R *.dfm}
    : function PdListCameras(var pList:array of pdtCamListItem;ListLength:cardinal;var PConnectedNum:cardinal):cardinal; cdecl; external 'MyLib.dll';
    :
    : procedure TForm1.Button1Click(Sender: TObject);
    : var item:array [0..10] of pdtCamListItem;
    : w,s:Cardinal;
    : begin
    : s:=PdListCameras(item,10,w);
    : end;
    : [/code]
    :
    : When I run this code, I get the following error:
    : [code]
    : Access Viloation at address 10003DB0 in module 'Mylib.dll'
    : [/code]
    :
    : Now, what is the problem?!!!!
    :
    The problem is still the array. It now has 33 elements: 1 to 32 and 0. Other than that I cannot see a problem.
  • : : : : : : : : Hi
    : : : : : : : : I have a DLL file, say MyLib.dll, which contains some API commands and functions.
    : : : : : : : : But I know in this library, there are some functions such as Func1,Func2 and etc.
    : : : : : : : : Also, I have the API representation ( or C++ defination) of these functions such as follows:
    : : : : : : : :
    : : : : : : : : pdtErr Func1
    : : : : : : : : (
    : : : : : : : : pdtHandle Handle
    : : : : : : : : );
    : : : : : : : :
    : : : : : : : : or
    : : : : : : : : pdtErr Func2
    : : : : : : : : (
    : : : : : : : : PdtHandle Handle,
    : : : : : : : : PdtCaptureMode* pMode
    : : : : : : : : );
    : : : : : : : :
    : : : : : : : : Note that, I have also the C++ header file of it (MyLib.h) and the library format file (MyLib.Lib), but I want to use this DLL file in Delphi.
    : : : : : : : : Could you please tell me how I can do this work?
    : : : : : : : : Thanks
    : : : : : : : :
    : : : : : : : In your program, you need to reproduce the function headers, and all the associating types:
    : : : : : : : [code]
    : : : : : : : type
    : : : : : : : pdtErr = SomeTypeDefinition;
    : : : : : : : PdtCaptureMode = SomeTypeDefinition;
    : : : : : : :
    : : : : : : : function Func1(Handle: THandle): pdtErr; cdecl; external 'MyLib.dll';
    : : : : : : : function Func2(Handle: THandle; pMode: PdtCaptureMode): pdtErr; cdecl; external 'MyLib.dll';
    : : : : : : : [/code]
    : : : : : : : Now you can use those functions as if they are written in your program.
    : : : : : : : Note: The cdecl directive makes sure that Delphi treats them as C functions instead of Pascal functions. Often it is better to use the StdCall in both the program as well as the library.
    : : : : : : : Also this code will not unless you define those two types based on the header of the library, but it should get you started.
    : : : : : : :
    : : : : : :
    : : : : : : Thanks. But in the C header file(MyLib.h) there are many types such as the two cases below:
    : : : : : : //---------------------------------------------------------------------
    : : : : : : typedef enum
    : : : : : : {
    : : : : : : errSuccess = 0,
    : : : : : : errBadParameter = 1,
    : : : : : : errBadHandle = 2,
    : : : : : : __err_force_32 = 0xFFFFFFFF
    : : : : : :
    : : : : : : } PdtErr;
    : : : : : :
    : : : : : : /----------------------------------------------------------------------
    : : : : : : typedef struct
    : : : : : : {
    : : : : : : //----- In -----
    : : : : : :
    : : : : : : void* Buffer;
    : : : : : : unsigned long BufferSize;
    : : : : : : void* Context[4];
    : : : : : : unsigned long _reserved1[8];
    : : : : : :
    : : : : : : PdtErr Status;
    : : : : : :
    : : : : : : unsigned long _reserved2[30];
    : : : : : :
    : : : : : : } PdtFrame;
    : : : : : : //---------------------------------------------------------------------
    : : : : : :
    : : : : : : Now,Could you please tell me, how I can define these types in Delphi?
    : : : : : : And the next question is: Is there any easier way to do this works? (This way is very complicated as the header file is too big!!!)
    : : : : : : (This Library is written for acquiring images from a digital camera. I want to send it for you. So, Please send me your email)
    : : : : : :
    : : : : : : Thanks
    : : : : : :
    : : : : : Here are two ways of defining the pdtErr:
    : : : : : [code]
    : : : : : type
    : : : : : PdtErr = (errSuccess, errBadParameter, errBadHandle);
    : : : : :
    : : : : : // or
    : : : : :
    : : : : : type
    : : : : : PdtErr = type cardinal;
    : : : : :
    : : : : : const
    : : : : : errSuccess = 0;
    : : : : : errBadParameter = 1;
    : : : : : errBadHandle = 2;
    : : : : : errForce32 = $FFFFFFFF;
    : : : : : [/code]
    : : : : : I would suggest the second method, because the first one cannot handle the _err_force_32 value.
    : : : : : [code]
    : : : : : type
    : : : : : PdtFrame = record
    : : : : : Buffer: pointer; (void*)
    : : : : : BufferSize: cardinal; (unsigned long)
    : : : : : Context: array[0..3] of pointer;
    : : : : : reserved1: array[0..7] of cardinal;
    : : : : : Status: PdtErr;
    : : : : : reserved2: array[0..29] of cardinal;
    : : : : : end;
    : : : : : [/code]
    : : : : : I cannot make the time to completely convert the header file. But based on this you might already convert some things yourself.
    : : : : :
    : : : : Thanks.
    : : : : The First Try:
    : : : :
    : : : : In the MyLib.dll, there is a function as follows:
    : : : : [code]
    : : : : unsigned long PdListCameras
    : : : : (
    : : : : PdtCamListItem* Plist,
    : : : : unsigned long ListLength,
    : : : : unsigned long* pConnectedNum
    : : : :
    : : : : );
    : : : : [/code]
    : : : : This function lists cameras using Camera driver on my system.
    : : : : The parameters of this function are described bellow:
    : : : :
    : : : : plist: Array of PdtCamListItem;
    : : : : ListLength:Length of plist array
    : : : : pConnectedNum:Number of cameras found.Maybe greater than listLength. NULL pointer is allowed.
    : : : :
    : : : :
    : : : : Also,The defination of PdtCamListItem exists in the C header file (MyLib.h):
    : : : : [code]
    : : : : typedef struct
    : : : : {
    : : : : unsigned long UniqueId;
    : : : : char SerialString[32];
    : : : : unsigned short PartNumber;
    : : : : unsigned short PartVersion;
    : : : : unsigned long InUse;
    : : : : } PdtCamListItem;
    : : : : [/code]
    : : : : Here, there is an example in C++ which uses this function:
    : : : : [code]
    : : : : PdtCamListItem list[10];
    : : : : unsigned long numCameras;
    : : : :
    : : : : numCameras=PdListCameras(list,10,NULL);
    : : : : [/code]
    : : : : I tried to translate the above code into Delphi such as follows:
    : : : : [code]
    : : : : type
    : : : : pdtCamListItem=record
    : : : : UniqueId:LongInt;
    : : : : SerialString:array[0..20] of char;
    : : : : PartNumber:word;
    : : : : PartVersion:word;
    : : : : InUse:Cardinal;
    : : : : end;
    : : : :
    : : : : implementation
    : : : :
    : : : : {$R *.dfm}
    : : : : function PdListCameras(var pList:pdtCamListItem;ListLength:cardinal;var PConnectedNum:cardinal):cardinal; cdecl; external 'MyLib.dll';
    : : : :
    : : : : procedure TForm1.Button1Click(Sender: TObject);
    : : : : var item: pdtCamListItem;
    : : : : s:cardinal;
    : : : : begin
    : : : : s:=PdListCameras(item,10,NULL);
    : : : : end;
    : : : : [/code]
    : : : : But the mentioned code rises this exception:
    : : : : "Access Violation at address 0012F598"
    : : : : Now, whats the wrong?
    : : : :
    : : : :
    : : : Well, SerialString has 32 elements in the C++ code, while it only has 21 elements in the Delphi code. A description of an array declaration in Delphi is this:
    : : : [code]
    : : : ArrayVariableName: array[LowestIndex..HighestIndex] of VariableType
    : : : [/code]
    : : : UniqueID is described as a unsigned long in the C++ code, while Delphi's LontInt is a "signed long".
    : : : As for the actual call: item is only 1 element in a list. The C++ call example used an 10-element array of items. C++ NULL is in Delphi "nil".
    : : :
    : : Excuse Me, But the problem is still remained!!!
    : :
    : : The New Code:
    : : [code]
    : : type
    : : pdtCamListItem=record
    : : UniqueId:Cardinal;
    : : SerialString:array[0..32] of char;
    : : PartNumber:word;
    : : PartVersion:word;
    : : InUse:Cardinal;
    : : end;
    : :
    : : implementation
    : :
    : : {$R *.dfm}
    : : function PdListCameras(var pList:array of pdtCamListItem;ListLength:cardinal;var PConnectedNum:cardinal):cardinal; cdecl; external 'MyLib.dll';
    : :
    : : procedure TForm1.Button1Click(Sender: TObject);
    : : var item:array [0..10] of pdtCamListItem;
    : : w,s:Cardinal;
    : : begin
    : : s:=PdListCameras(item,10,w);
    : : end;
    : : [/code]
    : :
    : : When I run this code, I get the following error:
    : : [code]
    : : Access Viloation at address 10003DB0 in module 'Mylib.dll'
    : : [/code]
    : :
    : : Now, what is the problem?!!!!
    : :
    : The problem is still the array. It now has 33 elements: 1 to 32 and 0. Other than that I cannot see a problem.
    :
    Sorry, But the problem seems to be a challanging task!!
    Is there any way to see the contents or the functions of a typical DLL file?(From command-line or etc)
    I think the defination of PdListCameras is wrong. So I need to see the actual defination of PdListCameras.
    Please see the below code again:

    [code]
    unsigned long PDAPI PdListCameras
    (
    PdtCamListItem* pList, // IN: Array of PdtCamListItem
    unsigned long ListLength, // IN: Length of PdtCamListItem array
    unsigned long* pConnectedNum // OUT: Number of connected cameras
    // (may be more than ListLength!).
    // NULL pointer ok.
    );
    [/code]

    What is the difference between the first pointer (pdtCamListItem*) and the last one(unsigned long*)?
    Note that the first pointer is used for a input parameter while the last one is used for a output parameter.
    Does the following translation is true?

    [code]
    function PdListCameras(var pList:array of pdtcamListItem;ListLength:cardinal;var PConnectedNum:cardinal):Cardinal; cdecl; external 'pdapi.dll';
    [/code]


    Also please attention that the type of PConnectedNum is Cardinal and in the other hand NULL pointer is valid;But when I tried to assign this parameter to nil, I got the following error:
    'Types of actual and fromal var parameters must be identical'

    Now, Do you have any suggestion?
  • : : : : : : : : : Hi
    : : : : : : : : : I have a DLL file, say MyLib.dll, which contains some API commands and functions.
    : : : : : : : : : But I know in this library, there are some functions such as Func1,Func2 and etc.
    : : : : : : : : : Also, I have the API representation ( or C++ defination) of these functions such as follows:
    : : : : : : : : :
    : : : : : : : : : pdtErr Func1
    : : : : : : : : : (
    : : : : : : : : : pdtHandle Handle
    : : : : : : : : : );
    : : : : : : : : :
    : : : : : : : : : or
    : : : : : : : : : pdtErr Func2
    : : : : : : : : : (
    : : : : : : : : : PdtHandle Handle,
    : : : : : : : : : PdtCaptureMode* pMode
    : : : : : : : : : );
    : : : : : : : : :
    : : : : : : : : : Note that, I have also the C++ header file of it (MyLib.h) and the library format file (MyLib.Lib), but I want to use this DLL file in Delphi.
    : : : : : : : : : Could you please tell me how I can do this work?
    : : : : : : : : : Thanks
    : : : : : : : : :
    : : : : : : : : In your program, you need to reproduce the function headers, and all the associating types:
    : : : : : : : : [code]
    : : : : : : : : type
    : : : : : : : : pdtErr = SomeTypeDefinition;
    : : : : : : : : PdtCaptureMode = SomeTypeDefinition;
    : : : : : : : :
    : : : : : : : : function Func1(Handle: THandle): pdtErr; cdecl; external 'MyLib.dll';
    : : : : : : : : function Func2(Handle: THandle; pMode: PdtCaptureMode): pdtErr; cdecl; external 'MyLib.dll';
    : : : : : : : : [/code]
    : : : : : : : : Now you can use those functions as if they are written in your program.
    : : : : : : : : Note: The cdecl directive makes sure that Delphi treats them as C functions instead of Pascal functions. Often it is better to use the StdCall in both the program as well as the library.
    : : : : : : : : Also this code will not unless you define those two types based on the header of the library, but it should get you started.
    : : : : : : : :
    : : : : : : :
    : : : : : : : Thanks. But in the C header file(MyLib.h) there are many types such as the two cases below:
    : : : : : : : //---------------------------------------------------------------------
    : : : : : : : typedef enum
    : : : : : : : {
    : : : : : : : errSuccess = 0,
    : : : : : : : errBadParameter = 1,
    : : : : : : : errBadHandle = 2,
    : : : : : : : __err_force_32 = 0xFFFFFFFF
    : : : : : : :
    : : : : : : : } PdtErr;
    : : : : : : :
    : : : : : : : /----------------------------------------------------------------------
    : : : : : : : typedef struct
    : : : : : : : {
    : : : : : : : //----- In -----
    : : : : : : :
    : : : : : : : void* Buffer;
    : : : : : : : unsigned long BufferSize;
    : : : : : : : void* Context[4];
    : : : : : : : unsigned long _reserved1[8];
    : : : : : : :
    : : : : : : : PdtErr Status;
    : : : : : : :
    : : : : : : : unsigned long _reserved2[30];
    : : : : : : :
    : : : : : : : } PdtFrame;
    : : : : : : : //---------------------------------------------------------------------
    : : : : : : :
    : : : : : : : Now,Could you please tell me, how I can define these types in Delphi?
    : : : : : : : And the next question is: Is there any easier way to do this works? (This way is very complicated as the header file is too big!!!)
    : : : : : : : (This Library is written for acquiring images from a digital camera. I want to send it for you. So, Please send me your email)
    : : : : : : :
    : : : : : : : Thanks
    : : : : : : :
    : : : : : : Here are two ways of defining the pdtErr:
    : : : : : : [code]
    : : : : : : type
    : : : : : : PdtErr = (errSuccess, errBadParameter, errBadHandle);
    : : : : : :
    : : : : : : // or
    : : : : : :
    : : : : : : type
    : : : : : : PdtErr = type cardinal;
    : : : : : :
    : : : : : : const
    : : : : : : errSuccess = 0;
    : : : : : : errBadParameter = 1;
    : : : : : : errBadHandle = 2;
    : : : : : : errForce32 = $FFFFFFFF;
    : : : : : : [/code]
    : : : : : : I would suggest the second method, because the first one cannot handle the _err_force_32 value.
    : : : : : : [code]
    : : : : : : type
    : : : : : : PdtFrame = record
    : : : : : : Buffer: pointer; (void*)
    : : : : : : BufferSize: cardinal; (unsigned long)
    : : : : : : Context: array[0..3] of pointer;
    : : : : : : reserved1: array[0..7] of cardinal;
    : : : : : : Status: PdtErr;
    : : : : : : reserved2: array[0..29] of cardinal;
    : : : : : : end;
    : : : : : : [/code]
    : : : : : : I cannot make the time to completely convert the header file. But based on this you might already convert some things yourself.
    : : : : : :
    : : : : : Thanks.
    : : : : : The First Try:
    : : : : :
    : : : : : In the MyLib.dll, there is a function as follows:
    : : : : : [code]
    : : : : : unsigned long PdListCameras
    : : : : : (
    : : : : : PdtCamListItem* Plist,
    : : : : : unsigned long ListLength,
    : : : : : unsigned long* pConnectedNum
    : : : : :
    : : : : : );
    : : : : : [/code]
    : : : : : This function lists cameras using Camera driver on my system.
    : : : : : The parameters of this function are described bellow:
    : : : : :
    : : : : : plist: Array of PdtCamListItem;
    : : : : : ListLength:Length of plist array
    : : : : : pConnectedNum:Number of cameras found.Maybe greater than listLength. NULL pointer is allowed.
    : : : : :
    : : : : :
    : : : : : Also,The defination of PdtCamListItem exists in the C header file (MyLib.h):
    : : : : : [code]
    : : : : : typedef struct
    : : : : : {
    : : : : : unsigned long UniqueId;
    : : : : : char SerialString[32];
    : : : : : unsigned short PartNumber;
    : : : : : unsigned short PartVersion;
    : : : : : unsigned long InUse;
    : : : : : } PdtCamListItem;
    : : : : : [/code]
    : : : : : Here, there is an example in C++ which uses this function:
    : : : : : [code]
    : : : : : PdtCamListItem list[10];
    : : : : : unsigned long numCameras;
    : : : : :
    : : : : : numCameras=PdListCameras(list,10,NULL);
    : : : : : [/code]
    : : : : : I tried to translate the above code into Delphi such as follows:
    : : : : : [code]
    : : : : : type
    : : : : : pdtCamListItem=record
    : : : : : UniqueId:LongInt;
    : : : : : SerialString:array[0..20] of char;
    : : : : : PartNumber:word;
    : : : : : PartVersion:word;
    : : : : : InUse:Cardinal;
    : : : : : end;
    : : : : :
    : : : : : implementation
    : : : : :
    : : : : : {$R *.dfm}
    : : : : : function PdListCameras(var pList:pdtCamListItem;ListLength:cardinal;var PConnectedNum:cardinal):cardinal; cdecl; external 'MyLib.dll';
    : : : : :
    : : : : : procedure TForm1.Button1Click(Sender: TObject);
    : : : : : var item: pdtCamListItem;
    : : : : : s:cardinal;
    : : : : : begin
    : : : : : s:=PdListCameras(item,10,NULL);
    : : : : : end;
    : : : : : [/code]
    : : : : : But the mentioned code rises this exception:
    : : : : : "Access Violation at address 0012F598"
    : : : : : Now, whats the wrong?
    : : : : :
    : : : : :
    : : : : Well, SerialString has 32 elements in the C++ code, while it only has 21 elements in the Delphi code. A description of an array declaration in Delphi is this:
    : : : : [code]
    : : : : ArrayVariableName: array[LowestIndex..HighestIndex] of VariableType
    : : : : [/code]
    : : : : UniqueID is described as a unsigned long in the C++ code, while Delphi's LontInt is a "signed long".
    : : : : As for the actual call: item is only 1 element in a list. The C++ call example used an 10-element array of items. C++ NULL is in Delphi "nil".
    : : : :
    : : : Excuse Me, But the problem is still remained!!!
    : : :
    : : : The New Code:
    : : : [code]
    : : : type
    : : : pdtCamListItem=record
    : : : UniqueId:Cardinal;
    : : : SerialString:array[0..32] of char;
    : : : PartNumber:word;
    : : : PartVersion:word;
    : : : InUse:Cardinal;
    : : : end;
    : : :
    : : : implementation
    : : :
    : : : {$R *.dfm}
    : : : function PdListCameras(var pList:array of pdtCamListItem;ListLength:cardinal;var PConnectedNum:cardinal):cardinal; cdecl; external 'MyLib.dll';
    : : :
    : : : procedure TForm1.Button1Click(Sender: TObject);
    : : : var item:array [0..10] of pdtCamListItem;
    : : : w,s:Cardinal;
    : : : begin
    : : : s:=PdListCameras(item,10,w);
    : : : end;
    : : : [/code]
    : : :
    : : : When I run this code, I get the following error:
    : : : [code]
    : : : Access Viloation at address 10003DB0 in module 'Mylib.dll'
    : : : [/code]
    : : :
    : : : Now, what is the problem?!!!!
    : : :
    : : The problem is still the array. It now has 33 elements: 1 to 32 and 0. Other than that I cannot see a problem.
    : :
    : Sorry, But the problem seems to be a challanging task!!
    : Is there any way to see the contents or the functions of a typical DLL file?(From command-line or etc)
    : I think the defination of PdListCameras is wrong. So I need to see the actual defination of PdListCameras.
    : Please see the below code again:
    :
    : [code]
    : unsigned long PDAPI PdListCameras
    : (
    : PdtCamListItem* pList, // IN: Array of PdtCamListItem
    : unsigned long ListLength, // IN: Length of PdtCamListItem array
    : unsigned long* pConnectedNum // OUT: Number of connected cameras
    : // (may be more than ListLength!).
    : // NULL pointer ok.
    : );
    : [/code]
    :
    : What is the difference between the first pointer (pdtCamListItem*) and the last one(unsigned long*)?
    : Note that the first pointer is used for a input parameter while the last one is used for a output parameter.
    : Does the following translation is true?
    :
    : [code]
    : function PdListCameras(var pList:array of pdtcamListItem;ListLength:cardinal;var PConnectedNum:cardinal):Cardinal; cdecl; external 'pdapi.dll';
    : [/code]
    :
    :
    : Also please attention that the type of PConnectedNum is Cardinal and in the other hand NULL pointer is valid;But when I tried to assign this parameter to nil, I got the following error:
    : 'Types of actual and fromal var parameters must be identical'
    :
    : Now, Do you have any suggestion?
    :
    The pdtCamListItem* is a pointer to a record with the type pdtCamListItem, while the unsigned long* is a pointer to an unsigned long. This has implications for how those pointers can be used and the memory size of each. When dereferencing the first you get a record, which includes its fields. If you dereference the latter you get a simple integer.
    The declaration of the PdListCameras() in Delphi is not the same as the declaration in C++. This part
    [code]
    var PConnectedNum: cardinal
    [/code]
    is a variable parameter and not a pointer parameter. Delphi knows several types of parameters:
    - constant parameters (const): these cannot be changed by the function
    - normal parameters: these can be changed by the function, but any changes are only made in the stack of the function
    - variable parameters (var): these can be changed by the function and the changes will be returned to the calling code
    - out parameters (out): these must be set by the function as they have no initial value before the call to the function.
    Here is an example:
    [code]
    procedure ConstParam(const value: integer);
    begin
    Value := 4; // Generates an error
    end;

    procedure NormalParam(value: integer);
    begin
    Value := 4;
    // Value is 4
    end;

    procedure VarParam(var value: integer);
    begin
    Value := 4;
    end;

    procedure OutParam(out value: integer);
    begin
    // Value is not 7
    Value := 4;
    end;

    var
    Value: integer;
    begin
    Value := 7;
    ConstParam(Value);
    // Value is still 7
    NormalParam(Value);
    // Value is still 7
    VarParam(Value);
    // Value is changed to 4
    OutParam(Value);
    // Value is changed to 4
    end;
    [/code]
    Each of these are passed to the procedure using its actual value.
    This is completely different from a pointer parameter. When you use a pointer parameter you pass the location of the value into the procedure, not the actual value:
    [code]
    type
    PCardinal = ^Cardinal;

    procedure PointerParam(const P: PCardinal);
    begin
    // the value of the P is not 7,
    // because the memory location of Value is not $00000007
    P^ := 4;
    end;

    var
    Value: integer;
    begin
    Value := 7;
    PointerParam(@Value);
    // Value is changed to 4
    end;
    [/code]
    In C++ many parameters are passed as pointer, because (as described by the help) by using the cdecl calls the calling procedure is responsible for the memory management.

    I hope this explains some of the memory management issues.
  • : : : : : : : : : : Hi
    : : : : : : : : : : I have a DLL file, say MyLib.dll, which contains some API commands and functions.
    : : : : : : : : : : But I know in this library, there are some functions such as Func1,Func2 and etc.
    : : : : : : : : : : Also, I have the API representation ( or C++ defination) of these functions such as follows:
    : : : : : : : : : :
    : : : : : : : : : : pdtErr Func1
    : : : : : : : : : : (
    : : : : : : : : : : pdtHandle Handle
    : : : : : : : : : : );
    : : : : : : : : : :
    : : : : : : : : : : or
    : : : : : : : : : : pdtErr Func2
    : : : : : : : : : : (
    : : : : : : : : : : PdtHandle Handle,
    : : : : : : : : : : PdtCaptureMode* pMode
    : : : : : : : : : : );
    : : : : : : : : : :
    : : : : : : : : : : Note that, I have also the C++ header file of it (MyLib.h) and the library format file (MyLib.Lib), but I want to use this DLL file in Delphi.
    : : : : : : : : : : Could you please tell me how I can do this work?
    : : : : : : : : : : Thanks
    : : : : : : : : : :
    : : : : : : : : : In your program, you need to reproduce the function headers, and all the associating types:
    : : : : : : : : : [code]
    : : : : : : : : : type
    : : : : : : : : : pdtErr = SomeTypeDefinition;
    : : : : : : : : : PdtCaptureMode = SomeTypeDefinition;
    : : : : : : : : :
    : : : : : : : : : function Func1(Handle: THandle): pdtErr; cdecl; external 'MyLib.dll';
    : : : : : : : : : function Func2(Handle: THandle; pMode: PdtCaptureMode): pdtErr; cdecl; external 'MyLib.dll';
    : : : : : : : : : [/code]
    : : : : : : : : : Now you can use those functions as if they are written in your program.
    : : : : : : : : : Note: The cdecl directive makes sure that Delphi treats them as C functions instead of Pascal functions. Often it is better to use the StdCall in both the program as well as the library.
    : : : : : : : : : Also this code will not unless you define those two types based on the header of the library, but it should get you started.
    : : : : : : : : :
    : : : : : : : :
    : : : : : : : : Thanks. But in the C header file(MyLib.h) there are many types such as the two cases below:
    : : : : : : : : //---------------------------------------------------------------------
    : : : : : : : : typedef enum
    : : : : : : : : {
    : : : : : : : : errSuccess = 0,
    : : : : : : : : errBadParameter = 1,
    : : : : : : : : errBadHandle = 2,
    : : : : : : : : __err_force_32 = 0xFFFFFFFF
    : : : : : : : :
    : : : : : : : : } PdtErr;
    : : : : : : : :
    : : : : : : : : /----------------------------------------------------------------------
    : : : : : : : : typedef struct
    : : : : : : : : {
    : : : : : : : : //----- In -----
    : : : : : : : :
    : : : : : : : : void* Buffer;
    : : : : : : : : unsigned long BufferSize;
    : : : : : : : : void* Context[4];
    : : : : : : : : unsigned long _reserved1[8];
    : : : : : : : :
    : : : : : : : : PdtErr Status;
    : : : : : : : :
    : : : : : : : : unsigned long _reserved2[30];
    : : : : : : : :
    : : : : : : : : } PdtFrame;
    : : : : : : : : //---------------------------------------------------------------------
    : : : : : : : :
    : : : : : : : : Now,Could you please tell me, how I can define these types in Delphi?
    : : : : : : : : And the next question is: Is there any easier way to do this works? (This way is very complicated as the header file is too big!!!)
    : : : : : : : : (This Library is written for acquiring images from a digital camera. I want to send it for you. So, Please send me your email)
    : : : : : : : :
    : : : : : : : : Thanks
    : : : : : : : :
    : : : : : : : Here are two ways of defining the pdtErr:
    : : : : : : : [code]
    : : : : : : : type
    : : : : : : : PdtErr = (errSuccess, errBadParameter, errBadHandle);
    : : : : : : :
    : : : : : : : // or
    : : : : : : :
    : : : : : : : type
    : : : : : : : PdtErr = type cardinal;
    : : : : : : :
    : : : : : : : const
    : : : : : : : errSuccess = 0;
    : : : : : : : errBadParameter = 1;
    : : : : : : : errBadHandle = 2;
    : : : : : : : errForce32 = $FFFFFFFF;
    : : : : : : : [/code]
    : : : : : : : I would suggest the second method, because the first one cannot handle the _err_force_32 value.
    : : : : : : : [code]
    : : : : : : : type
    : : : : : : : PdtFrame = record
    : : : : : : : Buffer: pointer; (void*)
    : : : : : : : BufferSize: cardinal; (unsigned long)
    : : : : : : : Context: array[0..3] of pointer;
    : : : : : : : reserved1: array[0..7] of cardinal;
    : : : : : : : Status: PdtErr;
    : : : : : : : reserved2: array[0..29] of cardinal;
    : : : : : : : end;
    : : : : : : : [/code]
    : : : : : : : I cannot make the time to completely convert the header file. But based on this you might already convert some things yourself.
    : : : : : : :
    : : : : : : Thanks.
    : : : : : : The First Try:
    : : : : : :
    : : : : : : In the MyLib.dll, there is a function as follows:
    : : : : : : [code]
    : : : : : : unsigned long PdListCameras
    : : : : : : (
    : : : : : : PdtCamListItem* Plist,
    : : : : : : unsigned long ListLength,
    : : : : : : unsigned long* pConnectedNum
    : : : : : :
    : : : : : : );
    : : : : : : [/code]
    : : : : : : This function lists cameras using Camera driver on my system.
    : : : : : : The parameters of this function are described bellow:
    : : : : : :
    : : : : : : plist: Array of PdtCamListItem;
    : : : : : : ListLength:Length of plist array
    : : : : : : pConnectedNum:Number of cameras found.Maybe greater than listLength. NULL pointer is allowed.
    : : : : : :
    : : : : : :
    : : : : : : Also,The defination of PdtCamListItem exists in the C header file (MyLib.h):
    : : : : : : [code]
    : : : : : : typedef struct
    : : : : : : {
    : : : : : : unsigned long UniqueId;
    : : : : : : char SerialString[32];
    : : : : : : unsigned short PartNumber;
    : : : : : : unsigned short PartVersion;
    : : : : : : unsigned long InUse;
    : : : : : : } PdtCamListItem;
    : : : : : : [/code]
    : : : : : : Here, there is an example in C++ which uses this function:
    : : : : : : [code]
    : : : : : : PdtCamListItem list[10];
    : : : : : : unsigned long numCameras;
    : : : : : :
    : : : : : : numCameras=PdListCameras(list,10,NULL);
    : : : : : : [/code]
    : : : : : : I tried to translate the above code into Delphi such as follows:
    : : : : : : [code]
    : : : : : : type
    : : : : : : pdtCamListItem=record
    : : : : : : UniqueId:LongInt;
    : : : : : : SerialString:array[0..20] of char;
    : : : : : : PartNumber:word;
    : : : : : : PartVersion:word;
    : : : : : : InUse:Cardinal;
    : : : : : : end;
    : : : : : :
    : : : : : : implementation
    : : : : : :
    : : : : : : {$R *.dfm}
    : : : : : : function PdListCameras(var pList:pdtCamListItem;ListLength:cardinal;var PConnectedNum:cardinal):cardinal; cdecl; external 'MyLib.dll';
    : : : : : :
    : : : : : : procedure TForm1.Button1Click(Sender: TObject);
    : : : : : : var item: pdtCamListItem;
    : : : : : : s:cardinal;
    : : : : : : begin
    : : : : : : s:=PdListCameras(item,10,NULL);
    : : : : : : end;
    : : : : : : [/code]
    : : : : : : But the mentioned code rises this exception:
    : : : : : : "Access Violation at address 0012F598"
    : : : : : : Now, whats the wrong?
    : : : : : :
    : : : : : :
    : : : : : Well, SerialString has 32 elements in the C++ code, while it only has 21 elements in the Delphi code. A description of an array declaration in Delphi is this:
    : : : : : [code]
    : : : : : ArrayVariableName: array[LowestIndex..HighestIndex] of VariableType
    : : : : : [/code]
    : : : : : UniqueID is described as a unsigned long in the C++ code, while Delphi's LontInt is a "signed long".
    : : : : : As for the actual call: item is only 1 element in a list. The C++ call example used an 10-element array of items. C++ NULL is in Delphi "nil".
    : : : : :
    : : : : Excuse Me, But the problem is still remained!!!
    : : : :
    : : : : The New Code:
    : : : : [code]
    : : : : type
    : : : : pdtCamListItem=record
    : : : : UniqueId:Cardinal;
    : : : : SerialString:array[0..32] of char;
    : : : : PartNumber:word;
    : : : : PartVersion:word;
    : : : : InUse:Cardinal;
    : : : : end;
    : : : :
    : : : : implementation
    : : : :
    : : : : {$R *.dfm}
    : : : : function PdListCameras(var pList:array of pdtCamListItem;ListLength:cardinal;var PConnectedNum:cardinal):cardinal; cdecl; external 'MyLib.dll';
    : : : :
    : : : : procedure TForm1.Button1Click(Sender: TObject);
    : : : : var item:array [0..10] of pdtCamListItem;
    : : : : w,s:Cardinal;
    : : : : begin
    : : : : s:=PdListCameras(item,10,w);
    : : : : end;
    : : : : [/code]
    : : : :
    : : : : When I run this code, I get the following error:
    : : : : [code]
    : : : : Access Viloation at address 10003DB0 in module 'Mylib.dll'
    : : : : [/code]
    : : : :
    : : : : Now, what is the problem?!!!!
    : : : :
    : : : The problem is still the array. It now has 33 elements: 1 to 32 and 0. Other than that I cannot see a problem.
    : : :
    : : Sorry, But the problem seems to be a challanging task!!
    : : Is there any way to see the contents or the functions of a typical DLL file?(From command-line or etc)
    : : I think the defination of PdListCameras is wrong. So I need to see the actual defination of PdListCameras.
    : : Please see the below code again:
    : :
    : : [code]
    : : unsigned long PDAPI PdListCameras
    : : (
    : : PdtCamListItem* pList, // IN: Array of PdtCamListItem
    : : unsigned long ListLength, // IN: Length of PdtCamListItem array
    : : unsigned long* pConnectedNum // OUT: Number of connected cameras
    : : // (may be more than ListLength!).
    : : // NULL pointer ok.
    : : );
    : : [/code]
    : :
    : : What is the difference between the first pointer (pdtCamListItem*) and the last one(unsigned long*)?
    : : Note that the first pointer is used for a input parameter while the last one is used for a output parameter.
    : : Does the following translation is true?
    : :
    : : [code]
    : : function PdListCameras(var pList:array of pdtcamListItem;ListLength:cardinal;var PConnectedNum:cardinal):Cardinal; cdecl; external 'pdapi.dll';
    : : [/code]
    : :
    : :
    : : Also please attention that the type of PConnectedNum is Cardinal and in the other hand NULL pointer is valid;But when I tried to assign this parameter to nil, I got the following error:
    : : 'Types of actual and fromal var parameters must be identical'
    : :
    : : Now, Do you have any suggestion?
    : :
    : The pdtCamListItem* is a pointer to a record with the type pdtCamListItem, while the unsigned long* is a pointer to an unsigned long. This has implications for how those pointers can be used and the memory size of each. When dereferencing the first you get a record, which includes its fields. If you dereference the latter you get a simple integer.
    : The declaration of the PdListCameras() in Delphi is not the same as the declaration in C++. This part
    : [code]
    : var PConnectedNum: cardinal
    : [/code]
    : is a variable parameter and not a pointer parameter. Delphi knows several types of parameters:
    : - constant parameters (const): these cannot be changed by the function
    : - normal parameters: these can be changed by the function, but any changes are only made in the stack of the function
    : - variable parameters (var): these can be changed by the function and the changes will be returned to the calling code
    : - out parameters (out): these must be set by the function as they have no initial value before the call to the function.
    : Here is an example:
    : [code]
    : procedure ConstParam(const value: integer);
    : begin
    : Value := 4; // Generates an error
    : end;
    :
    : procedure NormalParam(value: integer);
    : begin
    : Value := 4;
    : // Value is 4
    : end;
    :
    : procedure VarParam(var value: integer);
    : begin
    : Value := 4;
    : end;
    :
    : procedure OutParam(out value: integer);
    : begin
    : // Value is not 7
    : Value := 4;
    : end;
    :
    : var
    : Value: integer;
    : begin
    : Value := 7;
    : ConstParam(Value);
    : // Value is still 7
    : NormalParam(Value);
    : // Value is still 7
    : VarParam(Value);
    : // Value is changed to 4
    : OutParam(Value);
    : // Value is changed to 4
    : end;
    : [/code]
    : Each of these are passed to the procedure using its actual value.
    : This is completely different from a pointer parameter. When you use a pointer parameter you pass the location of the value into the procedure, not the actual value:
    : [code]
    : type
    : PCardinal = ^Cardinal;
    :
    : procedure PointerParam(const P: PCardinal);
    : begin
    : // the value of the P is not 7,
    : // because the memory location of Value is not $00000007
    : P^ := 4;
    : end;
    :
    : var
    : Value: integer;
    : begin
    : Value := 7;
    : PointerParam(@Value);
    : // Value is changed to 4
    : end;
    : [/code]
    : In C++ many parameters are passed as pointer, because (as described by the help) by using the cdecl calls the calling procedure is responsible for the memory management.
    :
    : I hope this explains some of the memory management issues.
    :
    Thanks
    Now, could you please correct my code?
    [code]
    type
    pdtCamListItem=record
    UniqueId:Cardinal;
    SerialString:array[0..31] of char;
    PartNumber:word;
    PartVersion:word;
    InUse:Cardinal;
    end;

    implementation

    {$R *.dfm}
    function PdListCameras(var pList:array of pdtCamListItem;ListLength:cardinal;var PConnectedNum:cardinal):cardinal; cdecl; external 'MyLib.dll';

    procedure TForm1.Button1Click(Sender: TObject);
    var item:array [0..9] of pdtCamListItem;
    w,s:Cardinal;
    begin
    s:=PdListCameras(item,10,w);
    end;
    [/code]

  • : : : : : : : Hi
    : : : : : : : I have a DLL file, say MyLib.dll, which contains some API commands and functions.
    : : : : : : : But I know in this library, there are some functions such as Func1,Func2 and etc.
    : : : : : : : Also, I have the API representation ( or C++ defination) of these functions such as follows:
    : : : : : : :
    : : : : : : : pdtErr Func1
    : : : : : : : (
    : : : : : : : pdtHandle Handle
    : : : : : : : );
    : : : : : : :
    : : : : : : : or
    : : : : : : : pdtErr Func2
    : : : : : : : (
    : : : : : : : PdtHandle Handle,
    : : : : : : : PdtCaptureMode* pMode
    : : : : : : : );
    : : : : : : :
    : : : : : : : Note that, I have also the C++ header file of it (MyLib.h) and the library format file (MyLib.Lib), but I want to use this DLL file in Delphi.
    : : : : : : : Could you please tell me how I can do this work?
    : : : : : : : Thanks
    : : : : : : :
    : : : : : : In your program, you need to reproduce the function headers, and all the associating types:
    : : : : : : [code]
    : : : : : : type
    : : : : : : pdtErr = SomeTypeDefinition;
    : : : : : : PdtCaptureMode = SomeTypeDefinition;
    : : : : : :
    : : : : : : function Func1(Handle: THandle): pdtErr; cdecl; external 'MyLib.dll';
    : : : : : : function Func2(Handle: THandle; pMode: PdtCaptureMode): pdtErr; cdecl; external 'MyLib.dll';
    : : : : : : [/code]
    : : : : : : Now you can use those functions as if they are written in your program.
    : : : : : : Note: The cdecl directive makes sure that Delphi treats them as C functions instead of Pascal functions. Often it is better to use the StdCall in both the program as well as the library.
    : : : : : : Also this code will not unless you define those two types based on the header of the library, but it should get you started.
    : : : : : :
    : : : : :
    : : : : : Thanks. But in the C header file(MyLib.h) there are many types such as the two cases below:
    : : : : : //---------------------------------------------------------------------
    : : : : : typedef enum
    : : : : : {
    : : : : : errSuccess = 0,
    : : : : : errBadParameter = 1,
    : : : : : errBadHandle = 2,
    : : : : : __err_force_32 = 0xFFFFFFFF
    : : : : :
    : : : : : } PdtErr;
    : : : : :
    : : : : : /----------------------------------------------------------------------
    : : : : : typedef struct
    : : : : : {
    : : : : : //----- In -----
    : : : : :
    : : : : : void* Buffer;
    : : : : : unsigned long BufferSize;
    : : : : : void* Context[4];
    : : : : : unsigned long _reserved1[8];
    : : : : :
    : : : : : PdtErr Status;
    : : : : :
    : : : : : unsigned long _reserved2[30];
    : : : : :
    : : : : : } PdtFrame;
    : : : : : //---------------------------------------------------------------------
    : : : : :
    : : : : : Now,Could you please tell me, how I can define these types in Delphi?
    : : : : : And the next question is: Is there any easier way to do this works? (This way is very complicated as the header file is too big!!!)
    : : : : : (This Library is written for acquiring images from a digital camera. I want to send it for you. So, Please send me your email)
    : : : : :
    : : : : : Thanks
    : : : : :
    : : : : Here are two ways of defining the pdtErr:
    : : : : [code]
    : : : : type
    : : : : PdtErr = (errSuccess, errBadParameter, errBadHandle);
    : : : :
    : : : : // or
    : : : :
    : : : : type
    : : : : PdtErr = type cardinal;
    : : : :
    : : : : const
    : : : : errSuccess = 0;
    : : : : errBadParameter = 1;
    : : : : errBadHandle = 2;
    : : : : errForce32 = $FFFFFFFF;
    : : : : [/code]
    : : : : I would suggest the second method, because the first one cannot handle the _err_force_32 value.
    : : : : [code]
    : : : : type
    : : : : PdtFrame = record
    : : : : Buffer: pointer; (void*)
    : : : : BufferSize: cardinal; (unsigned long)
    : : : : Context: array[0..3] of pointer;
    : : : : reserved1: array[0..7] of cardinal;
    : : : : Status: PdtErr;
    : : : : reserved2: array[0..29] of cardinal;
    : : : : end;
    : : : : [/code]
    : : : : I cannot make the time to completely convert the header file. But based on this you might already convert some things yourself.
    : : : :
    : : : Thanks.
    : : : The First Try:
    : : :
    : : : In the MyLib.dll, there is a function as follows:
    : : : [code]
    : : : unsigned long PdListCameras
    : : : (
    : : : PdtCamListItem* Plist,
    : : : unsigned long ListLength,
    : : : unsigned long* pConnectedNum
    : : :
    : : : );
    : : : [/code]
    : : : This function lists cameras using Camera driver on my system.
    : : : The parameters of this function are described bellow:
    : : :
    : : : plist: Array of PdtCamListItem;
    : : : ListLength:Length of plist array
    : : : pConnectedNum:Number of cameras found.Maybe greater than listLength. NULL pointer is allowed.
    : : :
    : : :
    : : : Also,The defination of PdtCamListItem exists in the C header file (MyLib.h):
    : : : [code]
    : : : typedef struct
    : : : {
    : : : unsigned long UniqueId;
    : : : char SerialString[32];
    : : : unsigned short PartNumber;
    : : : unsigned short PartVersion;
    : : : unsigned long InUse;
    : : : } PdtCamListItem;
    : : : [/code]
    : : : Here, there is an example in C++ which uses this function:
    : : : [code]
    : : : PdtCamListItem list[10];
    : : : unsigned long numCameras;
    : : :
    : : : numCameras=PdListCameras(list,10,NULL);
    : : : [/code]
    : : : I tried to translate the above code into Delphi such as follows:
    : : : [code]
    : : : type
    : : : pdtCamListItem=record
    : : : UniqueId:LongInt;
    : : : SerialString:array[0..20] of char;
    : : : PartNumber:word;
    : : : PartVersion:word;
    : : : InUse:Cardinal;
    : : : end;
    : : :
    : : : implementation
    : : :
    : : : {$R *.dfm}
    : : : function PdListCameras(var pList:pdtCamListItem;ListLength:cardinal;var PConnectedNum:cardinal):cardinal; cdecl; external 'MyLib.dll';
    : : :
    : : : procedure TForm1.Button1Click(Sender: TObject);
    : : : var item: pdtCamListItem;
    : : : s:cardinal;
    : : : begin
    : : : s:=PdListCameras(item,10,NULL);
    : : : end;
    : : : [/code]
    : : : But the mentioned code rises this exception:
    : : : "Access Violation at address 0012F598"
    : : : Now, whats the wrong?
    : : :
    : : :
    : : Well, SerialString has 32 elements in the C++ code, while it only has 21 elements in the Delphi code. A description of an array declaration in Delphi is this:
    : : [code]
    : : ArrayVariableName: array[LowestIndex..HighestIndex] of VariableType
    : : [/code]
    : : UniqueID is described as a unsigned long in the C++ code, while Delphi's LontInt is a "signed long".
    : : As for the actual call: item is only 1 element in a list. The C++ call example used an 10-element array of items. C++ NULL is in Delphi "nil".
    : :
    : Excuse Me, But the problem is still remained!!!
    :
    : The New Code:
    : [code]
    : type
    : pdtCamListItem=record
    : UniqueId:Cardinal;
    : SerialString:array[0..32] of char;
    : PartNumber:word;
    : PartVersion:word;
    : InUse:Cardinal;
    : end;
    :
    : implementation
    :
    : {$R *.dfm}
    : function PdListCameras(var pList:array of pdtCamListItem;ListLength:cardinal;var PConnectedNum:cardinal):cardinal; cdecl; external 'MyLib.dll';
    :
    : procedure TForm1.Button1Click(Sender: TObject);
    : var item:array [0..10] of pdtCamListItem;
    : w,s:Cardinal;
    : begin
    : s:=PdListCameras(item,10,w);
    : end;
    : [/code]
    :
    : When I run this code, I get the following error:
    : [code]
    : Access Viloation at address 10003DB0 in module 'Mylib.dll'
    : [/code]
    :
    : Now, what is the problem?!!!!
    :
    : [code]
    : type
    : TdtCamListItem=record
    : UniqueId:Cardinal;
    : SerialString:array[0..31] of char;
    : PartNumber:word;
    : PartVersion:word;
    : InUse:Cardinal;
    : end;
    [red]: PCardinal = ^Cardinal[/red]

    : implementation
    :
    : {$R *.dfm}
    : function PdListCameras([red]dtList: pointer;[/red] ListLength: cardinal;[red] PConnectedNum:PCardinal[/red]): cardinal; cdecl; external 'MyLib.dll';
    :
    : procedure TForm1.Button1Click(Sender: TObject);
    : var item:array [0..9] of TdtCamListItem;
    : w,s:Cardinal;
    : begin
    : s:=PdListCameras([red]@[/red]item,10,[red]@[/red]w);
    : end;
    : [/code]
    :
    :
    The red bits show what I've changed.

    These two pieces of code are completely different:
    [code]
    var PConnectedNum:cardinal
    [/code]
    and
    [code]
    PConnectedNum:PCardinal
    [/code]
    The first copies the variable [b]value[/b] into the stack and then copies the changed value back, while the second copies the variable [b]memory location[/b] into the stack. In the second case if the function then makes a change in the variable value, it is directly changed in the original variable. For example:
    [code]
    1 procedure Change(var v: cardinal);
    2 begin
    3 v := 6;
    4 end;

    var
    j: cardinal;
    begin
    5 j := 1;
    6 Change(j);
    7 end;
    [/code]
    Here is how this code is handled:
    [code]
    Value in j Value in v
    5 1 Undefined
    6 1 Undefined
    2 1 1
    3 1 6
    4 1 6
    7 6 Undefined
    [/code]
    Here is how pointer variable is handled:
    [code]
    1 procedure Change(v: PCardinal);
    2 begin
    3 v^ := 6;
    4 end;

    var
    j: cardinal;
    begin
    5 j := 1;
    6 Change(@j);
    7 end;
    [/code]
    As you can see it's nearly the same code.
    [code]
    Value in j Value in v
    5 1 Undefined
    6 1 Undefined
    2 1 $0055A36B
    3 6 $0055A36B
    4 6 $0055A36B
    7 6 Undefined
    [/code]
    But the values in the variables are completely different. This is because a pointer parameter is [b]not[/b] the same as a variable parameter.
    In C++ a asterix (*) behind a variable type denotes a pointer of the type specified.
  • : : : : : : : : Hi
    : : : : : : : : I have a DLL file, say MyLib.dll, which contains some API commands and functions.
    : : : : : : : : But I know in this library, there are some functions such as Func1,Func2 and etc.
    : : : : : : : : Also, I have the API representation ( or C++ defination) of these functions such as follows:
    : : : : : : : :
    : : : : : : : : pdtErr Func1
    : : : : : : : : (
    : : : : : : : : pdtHandle Handle
    : : : : : : : : );
    : : : : : : : :
    : : : : : : : : or
    : : : : : : : : pdtErr Func2
    : : : : : : : : (
    : : : : : : : : PdtHandle Handle,
    : : : : : : : : PdtCaptureMode* pMode
    : : : : : : : : );
    : : : : : : : :
    : : : : : : : : Note that, I have also the C++ header file of it (MyLib.h) and the library format file (MyLib.Lib), but I want to use this DLL file in Delphi.
    : : : : : : : : Could you please tell me how I can do this work?
    : : : : : : : : Thanks
    : : : : : : : :
    : : : : : : : In your program, you need to reproduce the function headers, and all the associating types:
    : : : : : : : [code]
    : : : : : : : type
    : : : : : : : pdtErr = SomeTypeDefinition;
    : : : : : : : PdtCaptureMode = SomeTypeDefinition;
    : : : : : : :
    : : : : : : : function Func1(Handle: THandle): pdtErr; cdecl; external 'MyLib.dll';
    : : : : : : : function Func2(Handle: THandle; pMode: PdtCaptureMode): pdtErr; cdecl; external 'MyLib.dll';
    : : : : : : : [/code]
    : : : : : : : Now you can use those functions as if they are written in your program.
    : : : : : : : Note: The cdecl directive makes sure that Delphi treats them as C functions instead of Pascal functions. Often it is better to use the StdCall in both the program as well as the library.
    : : : : : : : Also this code will not unless you define those two types based on the header of the library, but it should get you started.
    : : : : : : :
    : : : : : :
    : : : : : : Thanks. But in the C header file(MyLib.h) there are many types such as the two cases below:
    : : : : : : //---------------------------------------------------------------------
    : : : : : : typedef enum
    : : : : : : {
    : : : : : : errSuccess = 0,
    : : : : : : errBadParameter = 1,
    : : : : : : errBadHandle = 2,
    : : : : : : __err_force_32 = 0xFFFFFFFF
    : : : : : :
    : : : : : : } PdtErr;
    : : : : : :
    : : : : : : /----------------------------------------------------------------------
    : : : : : : typedef struct
    : : : : : : {
    : : : : : : //----- In -----
    : : : : : :
    : : : : : : void* Buffer;
    : : : : : : unsigned long BufferSize;
    : : : : : : void* Context[4];
    : : : : : : unsigned long _reserved1[8];
    : : : : : :
    : : : : : : PdtErr Status;
    : : : : : :
    : : : : : : unsigned long _reserved2[30];
    : : : : : :
    : : : : : : } PdtFrame;
    : : : : : : //---------------------------------------------------------------------
    : : : : : :
    : : : : : : Now,Could you please tell me, how I can define these types in Delphi?
    : : : : : : And the next question is: Is there any easier way to do this works? (This way is very complicated as the header file is too big!!!)
    : : : : : : (This Library is written for acquiring images from a digital camera. I want to send it for you. So, Please send me your email)
    : : : : : :
    : : : : : : Thanks
    : : : : : :
    : : : : : Here are two ways of defining the pdtErr:
    : : : : : [code]
    : : : : : type
    : : : : : PdtErr = (errSuccess, errBadParameter, errBadHandle);
    : : : : :
    : : : : : // or
    : : : : :
    : : : : : type
    : : : : : PdtErr = type cardinal;
    : : : : :
    : : : : : const
    : : : : : errSuccess = 0;
    : : : : : errBadParameter = 1;
    : : : : : errBadHandle = 2;
    : : : : : errForce32 = $FFFFFFFF;
    : : : : : [/code]
    : : : : : I would suggest the second method, because the first one cannot handle the _err_force_32 value.
    : : : : : [code]
    : : : : : type
    : : : : : PdtFrame = record
    : : : : : Buffer: pointer; (void*)
    : : : : : BufferSize: cardinal; (unsigned long)
    : : : : : Context: array[0..3] of pointer;
    : : : : : reserved1: array[0..7] of cardinal;
    : : : : : Status: PdtErr;
    : : : : : reserved2: array[0..29] of cardinal;
    : : : : : end;
    : : : : : [/code]
    : : : : : I cannot make the time to completely convert the header file. But based on this you might already convert some things yourself.
    : : : : :
    : : : : Thanks.
    : : : : The First Try:
    : : : :
    : : : : In the MyLib.dll, there is a function as follows:
    : : : : [code]
    : : : : unsigned long PdListCameras
    : : : : (
    : : : : PdtCamListItem* Plist,
    : : : : unsigned long ListLength,
    : : : : unsigned long* pConnectedNum
    : : : :
    : : : : );
    : : : : [/code]
    : : : : This function lists cameras using Camera driver on my system.
    : : : : The parameters of this function are described bellow:
    : : : :
    : : : : plist: Array of PdtCamListItem;
    : : : : ListLength:Length of plist array
    : : : : pConnectedNum:Number of cameras found.Maybe greater than listLength. NULL pointer is allowed.
    : : : :
    : : : :
    : : : : Also,The defination of PdtCamListItem exists in the C header file (MyLib.h):
    : : : : [code]
    : : : : typedef struct
    : : : : {
    : : : : unsigned long UniqueId;
    : : : : char SerialString[32];
    : : : : unsigned short PartNumber;
    : : : : unsigned short PartVersion;
    : : : : unsigned long InUse;
    : : : : } PdtCamListItem;
    : : : : [/code]
    : : : : Here, there is an example in C++ which uses this function:
    : : : : [code]
    : : : : PdtCamListItem list[10];
    : : : : unsigned long numCameras;
    : : : :
    : : : : numCameras=PdListCameras(list,10,NULL);
    : : : : [/code]
    : : : : I tried to translate the above code into Delphi such as follows:
    : : : : [code]
    : : : : type
    : : : : pdtCamListItem=record
    : : : : UniqueId:LongInt;
    : : : : SerialString:array[0..20] of char;
    : : : : PartNumber:word;
    : : : : PartVersion:word;
    : : : : InUse:Cardinal;
    : : : : end;
    : : : :
    : : : : implementation
    : : : :
    : : : : {$R *.dfm}
    : : : : function PdListCameras(var pList:pdtCamListItem;ListLength:cardinal;var PConnectedNum:cardinal):cardinal; cdecl; external 'MyLib.dll';
    : : : :
    : : : : procedure TForm1.Button1Click(Sender: TObject);
    : : : : var item: pdtCamListItem;
    : : : : s:cardinal;
    : : : : begin
    : : : : s:=PdListCameras(item,10,NULL);
    : : : : end;
    : : : : [/code]
    : : : : But the mentioned code rises this exception:
    : : : : "Access Violation at address 0012F598"
    : : : : Now, whats the wrong?
    : : : :
    : : : :
    : : : Well, SerialString has 32 elements in the C++ code, while it only has 21 elements in the Delphi code. A description of an array declaration in Delphi is this:
    : : : [code]
    : : : ArrayVariableName: array[LowestIndex..HighestIndex] of VariableType
    : : : [/code]
    : : : UniqueID is described as a unsigned long in the C++ code, while Delphi's LontInt is a "signed long".
    : : : As for the actual call: item is only 1 element in a list. The C++ call example used an 10-element array of items. C++ NULL is in Delphi "nil".
    : : :
    : : Excuse Me, But the problem is still remained!!!
    : :
    : : The New Code:
    : : [code]
    : : type
    : : pdtCamListItem=record
    : : UniqueId:Cardinal;
    : : SerialString:array[0..32] of char;
    : : PartNumber:word;
    : : PartVersion:word;
    : : InUse:Cardinal;
    : : end;
    : :
    : : implementation
    : :
    : : {$R *.dfm}
    : : function PdListCameras(var pList:array of pdtCamListItem;ListLength:cardinal;var PConnectedNum:cardinal):cardinal; cdecl; external 'MyLib.dll';
    : :
    : : procedure TForm1.Button1Click(Sender: TObject);
    : : var item:array [0..10] of pdtCamListItem;
    : : w,s:Cardinal;
    : : begin
    : : s:=PdListCameras(item,10,w);
    : : end;
    : : [/code]
    : :
    : : When I run this code, I get the following error:
    : : [code]
    : : Access Viloation at address 10003DB0 in module 'Mylib.dll'
    : : [/code]
    : :
    : : Now, what is the problem?!!!!
    : :
    : : [code]
    : : type
    : : TdtCamListItem=record
    : : UniqueId:Cardinal;
    : : SerialString:array[0..31] of char;
    : : PartNumber:word;
    : : PartVersion:word;
    : : InUse:Cardinal;
    : : end;
    : [red]: PCardinal = ^Cardinal[/red]
    :
    : : implementation
    : :
    : : {$R *.dfm}
    : : function PdListCameras([red]dtList: pointer;[/red] ListLength: cardinal;[red] PConnectedNum:PCardinal[/red]): cardinal; cdecl; external 'MyLib.dll';
    : :
    : : procedure TForm1.Button1Click(Sender: TObject);
    : : var item:array [0..9] of TdtCamListItem;
    : : w,s:Cardinal;
    : : begin
    : : s:=PdListCameras([red]@[/red]item,10,[red]@[/red]w);
    : : end;
    : : [/code]
    : :
    : :
    : The red bits show what I've changed.
    :
    : These two pieces of code are completely different:
    : [code]
    : var PConnectedNum:cardinal
    : [/code]
    : and
    : [code]
    : PConnectedNum:PCardinal
    : [/code]
    : The first copies the variable [b]value[/b] into the stack and then copies the changed value back, while the second copies the variable [b]memory location[/b] into the stack. In the second case if the function then makes a change in the variable value, it is directly changed in the original variable. For example:
    : [code]
    : 1 procedure Change(var v: cardinal);
    : 2 begin
    : 3 v := 6;
    : 4 end;
    :
    : var
    : j: cardinal;
    : begin
    : 5 j := 1;
    : 6 Change(j);
    : 7 end;
    : [/code]
    : Here is how this code is handled:
    : [code]
    : Value in j Value in v
    : 5 1 Undefined
    : 6 1 Undefined
    : 2 1 1
    : 3 1 6
    : 4 1 6
    : 7 6 Undefined
    : [/code]
    : Here is how pointer variable is handled:
    : [code]
    : 1 procedure Change(v: PCardinal);
    : 2 begin
    : 3 v^ := 6;
    : 4 end;
    :
    : var
    : j: cardinal;
    : begin
    : 5 j := 1;
    : 6 Change(@j);
    : 7 end;
    : [/code]
    : As you can see it's nearly the same code.
    : [code]
    : Value in j Value in v
    : 5 1 Undefined
    : 6 1 Undefined
    : 2 1 $0055A36B
    : 3 6 $0055A36B
    : 4 6 $0055A36B
    : 7 6 Undefined
    : [/code]
    : But the values in the variables are completely different. This is because a pointer parameter is [b]not[/b] the same as a variable parameter.
    : In C++ a asterix (*) behind a variable type denotes a pointer of the type specified.
    :
    Oh, I'm realy thank you for your patience.
    But, When I run your code, I get the same error again at run time:
    'Access Violation ...'

    I can send the (MyLib.DLL and MyLib.h) for you.If you are agree, please show me a communication channel like email or etc!
    Otherwise, Do you have any suggestion for me?
    Thanks again
  • : : : : : : : : : Hi
    : : : : : : : : : I have a DLL file, say MyLib.dll, which contains some API commands and functions.
    : : : : : : : : : But I know in this library, there are some functions such as Func1,Func2 and etc.
    : : : : : : : : : Also, I have the API representation ( or C++ defination) of these functions such as follows:
    : : : : : : : : :
    : : : : : : : : : pdtErr Func1
    : : : : : : : : : (
    : : : : : : : : : pdtHandle Handle
    : : : : : : : : : );
    : : : : : : : : :
    : : : : : : : : : or
    : : : : : : : : : pdtErr Func2
    : : : : : : : : : (
    : : : : : : : : : PdtHandle Handle,
    : : : : : : : : : PdtCaptureMode* pMode
    : : : : : : : : : );
    : : : : : : : : :
    : : : : : : : : : Note that, I have also the C++ header file of it (MyLib.h) and the library format file (MyLib.Lib), but I want to use this DLL file in Delphi.
    : : : : : : : : : Could you please tell me how I can do this work?
    : : : : : : : : : Thanks
    : : : : : : : : :
    : : : : : : : : In your program, you need to reproduce the function headers, and all the associating types:
    : : : : : : : : [code]
    : : : : : : : : type
    : : : : : : : : pdtErr = SomeTypeDefinition;
    : : : : : : : : PdtCaptureMode = SomeTypeDefinition;
    : : : : : : : :
    : : : : : : : : function Func1(Handle: THandle): pdtErr; cdecl; external 'MyLib.dll';
    : : : : : : : : function Func2(Handle: THandle; pMode: PdtCaptureMode): pdtErr; cdecl; external 'MyLib.dll';
    : : : : : : : : [/code]
    : : : : : : : : Now you can use those functions as if they are written in your program.
    : : : : : : : : Note: The cdecl directive makes sure that Delphi treats them as C functions instead of Pascal functions. Often it is better to use the StdCall in both the program as well as the library.
    : : : : : : : : Also this code will not unless you define those two types based on the header of the library, but it should get you started.
    : : : : : : : :
    : : : : : : :
    : : : : : : : Thanks. But in the C header file(MyLib.h) there are many types such as the two cases below:
    : : : : : : : //---------------------------------------------------------------------
    : : : : : : : typedef enum
    : : : : : : : {
    : : : : : : : errSuccess = 0,
    : : : : : : : errBadParameter = 1,
    : : : : : : : errBadHandle = 2,
    : : : : : : : __err_force_32 = 0xFFFFFFFF
    : : : : : : :
    : : : : : : : } PdtErr;
    : : : : : : :
    : : : : : : : /----------------------------------------------------------------------
    : : : : : : : typedef struct
    : : : : : : : {
    : : : : : : : //----- In -----
    : : : : : : :
    : : : : : : : void* Buffer;
    : : : : : : : unsigned long BufferSize;
    : : : : : : : void* Context[4];
    : : : : : : : unsigned long _reserved1[8];
    : : : : : : :
    : : : : : : : PdtErr Status;
    : : : : : : :
    : : : : : : : unsigned long _reserved2[30];
    : : : : : : :
    : : : : : : : } PdtFrame;
    : : : : : : : //---------------------------------------------------------------------
    : : : : : : :
    : : : : : : : Now,Could you please tell me, how I can define these types in Delphi?
    : : : : : : : And the next question is: Is there any easier way to do this works? (This way is very complicated as the header file is too big!!!)
    : : : : : : : (This Library is written for acquiring images from a digital camera. I want to send it for you. So, Please send me your email)
    : : : : : : :
    : : : : : : : Thanks
    : : : : : : :
    : : : : : : Here are two ways of defining the pdtErr:
    : : : : : : [code]
    : : : : : : type
    : : : : : : PdtErr = (errSuccess, errBadParameter, errBadHandle);
    : : : : : :
    : : : : : : // or
    : : : : : :
    : : : : : : type
    : : : : : : PdtErr = type cardinal;
    : : : : : :
    : : : : : : const
    : : : : : : errSuccess = 0;
    : : : : : : errBadParameter = 1;
    : : : : : : errBadHandle = 2;
    : : : : : : errForce32 = $FFFFFFFF;
    : : : : : : [/code]
    : : : : : : I would suggest the second method, because the first one cannot handle the _err_force_32 value.
    : : : : : : [code]
    : : : : : : type
    : : : : : : PdtFrame = record
    : : : : : : Buffer: pointer; (void*)
    : : : : : : BufferSize: cardinal; (unsigned long)
    : : : : : : Context: array[0..3] of pointer;
    : : : : : : reserved1: array[0..7] of cardinal;
    : : : : : : Status: PdtErr;
    : : : : : : reserved2: array[0..29] of cardinal;
    : : : : : : end;
    : : : : : : [/code]
    : : : : : : I cannot make the time to completely convert the header file. But based on this you might already convert some things yourself.
    : : : : : :
    : : : : : Thanks.
    : : : : : The First Try:
    : : : : :
    : : : : : In the MyLib.dll, there is a function as follows:
    : : : : : [code]
    : : : : : unsigned long PdListCameras
    : : : : : (
    : : : : : PdtCamListItem* Plist,
    : : : : : unsigned long ListLength,
    : : : : : unsigned long* pConnectedNum
    : : : : :
    : : : : : );
    : : : : : [/code]
    : : : : : This function lists cameras using Camera driver on my system.
    : : : : : The parameters of this function are described bellow:
    : : : : :
    : : : : : plist: Array of PdtCamListItem;
    : : : : : ListLength:Length of plist array
    : : : : : pConnectedNum:Number of cameras found.Maybe greater than listLength. NULL pointer is allowed.
    : : : : :
    : : : : :
    : : : : : Also,The defination of PdtCamListItem exists in the C header file (MyLib.h):
    : : : : : [code]
    : : : : : typedef struct
    : : : : : {
    : : : : : unsigned long UniqueId;
    : : : : : char SerialString[32];
    : : : : : unsigned short PartNumber;
    : : : : : unsigned short PartVersion;
    : : : : : unsigned long InUse;
    : : : : : } PdtCamListItem;
    : : : : : [/code]
    : : : : : Here, there is an example in C++ which uses this function:
    : : : : : [code]
    : : : : : PdtCamListItem list[10];
    : : : : : unsigned long numCameras;
    : : : : :
    : : : : : numCameras=PdListCameras(list,10,NULL);
    : : : : : [/code]
    : : : : : I tried to translate the above code into Delphi such as follows:
    : : : : : [code]
    : : : : : type
    : : : : : pdtCamListItem=record
    : : : : : UniqueId:LongInt;
    : : : : : SerialString:array[0..20] of char;
    : : : : : PartNumber:word;
    : : : : : PartVersion:word;
    : : : : : InUse:Cardinal;
    : : : : : end;
    : : : : :
    : : : : : implementation
    : : : : :
    : : : : : {$R *.dfm}
    : : : : : function PdListCameras(var pList:pdtCamListItem;ListLength:cardinal;var PConnectedNum:cardinal):cardinal; cdecl; external 'MyLib.dll';
    : : : : :
    : : : : : procedure TForm1.Button1Click(Sender: TObject);
    : : : : : var item: pdtCamListItem;
    : : : : : s:cardinal;
    : : : : : begin
    : : : : : s:=PdListCameras(item,10,NULL);
    : : : : : end;
    : : : : : [/code]
    : : : : : But the mentioned code rises this exception:
    : : : : : "Access Violation at address 0012F598"
    : : : : : Now, whats the wrong?
    : : : : :
    : : : : :
    : : : : Well, SerialString has 32 elements in the C++ code, while it only has 21 elements in the Delphi code. A description of an array declaration in Delphi is this:
    : : : : [code]
    : : : : ArrayVariableName: array[LowestIndex..HighestIndex] of VariableType
    : : : : [/code]
    : : : : UniqueID is described as a unsigned long in the C++ code, while Delphi's LontInt is a "signed long".
    : : : : As for the actual call: item is only 1 element in a list. The C++ call example used an 10-element array of items. C++ NULL is in Delphi "nil".
    : : : :
    : : : Excuse Me, But the problem is still remained!!!
    : : :
    : : : The New Code:
    : : : [code]
    : : : type
    : : : pdtCamListItem=record
    : : : UniqueId:Cardinal;
    : : : SerialString:array[0..32] of char;
    : : : PartNumber:word;
    : : : PartVersion:word;
    : : : InUse:Cardinal;
    : : : end;
    : : :
    : : : implementation
    : : :
    : : : {$R *.dfm}
    : : : function PdListCameras(var pList:array of pdtCamListItem;ListLength:cardinal;var PConnectedNum:cardinal):cardinal; cdecl; external 'MyLib.dll';
    : : :
    : : : procedure TForm1.Button1Click(Sender: TObject);
    : : : var item:array [0..10] of pdtCamListItem;
    : : : w,s:Cardinal;
    : : : begin
    : : : s:=PdListCameras(item,10,w);
    : : : end;
    : : : [/code]
    : : :
    : : : When I run this code, I get the following error:
    : : : [code]
    : : : Access Viloation at address 10003DB0 in module 'Mylib.dll'
    : : : [/code]
    : : :
    : : : Now, what is the problem?!!!!
    : : :
    : : : [code]
    : : : type
    : : : TdtCamListItem=record
    : : : UniqueId:Cardinal;
    : : : SerialString:array[0..31] of char;
    : : : PartNumber:word;
    : : : PartVersion:word;
    : : : InUse:Cardinal;
    : : : end;
    : : [red]: PCardinal = ^Cardinal[/red]
    : :
    : : : implementation
    : : :
    : : : {$R *.dfm}
    : : : function PdListCameras([red]dtList: pointer;[/red] ListLength: cardinal;[red] PConnectedNum:PCardinal[/red]): cardinal; cdecl; external 'MyLib.dll';
    : : :
    : : : procedure TForm1.Button1Click(Sender: TObject);
    : : : var item:array [0..9] of TdtCamListItem;
    : : : w,s:Cardinal;
    : : : begin
    : : : s:=PdListCameras([red]@[/red]item,10,[red]@[/red]w);
    : : : end;
    : : : [/code]
    : : :
    : : :
    : : The red bits show what I've changed.
    : :
    : : These two pieces of code are completely different:
    : : [code]
    : : var PConnectedNum:cardinal
    : : [/code]
    : : and
    : : [code]
    : : PConnectedNum:PCardinal
    : : [/code]
    : : The first copies the variable [b]value[/b] into the stack and then copies the changed value back, while the second copies the variable [b]memory location[/b] into the stack. In the second case if the function then makes a change in the variable value, it is directly changed in the original variable. For example:
    : : [code]
    : : 1 procedure Change(var v: cardinal);
    : : 2 begin
    : : 3 v := 6;
    : : 4 end;
    : :
    : : var
    : : j: cardinal;
    : : begin
    : : 5 j := 1;
    : : 6 Change(j);
    : : 7 end;
    : : [/code]
    : : Here is how this code is handled:
    : : [code]
    : : Value in j Value in v
    : : 5 1 Undefined
    : : 6 1 Undefined
    : : 2 1 1
    : : 3 1 6
    : : 4 1 6
    : : 7 6 Undefined
    : : [/code]
    : : Here is how pointer variable is handled:
    : : [code]
    : : 1 procedure Change(v: PCardinal);
    : : 2 begin
    : : 3 v^ := 6;
    : : 4 end;
    : :
    : : var
    : : j: cardinal;
    : : begin
    : : 5 j := 1;
    : : 6 Change(@j);
    : : 7 end;
    : : [/code]
    : : As you can see it's nearly the same code.
    : : [code]
    : : Value in j Value in v
    : : 5 1 Undefined
    : : 6 1 Undefined
    : : 2 1 $0055A36B
    : : 3 6 $0055A36B
    : : 4 6 $0055A36B
    : : 7 6 Undefined
    : : [/code]
    : : But the values in the variables are completely different. This is because a pointer parameter is [b]not[/b] the same as a variable parameter.
    : : In C++ a asterix (*) behind a variable type denotes a pointer of the type specified.
    : :
    : Oh, I'm realy thank you for your patience.
    : But, When I run your code, I get the same error again at run time:
    : 'Access Violation ...'
    :
    : I can send the (MyLib.DLL and MyLib.h) for you.If you are agree, please show me a communication channel like email or etc!
    : Otherwise, Do you have any suggestion for me?
    : Thanks again
    :
    My knowledge of C++ is very limited. This is already stretching the limits of my knowledge. In this case, I'm unsure of why that error keeps occuring. Somewhere in the function the DLL expects to find an initialized pointer, but your code hasn't assigned it yet. It could be that the DLL expects a linked-list instead of an array, but I cannot find that in the structures. I don't think that sending me the headers will help. Perhaps there is someone in the C++ boards, who can help you.
Sign In or Register to comment.

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Categories