begincsdn .NET 趴趴窝
[天行健,君子以自强不息]
[天道酬勤思]

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

 12#endif
 13
 14//ATL简单对象类如下:
 15//header file:
 16// CAPI.h : CCAPI 的声明
 17
 18#pragma once
 19#include "resource.h"       // 主符号
 20
 21
 22// ICAPI
 23[
 24object,
 25uuid("BFF14E31-C350-433F-839D-1AA515331D75"),
 26dual,helpstring("ICAPI 接口"),
 27pointer_default(unique)
 28]
 29__interface ICAPI : IDispatch
 30{
 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// CCAPI
 37
 38[
 39coclass,
 40threading("apartment"),
 41vi_progid("testAPI.CAPI"),
 42progid("testAPI.CAPI.1"),
 43version(1.0),
 44uuid("BE8829BB-029F-464E-8CA6-76D7159E6A71"),
 45helpstring("CAPI Class")
 46]
 47class ATL_NO_VTABLE CCAPI : 
 48public ICAPI
 49{
 50public:
 51CCAPI()
 52{
 53}

 54
 55
 56DECLARE_PROTECT_FINAL_CONSTRUCT()
 57
 58HRESULT FinalConstruct()
 59{
 60return S_OK;
 61}

 62
 63void FinalRelease() 
 64{
 65}

 66
 67public:
 68
 69STDMETHOD(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 file
 73// 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// CCAPI
 82
 83//增加了一个参数用于处理返回值BOOL
 84STDMETHODIMP 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{
 88char * s1 = _com_util::ConvertBSTRToString(szMSID);
 89char * s2 = _com_util::ConvertBSTRToString(szLONG);
 90char * s3 = _com_util::ConvertBSTRToString(szLAT);
 91char * s4 = _com_util::ConvertBSTRToString(szInRad);
 92char * s5 = _com_util::ConvertBSTRToString(szOutRad);
 93char * s6 = _com_util::ConvertBSTRToString(szStartAngle);
 94char * s7 = _com_util::ConvertBSTRToString(szStopAngle);
 95char * s8 = _com_util::ConvertBSTRToString(szEndTime);
 96char * s9 = _com_util::ConvertBSTRToString(ErrCode);
 97char * s10 = _com_util::ConvertBSTRToString(szCenterLONG);
 98char * s11 = _com_util::ConvertBSTRToString(szCenterLAT);
 99*result = GetPosResult(pID,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11);
100return S_OK;
101}

102
103
104
105
posted on 2005-07-12 21:32  begincsdn  阅读(1088)  评论(0)    收藏  举报