次部署使用SuperMap iObjects .NET的開發(fā)人員,可能遇到以下問題:
1.環(huán)境部署不成功
2.部署成功了,VS工具箱里面沒有SuperMap相關(guān)控件
3.工具箱里面的SuperMap相關(guān)控件拖到界面上報(bào)錯(cuò)
4.運(yùn)行程序,報(bào)錯(cuò)未能加載文件或程序集
下面我們將對上述問題來使用“套路”一一解決。
大前提: 很多用戶喜歡在工具箱里面拖控件使用,可視化的管理控件的屬性,但遇到了上面所述
的問題不知道如何解決,這里我們先說一個(gè)“大前提”,要想使用工具箱里面的控件,無論你的計(jì)
算機(jī)操作系統(tǒng)是32位的還是64位的,只能部署SuperMap iObjects .NET 32位的開發(fā)環(huán)境(VS的
限制,超圖也很無奈啊),這樣才能注冊工具箱。當(dāng)然,不需要通過拖控件,習(xí)慣new控件來使用
的用戶,你的計(jì)算機(jī)操作系統(tǒng)是32位的就安裝32位的SuperMap iObjects .NET,你的計(jì)算機(jī)操作
系統(tǒng)是64位的,那么部署SuperMap iObjects .NET 32位還是64位的運(yùn)行環(huán)境就任君選擇了。
一.環(huán)境部署不成功
使用Install_x86.bat/Install_x64.bat 文件來完全部署的用戶,如果部署過程中出現(xiàn)問題,解決的套路很簡單。
1.關(guān)閉所有殺毒軟件(最好連防火墻都關(guān)了)
2.關(guān)閉VS(可能會(huì)涉及到安裝Microsoft .NET Framework 4.0)
3.以管理員身份運(yùn)行Install_x86.bat/Install_x64.bat 文件
自定義部署不成功的用戶,上面的套路照樣可用,但通常出現(xiàn)問題是在注冊工具箱的時(shí)候,我們在“大前提”里面說過,要使用工具箱來拖控件,就只能部署SuperMap iObjects .NET 32位的運(yùn)行環(huán)境!所以注冊工具箱的環(huán)境,要是32位的。當(dāng)然,不需要注冊工具箱的用戶,這一點(diǎn)就可以不用關(guān)注。
二.部署成功了,VS工具箱里面沒有控件
1.工具箱右鍵---->添加選項(xiàng)卡
2.右鍵新建的選項(xiàng)卡------>選擇項(xiàng)
3.在新打開的頁面中選擇.NET Framework組件,點(diǎn)擊瀏覽,找到SuperMap iObjects .NET 目錄下32位bin包(x86)的SuperMap.UI.Controls.dll,SuperMap.Mapping.dll,SuperMap.Layout.dll,SuperMap.Realspace.dll,SuperMap.Data.dll,添加后點(diǎn)擊確定。
4.此時(shí)看看我們的工具箱,是不是就有了相關(guān)控件了
三.工具箱里面的控件拖到界面上報(bào)錯(cuò)
這個(gè)問題的解決辦法是把SuperMap iObjects .NET 目錄下32位的Bin包路徑加在環(huán)境變量中
具體操作如下:
1.打開計(jì)算機(jī)
2.點(diǎn)擊系統(tǒng)屬性
3.點(diǎn)擊高級系統(tǒng)設(shè)置
4.點(diǎn)擊環(huán)境變量
5.雙擊系統(tǒng)變量中的path變量
6.然后找到SuperMap iObjects .NET組件目錄下的32位bin包路徑,加在系統(tǒng)環(huán)境變量path中(沒有的話就新建一個(gè)path)
瞬間搞定問題
四.運(yùn)行程序,報(bào)錯(cuò)未能加載文件或程序集
上面這種錯(cuò)誤,解決辦法如下:
1.把你引用的dll文件所在bin包目錄添加到環(huán)境變量中,具體方法上面已經(jīng)說過了。
2.確認(rèn)你的許可是否有你所用到的功能模塊,一般試用許可會(huì)包含所有的功能模塊,而正式許可不一定包含全部的功能模塊,具體檢查方法如下:
(1)打開許可中心
(2)在許可狀態(tài)中查看有哪些模塊以及許可是否已經(jīng)過期
3.如果使用的場景的功能,計(jì)算機(jī)顯卡不支持的話,也會(huì)拋出這個(gè)異常。一個(gè)簡單的檢驗(yàn)辦法就是打開桌面軟件(SuperMap iDesktop),看三維功能是否能正常使用。
還有一種運(yùn)行程序比較常見的錯(cuò)誤是:未能加載文件或程序集 ‘SuperMap. Version=***’ 或者它的某一個(gè)依賴項(xiàng)。試圖加載格式不正確的程序’
解決辦法如下:
第一,保證編譯目標(biāo)平臺(tái)位數(shù)和引用的dll文件動(dòng)態(tài)庫位數(shù)保持一致
具體操作:
1.選中工程,右鍵選擇屬性
2.選擇一致的目標(biāo)平臺(tái)
第二,環(huán)境變量中只有一個(gè)組件bin路徑,且與引用動(dòng)態(tài)庫路徑保持一致,具體的查看和修改方法上面已經(jīng)說過,這里不再贅述。
第三,把工程的工作目錄和引用路徑設(shè)置為引用動(dòng)態(tài)庫路徑,這一點(diǎn)可以用來檢測出現(xiàn)的問題是否跟環(huán)境變量有關(guān)。設(shè)置好了之后,程序能夠運(yùn)行起來,說明問題就出在環(huán)境變量上,還是不能運(yùn)行起來的話,就不用糾結(jié)環(huán)境變量了,問題不在這上面,得找找其它原因。
第四,選擇合適的.NET Framework框架,SuperMap iObjects .NET 6R版本,得選擇.NET Framework 3.5及以下,SuperMap iObjects .NET 7C,8C版本,得選擇.NET Framework 4.0及以上。
以上就是解決此類問題的“套路”,有了這些“套路”,此類問題就可以對癥下藥,迎刃而解了。
果以上方法都解決不了你的問題,看看以下網(wǎng)友給出的解決辦法: 修改筆記本鍵盤的驅(qū)動(dòng):通過“我的電腦”打開系統(tǒng)屬性,選擇硬件標(biāo)簽:打開設(shè)備管理器,我們發(fā)現(xiàn)中文Windows XP操作系統(tǒng)下,默認(rèn)的鍵盤驅(qū)動(dòng)是“標(biāo)準(zhǔn)101/102鍵或Microsoft自然PS/2鍵盤”。 1. 右鍵點(diǎn)擊選擇更新驅(qū)動(dòng)程序,會(huì)出現(xiàn)硬件更新向?qū)В哼x擇“從列表或指定位置安裝(高級)”,單擊“下一步”,選擇“不要搜索。我要自己選擇要安裝的驅(qū)動(dòng)程序。” 單擊“下一步”,進(jìn)入“選擇要為此硬件安裝的設(shè)備驅(qū)動(dòng)程序”頁去掉復(fù)選框“顯示兼容硬件”前的小勾。在“標(biāo)準(zhǔn)鍵盤型號(hào)”欄中選擇“Japanese PS/2 Keyboard (106/109 Key)”,單擊“下一步”,彈出“更新驅(qū)動(dòng)程序警告”,點(diǎn)“是”。“確認(rèn)設(shè)備安裝”窗口繼續(xù)點(diǎn)“是”。 2. 完成硬件更新向?qū)АV匦聠?dòng)計(jì)算機(jī)。 修改注冊表:單擊“開始”菜單,點(diǎn)“運(yùn)行”,輸入“regedit”,打開注冊表,進(jìn)入“HKEY_LOCAL_MACHINE\ SYSTEM\ControlSet001\Control\Keyboard Layouts”,里面有很多子項(xiàng),通過觀察我發(fā)現(xiàn),以“0804”結(jié)尾的都是簡體中文輸入法。打開“E00E0804”,可以看到右側(cè)子項(xiàng)里有“Layout File”子項(xiàng),雙擊打開該項(xiàng),將“數(shù)值數(shù)據(jù)”中的“kbdus.dll”改為“kbdjpn.dll”,“確定”即可。依此類推,可以將所有的以“0804”結(jié)尾的子項(xiàng)中“Layout File”全部改為“kbdjpn.dll”,具體就根據(jù)自己常用的輸入法進(jìn)行選擇了。然后重新啟動(dòng)計(jì)算機(jī)就好了! 造成筆記本電腦鍵盤失靈的原因非常多,比較常見的就是最開始為大家介紹的那兩種,另外有些電腦病毒也會(huì)破壞電腦按鍵,建議大家遇到筆記本電腦鍵盤按鍵失靈先對電腦進(jìn)行殺毒看看,然后在再使用以上方法解決問題。
Qt 中,可以在 DLL 中創(chuàng)建和顯示窗口。
首先,在 DLL 項(xiàng)目中需要添加如下的頭文件和代碼:
#include <QWidget>
#include <QVBoxLayout>
class MyWidget : public QWidget
{
public:
MyWidget(QWidget* parent=nullptr)
: QWidget(parent)
{
QVBoxLayout* layout=new QVBoxLayout(this);
QLabel* label=new QLabel("Hello from DLL", this);
layout->addWidget(label);
}
};
上述代碼定義了一個(gè)名為 MyWidget 的 QWidget 子類,并在構(gòu)造函數(shù)中添加了一個(gè)垂直布局和一個(gè)標(biāo)簽。
然后,在 DLL 中需要添加一個(gè)新的導(dǎo)出函數(shù),用于創(chuàng)建和顯示窗口。該函數(shù)的實(shí)現(xiàn)如下:
#include "MyWidget.h"
void __declspec(dllexport) createAndShowWindow()
{
QApplication app(__argc, __argv);
MyWidget* widget=new MyWidget();
widget->show();
app.exec();
}
上述代碼創(chuàng)建了一個(gè) QApplication 對象,創(chuàng)建了一個(gè) MyWidget 對象,并調(diào)用 show() 方法來顯示窗口。最后調(diào)用 exec() 方法進(jìn)入事件循環(huán)。
在主程序中,可以使用 QLibrary 類來加載 DLL 并調(diào)用導(dǎo)出函數(shù)。代碼示例如下:
QLibrary lib("mydll.dll");
if (lib.load())
{
typedef void (*Func)();
Func createAndShowWindow=reinterpret_cast<Func>(lib.resolve("createAndShowWindow"));
if (createAndShowWindow)
{
createAndShowWindow();
}
else
{
qDebug() << "Failed to resolve function";
}
lib.unload();
}
else
{
qDebug() << "Failed to load DLL";
}
上述代碼使用 QLibrary 類加載 DLL,然后通過 resolve() 方法獲取導(dǎo)出函數(shù)的地址,并轉(zhuǎn)換為函數(shù)指針類型。最后調(diào)用該函數(shù)即可顯示窗口。
需要注意的是,在主程序中使用 QLibrary 加載 DLL 時(shí),需要確保 DLL 文件的路徑正確,并且 DLL 文件和主程序的架構(gòu)一致(如都為 x64 或 x86)。
另外,因?yàn)樵?DLL 中創(chuàng)建了 QApplication 對象,因此需要確保主程序中沒有創(chuàng)建過 QApplication 對象,否則會(huì)發(fā)生錯(cuò)誤。可以將主程序中的 QApplication 對象創(chuàng)建部分放置到 DLL 中的導(dǎo)出函數(shù)中。
*請認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。