我支持旧的VS 2010 C ++视频应用程序。此应用程序称为使用C#2015(以及旧版本)编写的视频集成器。我们遇到了一个独特的问题,我已经指出将相机列表从Integrator传输到视频应用程序,其中数据字符串被截断为5087个字符。 (导致134个摄像机中只有88个被加载到视频应用程序中)我根本不熟悉C ++,所以我不完全确定我对数据对象和定义有什么其他选择。我完全认为问题出在C ++方面,因为我可以在C#Integrator代码中看到完整的传出相机列表。 (但也许我错了)
//视频应用程序代码(c ++ 2010)
deviceLibrary.h文件
//get setting extended
typedef TCHAR* (*DI_GETSETTINGEX)(HWND hParentWnd, int nParameter,LPARAM lParam);
#define DI_GETSETTINGEX_ENTRY "GetSettingEx"
class CDeviceLibrary : public CCameraWindow
{
public:
DI_GETSETTINGEX m_pGetSettingEx;
};
deviceLibrary.cpp
CDeviceLibrary::CDeviceLibrary(int nId,LPCTSTR pszName,LPCTSTR pszView,HINSTANCE hLib,HWND hWnd,LPCTSTR pszLibrary,LPCTSTR pszPropertiesString)
{
m_pGetSettingEx = (DI_GETSETTINGEX)GetProcAddress(m_hLib,DI_GETSETTINGEX_ENTRY);
}
CString CDeviceLibrary::GetSetting(int nSetting,LPARAM lParam)
{
if(m_pGetSettingEx)
return m_pGetSettingEx(AfxGetMainWnd()->m_hWnd,nSetting,lParam);
else if(m_pGetSetting)
return m_pGetSetting(nSetting,lParam);
return _T("");
}
ConfigureServers.cpp
void CConfigurationServers::LoadCameras()
{
//RIGHT HERE! THE VALUE OF strCameras only contains 5087 characters in it, when it is supposed to contain over 7000
CString strCameras = GetSetting(ParameterGetCameraList,(LPARAM)(LPCTSTR)strParameters);
}
Video Integrator代码库(C#2010,.NET 4.0)
public virtual String GetLibrarySetting(int Parameter,int lParam)
{
return GetCameraList(Marshal.PtrToStringAnsi((IntPtr)lParam));
}
virtual public String GetCameraList()
{
String CameraList = "";
try
{
if(!Connected)
Connect();
if(DeviceList.Count > 0)
{
List<BaseCamera>.Enumerator Cameras = DeviceList.GetEnumerator();
while(Cameras.MoveNext())
{
BaseCamera Camera = Cameras.Current;
int FeatureFlags = (int)CameraFlags.FLAG_PTZ_SUPPORT | (Camera.PTZ?(int)CameraFlags.FLAG_PTZ:0) |
(int)CameraFlags.FLAG_AUDIO_SUPPORT | (Camera.AudioIn?(int)CameraFlags.FLAG_AUDIO:0) |
(int)CameraFlags.FLAG_MIKE_SUPPORT |
(Camera.RecordNotSupported ? (int)CameraFlags.FLAG_NO_RECORD_SUPPORT | (int)CameraFlags.FLAG_NO_RECORD : 0);
CameraList += String.Format("{0};{1};{2}\n", Camera.Title.Length > 0 ? Camera.Title : Camera.Name, Camera.CameraId, FeatureFlags);
}
}
}
catch(Exception e)
{
LogException(e.Message);
}
return CameraList;
}
我不是这些应用程序中的任何一个的原始创建者。如果你问我&#34;你为什么这样做......&#34;问题,我不知道答案是什么。如果你们中的任何人都知道可以无缝替换这个解决方案的解决方案,并找回我正在寻找的完整字符串,非常棒。如果您看到为什么我只将原始字符列表的一部分接收到视频应用程序中,请告诉我原因。谢谢!
注意:我在这篇文章中删除了数百行代码。代码库非常庞大。
传递的示例文本,以及如何在C ++属性中截断它:
C001-P100--1-SeeTec(Peliquin); 4611967493405284623; 2293760 C001-P100 - SeeTec(Peliquin); 4611967493405284639; 2293760 C002-P100--1-SeeTec(Peliquin); 4611967493405284632; 2293760 C002-P100 - SeeTec(Peliquin); 4611967493405284646; 2293760 C003-P100--1-SeeTec(Peliquin); 4611967493405284660; 2293760 C003-P100 - SeeTec(Peli&#34;
答案 0 :(得分:0)
Arg ...事实证明,C ++不能(至少在我们的应用程序中)直接调用C#应用程序。它需要一个中间的应用程序在两种语言之间进行某种转换。我在我们的系统中追踪了一个微小的c ++应用程序,该程序引用了两种语言相互通信,其中包含以下代码:
wchar_t* ConvertToCharW(String^ Input)
{
static wchar_t ch[5001]=L""; //TODO: make dynamic so no String^ length limit
try
{
ch[0] = ch[5000] = '\0';
// Pin memory so GC can't move it while native function is called
pin_ptr<const wchar_t> wch = PtrToStringChars(Input);
wcscpy_s(ch,5000,wch);
}
catch(...)
{
}
return ch;
}
我有5000个字符的限制。由于我不知道如何在C ++中使其动态化,我将其更改为20000。