如何调用带指针的VC API函数?

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支持的类型一致,否则会导致类型不匹配的问题,而且初看起来还感觉没有任何问题似的。
这个问题发生在我身上,我花了数天时间才找出原因.

  1 None.gif 先创建一个ATL库工程,然后添加一个ATL简单对象类。
  2 None.gif代码如下:
  3 None.gif // 原始API定义如下,具体内容由开发决定。
  4 None.gif #ifndef APIS__TEST
  5 None.gif #define  APIS__TEST
  6 None.gif
  7 None.gifGETMOBILEPOS_API BOOL GetPosResult( int   *  pID, LPSTR szMSID, LPSTR szLONG, LPSTR szLAT, 
  8 None.gifLPSTR szInRad,LPSTR szOutRad, LPSTR szStartAngle, LPSTR szStopAngle, 
  9 None.gifLPSTR szEndTime, LPSTR ErrCode, LPSTR szCenterLONG, LPSTR szCenterLAT)
 10 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 11ExpandedBlockEnd.gif}

 12 None.gif #endif
 13 None.gif
 14 None.gif // ATL简单对象类如下:
 15 None.gif // header file:
 16 None.gif //  CAPI.h : CCAPI 的声明
 17 None.gif
 18 None.gif#pragma once
 19 None.gif#include  " resource.h "         //  主符号
 20 None.gif
 21 None.gif
 22 None.gif //  ICAPI
 23 None.gif [
 24 None.gif object ,
 25 None.gifuuid( " BFF14E31-C350-433F-839D-1AA515331D75 " ),
 26 None.gifdual,helpstring( " ICAPI 接口 " ),
 27 None.gifpointer_default(unique)
 28 None.gif]
 29 None.gif__interface ICAPI : IDispatch
 30 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 31InBlock.gif[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);
 32ExpandedBlockEnd.gif}
;
 33 None.gif
 34 None.gif
 35 None.gif
 36 None.gif //  CCAPI
 37 None.gif
 38 None.gif[
 39 None.gifcoclass,
 40 None.gifthreading( " apartment " ),
 41 None.gifvi_progid( " testAPI.CAPI " ),
 42 None.gifprogid( " testAPI.CAPI.1 " ),
 43 None.gifversion( 1.0 ),
 44 None.gifuuid( " BE8829BB-029F-464E-8CA6-76D7159E6A71 " ),
 45 None.gifhelpstring( " CAPI Class " )
 46 None.gif]
 47 None.gif class  ATL_NO_VTABLE CCAPI : 
 48 None.gif public  ICAPI
 49 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 50InBlock.gifpublic:
 51InBlock.gifCCAPI()
 52ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
 53ExpandedSubBlockEnd.gif}

 54InBlock.gif
 55InBlock.gif
 56InBlock.gifDECLARE_PROTECT_FINAL_CONSTRUCT()
 57InBlock.gif
 58InBlock.gifHRESULT FinalConstruct()
 59ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
 60InBlock.gifreturn S_OK;
 61ExpandedSubBlockEnd.gif}

 62InBlock.gif
 63InBlock.gifvoid FinalRelease() 
 64ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
 65ExpandedSubBlockEnd.gif}

 66InBlock.gif
 67InBlock.gifpublic:
 68InBlock.gif
 69InBlock.gifSTDMETHOD(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);
 70ExpandedBlockEnd.gif}
;
 71 None.gif
 72 None.gif // body file
 73 None.gif //  CAPI.cpp : CCAPI 的实现
 74 None.gif
 75 None.gif#include  " stdafx.h "
 76 None.gif#include  " CAPI.h "
 77 None.gif#include  < comutil.h >
 78 None.gif
 79 None.gif#pragma comment(lib,  " comsupp.lib " )
 80 None.gif
 81 None.gif //  CCAPI
 82 None.gif
 83 None.gif // 增加了一个参数用于处理返回值BOOL
 84 None.gif STDMETHODIMP CCAPI::GetPosResultA(LONG *  pID, BSTR szMSID, BSTR szLONG, BSTR szLAT, BSTR szInRad,
 85 None.gif  BSTR szOutRad, BSTR szStartAngle, BSTR szStopAngle, BSTR szEndTime,
 86 None.gif  BSTR ErrCode, BSTR szCenterLONG, BSTR szCenterLAT, LONG *  result)
 87 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 88InBlock.gifchar * s1 = _com_util::ConvertBSTRToString(szMSID);
 89InBlock.gifchar * s2 = _com_util::ConvertBSTRToString(szLONG);
 90InBlock.gifchar * s3 = _com_util::ConvertBSTRToString(szLAT);
 91InBlock.gifchar * s4 = _com_util::ConvertBSTRToString(szInRad);
 92InBlock.gifchar * s5 = _com_util::ConvertBSTRToString(szOutRad);
 93InBlock.gifchar * s6 = _com_util::ConvertBSTRToString(szStartAngle);
 94InBlock.gifchar * s7 = _com_util::ConvertBSTRToString(szStopAngle);
 95InBlock.gifchar * s8 = _com_util::ConvertBSTRToString(szEndTime);
 96InBlock.gifchar * s9 = _com_util::ConvertBSTRToString(ErrCode);
 97InBlock.gifchar * s10 = _com_util::ConvertBSTRToString(szCenterLONG);
 98InBlock.gifchar * s11 = _com_util::ConvertBSTRToString(szCenterLAT);
 99InBlock.gif*result = GetPosResult(pID,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11);
100InBlock.gifreturn S_OK;
101ExpandedBlockEnd.gif}

102 None.gif
103 None.gif
104 None.gif
105 None.gif

转载于:https://www.cnblogs.com/begincsdn/archive/2005/07/12/191669.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值