WebService 是基於 HTTP/SOAP/XML 的跨平台、跨語言遠端呼叫技術。優勢:
https://www.webservicex.net/TranslateService.asmx)TService) → Add ReferenceTService.h, WebService.h),封裝 SOAP 序列化/反序列化。#include "WebService.h" 即可使用強型別 Proxy 物件呼叫遠端方法。Translate(Language lang, String* text)Language:EnglishTOChinese, ChineseTOEnglish, EnglishTOGerman, EnglishTOFrench … 30+ 種#include "stdafx.h"
#include "WebService.h" // 自動產生的 Proxy 標頭
#using
using namespace System;
using namespace TService; // Web Reference 命名空間
int _tmain()
{
String* str = S"Hello, world!";
String* result;
TranslateService* svc = new TranslateService; // Proxy 物件
Language lang = Language::EnglishTOChinese;
result = svc->Translate(lang, str); // 同步呼叫,內部發送 SOAP HTTP POST
Console::WriteLine(S"原文: {0}", str);
Console::WriteLine(S"譯文: {0}", result);
return 0;
}
MFC Debug 版重新定義 new 運算子以追蹤記憶體洩漏,導致無法配置 Managed 物件 (gcnew/new for ref class)。
解法:在 Managed 程式碼區段暫時取消 new 宏定義:
// TranslateDlg.cpp
#include "WebService.h"
using namespace TService;
#pragma push_macro("new")
#undef new // 取消 MFC new 宏
void CTranslateDlg::OnBtnTranslate()
{
UpdateData(TRUE);
String* input = m_strInput; // CString 隱含轉換
String* output;
TranslateService* svc = new TranslateService;
Language lang = (Language)m_comboLang.GetCurSel(); // 對應枚舉
output = svc->Translate(lang, input);
m_strOutput = output; // 回填
UpdateData(FALSE);
}
#pragma pop_macro("new") // 恢復 MFC new 宏
注意:Release 版不重定義 new,無此問題;但為保險建議統一加上 #pragma push/pop_macro。
下拉選單選語言對 (英→中/日/法/德…),輸入英文,點擊翻譯,顯示結果。
/clr。BeginTranslate/EndTranslate 配合回呼,避免 UI 凍結。svcutil.exe 產生 Proxy)。完整原始碼 (Console + MFC 兩專案) 可下載參考。