排除Delphi5中編寫COM+程式的一個錯誤 (轉)
在5中編寫COM+時總獲得不到Context
也就是GetObjectContext返回nil. 這使事物處理沒法正確
完成. 有人在網上告訴我在COM+元件前加上一條載入mtxex.dll
語句.確實解決了這個問題, 但好像執行的並不穩定.
procedure TgEntityObj.Initialize;
begin
inherited;
LoadLibrary('mtxex.dll');
end;
但我在Delphi6中不加這條語句就可以獲得ObjectContext.
我看了D6中的MTX單元和D5果然不一樣, 這也不能怪Borland
D5出來的時候(COM+)還沒出來所以D5中MTX單位中還是載入
MTS的寫法.
在D5 MTX單元中253行.
implementation
uses ComObj;
type
TGetObjectContextProc = function(var ObjectContext: IObjectContext): HRESULT; cdecl;
TSafeRefProc = function(const rid: TGUID; Unk: IUnknown): Pointer; cdecl;
var
GetObjectContextProc: TGetObjectContextProc = nil;
SafeRefProc: TSafeRefProc = nil;
MtsProcsLoaded: Boolean = False;
procedure LoadMtsProcs;
var
Mtxdll: HModule;
begin
if MtsProcsLoaded then Exit;
MtsProcsLoaded := True;
Mtxdll := GetModuleHandle('mtxex.dll');
if mtxdll <> 0 then
begin
@GetObjectContextProc := GetProcAddress(Mtxdll, 'GetObjectContext');
@SafeRefProc := GetProcAddress(Mtxdll, 'SafeRef');
end;
end;
function GetObjectContext: IObjectContext;
begin
LoadMtsProcs;
if Assigned(GetObjectContextProc) then
OleCheck(GetObjectContextProc(Result))
else
Result := nil; //單步時返回空.
end;
D6中的MTX單元 注意不同.
implementation
uses ComObj;
type
TGetObjectContextProc = function(var ObjectContext: IObjectContext): HRESULT; cdecl;
///
TCoGetObjectContextProc = function(const riid: TGUID; var ObjectContext: IObjectContext): HRESULT; stdcall;
TSafeRefProc = function(const rid: TGUID; Unk: IUnknown): Pointer; cdecl;
var
GetObjectContextProc: TGetObjectContextProc = nil;
CoGetObjectContextProc: TCoGetObjectContextProc = nil; ///
SafeRefProc: TSafeRefProc = nil;
MtsProcsLoaded: Boolean = False;
function ImPlusPlatform: boolean; ////// 是否為COM+
var
Ver: TOsVersionInfo;////
begin
Ver.dwOSVersionInfoSize := sizeof(Ver);////
GetVersionEx(Ver);
if (Ver.dwPlatfoD = VER_PLATFORM__NT) and///
(Ver.dwMajorVersion >= 5) then////
Result := true //
else Result := false;
end; //////
procedure LoadMtsProcs;
var
Mtxdll: HModule;
begin
if MtsProcsLoaded then Exit;
MtsProcsLoaded := True;
if IsComPlusPlatfothen ////
begin
Mtxdll := GetModuleHandle('ole32.dll'); ///
if mtxdll <> 0 then ///
@CoGetObjectContextProc := GetProcAddress(Mtxdll, 'CoGetObjectContext');
end ///
else
begin
Mtxdll := GetModuleHandle('mtxex.dll');
if mtxdll <> 0 then
begin
@GetObjectContextProc := GetProcAddress(Mtxdll, 'GetObjectContext');
@SafeRefProc := GetProcAddress(Mtxdll, 'SafeRef');
end;
end;
end;
function GetObjectContext: IObjectContext;
const
IID_IObjectContext: TGUID = '{51372AE0-CAE7-11CF-BE81-00AA00A2FA25}'; ///
begin
LoadMtsProcs;
if Assigned(CoGetObjectContextProc) then ///
CoGetObjectContextProc(IID_IObjectContext, Result) ///
else if Assigned(GetObjectContextProc) then
OleCheck(GetObjectContextProc(Result))
else
Result := nil;
end;
加斜細的是多的部分你只需要把這些部加D5的MTX就可以了.然後另存到你的當前目錄
編譯程式就能獲得ObjectContext了.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990466/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 編寫 SQL 程式碼時常犯的九個錯誤SQL
- 用VB編寫COM+應用時碰到問題? (轉)
- Windows10系統開啟com+程式彈出編錄錯誤提示如何解決Windows
- C#中寫簡單的COM+元件C#元件
- 你是一個編寫可除錯程式碼的程式設計師嗎?除錯程式設計師
- 編寫第一個Qt程式QT
- 經典的編譯錯誤 (轉)編譯
- 編寫優質無錯程式碼(2) (轉)
- 編寫優質無錯程式碼(3) (轉)
- 編寫優質無錯程式碼(1) (轉)
- 編寫你人生中第一個機器學習程式碼吧!機器學習
- win10執行com+應用程式編錄錯誤提示錯誤程式碼80040154-沒有註冊類怎麼解決Win10
- win10系統下一個重大更新將改善錯誤故障排除體驗Win10
- 編寫一個分析程式碼依賴的工具(一)
- 一個備庫中ORA錯誤資訊的分析
- 一個拖拉且錯誤的猜數字程式
- 編寫一個使用wreq庫的爬蟲程式爬蟲
- 程式設計面試中的十個常見錯誤程式設計面試
- PHP程式設計中10個最常見的錯誤PHP程式設計
- 如何編寫一個Perl爬蟲程式爬蟲
- 第一個錯誤的版本
- 初學angularJS 個人總結 & 錯誤排除AngularJS
- mysql 一個錯誤MySql
- Java程式設計師在寫SQL程式時候常犯的10個錯誤Java程式設計師SQL
- 用程式設定COM+應用程式的屬性。 (轉)
- 編寫易讀的程式碼 (轉)
- 專案中的一個AOP的編寫案例(配置+案例)
- COM+安裝時出現錯誤" typelib不能載入"
- 編寫一個程式求輸入字串的長度字串
- 用Java編寫一個最簡單的桌面程式Java
- /*編寫一個程式,輸出如下圖案: * *** ***** ******* ***** *** * */
- 編寫第一個HADOOP應用程式Hadoop
- 精讀《手寫 SQL 編譯器 - 錯誤提示》SQL編譯
- COM+物件池元件崩潰除錯手記 (轉)物件元件除錯
- 串列埠通訊常見的錯誤和故障排除方法串列埠
- oracle錯誤一覽(轉)Oracle
- 一個java中呼叫bash指令碼錯誤的診斷Java指令碼
- Winsock錯誤程式碼一覽表 (轉)