GETMOBILEPOS_API BOOL GetPosResult(int * pID, LPSTR szMSID, LPSTR szLONG, LPSTR szLAT,
LPSTR szInRad,LPSTR szOutRad, LPSTR szStartAngle, LPSTR szStopAngle,
LPSTR szEndTime, LPSTR ErrCode, LPSTR szCenterLONG, LPSTR szCenterLAT);
这是VC的API函数,请问在C#中如何定义?如何调用此函数??
GETMOBILEPOS_API BOOL GetPosResult(int * pID, LPSTR szMSID, LPSTR szLONG, LPSTR szLAT,
LPSTR szInRad,LPSTR szOutRad, LPSTR szStartAngle, LPSTR szStopAngle,
LPSTR szEndTime, LPSTR ErrCode, LPSTR szCenterLONG, LPSTR szCenterLAT);
因为string类型无法匹配到LPSTR类型,对于int类型可以。如果想成功地匹配API,你应当使用LPWSTR,因为string类型是天生的宽字符集。
所以要修改的部分是API的定义。
事实上LPWSTR与BSTR能很好的转换到string。而LPSTR不行,如果你将API封装成ATL后,
通过引用COM来调用该API将不会有什么问题了。
因为.net 会负责将string类型与BSTR类型很好的转换。
事实上在引用API时,要注意人你引用的函数的参数类型要与COM支持的类型一致,否则会导致类型不匹配的问题,而且初看起来还感觉没有任何问题似的。
这个问题发生在我身上,我花了数天时间才找出原因.
先创建一个ATL库工程,然后添加一个ATL简单对象类。2
代码如下:3
//原始API定义如下,具体内容由开发决定。4
#ifndef APIS__TEST5
#define APIS__TEST6

7
GETMOBILEPOS_API BOOL GetPosResult(int * pID, LPSTR szMSID, LPSTR szLONG, LPSTR szLAT, 8
LPSTR szInRad,LPSTR szOutRad, LPSTR szStartAngle, LPSTR szStopAngle, 9
LPSTR szEndTime, LPSTR ErrCode, LPSTR szCenterLONG, LPSTR szCenterLAT)10
{11
}12
#endif13

14
//ATL简单对象类如下:15
//header file:16
// CAPI.h : CCAPI 的声明17

18
#pragma once19
#include "resource.h" // 主符号20

21

22
// ICAPI23
[24
object,25
uuid("BFF14E31-C350-433F-839D-1AA515331D75"),26
dual,helpstring("ICAPI 接口"),27
pointer_default(unique)28
]29
__interface ICAPI : IDispatch30
{31
[id(1), helpstring("方法GetPosResultA")] HRESULT GetPosResultA([in] LONG* pID, [in] BSTR szMSID, [in] BSTR szLONG, [in] BSTR szLAT, [in] BSTR szInRad, [in] BSTR szOutRad, [in] BSTR szStartAngle, [in] BSTR szStopAngle, [in] BSTR szEndTime, [in] BSTR ErrCode, [in] BSTR szCenterLONG, [in] BSTR szCenterLAT, [out,retval] LONG* result);32
};33

34

35

36
// CCAPI37

38
[39
coclass,40
threading("apartment"),41
vi_progid("testAPI.CAPI"),42
progid("testAPI.CAPI.1"),43
version(1.0),44
uuid("BE8829BB-029F-464E-8CA6-76D7159E6A71"),45
helpstring("CAPI Class")46
]47
class ATL_NO_VTABLE CCAPI : 48
public ICAPI49
{50
public:51
CCAPI()52
{53
}54

55

56
DECLARE_PROTECT_FINAL_CONSTRUCT()57

58
HRESULT FinalConstruct()59
{60
return S_OK;61
}62

63
void FinalRelease() 64
{65
}66

67
public:68

69
STDMETHOD(GetPosResultA)(LONG* pID, BSTR szMSID, BSTR szLONG, BSTR szLAT, BSTR szInRad, BSTR szOutRad, BSTR szStartAngle, BSTR szStopAngle, BSTR szEndTime, BSTR ErrCode, BSTR szCenterLONG, BSTR szCenterLAT, LONG* result);70
};71

72
//body file73
// CAPI.cpp : CCAPI 的实现74

75
#include "stdafx.h"76
#include "CAPI.h"77
#include <comutil.h>78

79
#pragma comment(lib, "comsupp.lib")80

81
// CCAPI82

83
//增加了一个参数用于处理返回值BOOL84
STDMETHODIMP CCAPI::GetPosResultA(LONG* pID, BSTR szMSID, BSTR szLONG, BSTR szLAT, BSTR szInRad,85
BSTR szOutRad, BSTR szStartAngle, BSTR szStopAngle, BSTR szEndTime,86
BSTR ErrCode, BSTR szCenterLONG, BSTR szCenterLAT, LONG* result)87
{88
char * s1 = _com_util::ConvertBSTRToString(szMSID);89
char * s2 = _com_util::ConvertBSTRToString(szLONG);90
char * s3 = _com_util::ConvertBSTRToString(szLAT);91
char * s4 = _com_util::ConvertBSTRToString(szInRad);92
char * s5 = _com_util::ConvertBSTRToString(szOutRad);93
char * s6 = _com_util::ConvertBSTRToString(szStartAngle);94
char * s7 = _com_util::ConvertBSTRToString(szStopAngle);95
char * s8 = _com_util::ConvertBSTRToString(szEndTime);96
char * s9 = _com_util::ConvertBSTRToString(ErrCode);97
char * s10 = _com_util::ConvertBSTRToString(szCenterLONG);98
char * s11 = _com_util::ConvertBSTRToString(szCenterLAT);99
*result = GetPosResult(pID,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11);100
return S_OK;101
}102

103

104

105




浙公网安备 33010602011771号