C # услуги взаимодействия - используя C dll - void * - PullRequest
2 голосов
/ 16 марта 2012

У меня возникают проблемы при взаимодействии с DLL, написанной на C. Я не уверен, какой тип параметра поставить вместо void *

Вот так выглядит API данной DLL:

POSNET_API POSNET_STATUS __stdcall POS_SetDeviceParam  ( POSNET_HANDLE  hDevice,  
    unsigned long  paramCode,  
    void *  paramValue   
) 

вот как я пытался импортировать его в C #:

[DllImport(EXT_DLL)]
private static extern int POS_SetDeviceParam(IntPtr hDevice, int POSNET_DEV_PARAM_IP, *type* paramValue);

вместо типа, который я помещал:

[MarshalAs(UnmanagedType.LPStr)] string and other L*Str
[MarshalAs(UnmanagedType.LPArray)] char[] and other type of arrays including of type byte
IntPtr which where AllocHGlobal, GCHandle.Alloc allocated before
even preceeding the method with unsafe and type = void*, combining above alloc aso.
raw type: string, char[]...

У меня кончилисьВозможности самостоятельно.

paramValue должен иметь значение IP в следующем формате: «192.168.1.1» - так это выглядит в демонстрационной версии C:

string ip="10.33.44.6";
POS_SetDeviceParam(hDevice,POSNET_DEV_PARAM_IP,(void*)ip.c_str());

В C #код, hDevice не инициализируется - POS_SetDeviceParam должен инициализировать его с дополнительными параметрами.Любые предложения приветствуются!

Ответы [ 2 ]

0 голосов
/ 19 марта 2012

Спасибо, ребята, за все предложения, код ниже решил мою проблему!

[DllImport(EXT_DLL)]
private static extern int POS_SetDeviceParam(IntPtr hDevice, UInt32 POSNET_DEV_PARAM_IP, IntPtr paramValue);

void Test() {
     POS_SetDeviceParam(new IntPtr(), 0x00020005, Marshal.StringToHGlobalAnsi("192.168.1.1"));
}
0 голосов
/ 16 марта 2012

Вам нужно будет использовать эту подпись P / Invoke:

[DllImport(EXT_DLL)]
private static extern int POS_SetDeviceParam(
    IntPtr hDevice, 
    int paramCode, 
    IntPtr paramValue
);

Но вам придется проделать некоторую работу с этой строкой, чтобы передать ее через аргумент IntPtr paramValue.

Возможно, вы можете попробовать использовать Marshal.StringToHGlobalAnsi () , поскольку это даст вам IntPtr, который вы можете использовать.Однако, если вы используете этот метод, обязательно освободите память, как только закончите.

...