台灣最大程式設計社群網站
線上人數
1151
 
會員總數:246268
討論主題:189809
歡迎您免費加入會員
討論區列表 >> ASP >> COM+無法呼叫.Net Framework 2.0元件
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
COM+無法呼叫.Net Framework 2.0元件
價值 : 10 QP  點閱數:1345 回應數:5
樓主

Dylan
門外漢
0 3
500 2
發送站內信

我在Windows2003server 32位元裡有一個ASP網站使用VB6開發的dll呼叫.Net Framework 2.0開發的dll,.Net Framework 2.0開發的dll讀取registry裡的值作為SQL connection string,有用2.0 SDK regasm註冊.Net Framework 2.0開發的dll (Regasm d:\dll\abc.dll ),一切正常使用;但是到了Windows2008server 32位元上就會出現”此處需要物件”,檢查過registry裡有註冊成功,也有開放權限給everyone,
確定是VB6開發的dll呼叫不到.Net Framework 2.0開發的dll,請問有甚麼方法可以解決

本篇文章發表於2013-07-23 01:34
1樓
回應

老頑童
捐贈 VP 給 老頑童 檢舉此回應
若是照你說的流程
由ASP呼叫VB6寫的dll,再由VB6寫的dll呼叫.Net Framework 2.0開發的dll
此時顯示”此處需要物件”,這是ASP的錯誤訊息
代表應該是讓ASP呼叫的那個VB6寫的dll物件無法建立,而不是.Net Framework 2.0開發的dll
若是.Net Framework 2.0開發的dll有問題,應該會顯示VB6那個dll埵菢q的錯誤訊息才對
本篇文章回覆於2013-07-23 09:39
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

Dylan
檢舉此回應
老頑童,謝謝您
我有試著在VB6的Dll裡直接寫死connectString,ASP抓得到VB6 Dll (Application("Dstr")=sendObj.ConnString("Default"))
但是用呼叫.Net的元件的方式(Application("ConnStringSysDllaspZ")=sendobj.ConnStringSysDllaspZ)卻會出現'800a01a8 Object Required'
,所以我覺得是VB6呼叫不到.Net元件

在.Net Framework 2.0組態設定裡也有新增成功

ASP(global.asa):
<OBJECT RUNAT=Server SCOPE=Session ID=sendObj PROGID="xyz.tran"></OBJECT>
<SCRIPT LANGUAGE="vbscript" RUNAT="Server">
Sub Application_onStart()
Application("Dstr")=sendObj.ConnString("Default")
Application("ConnStringSysDllaspZ")=sendobj.ConnStringSysDllaspZ
End Sub

VB6(xyz.dll tran class):
Public Function ConnString(Optional ConnName As String)

ConnString = "Provider=sqloledb;Data Source=xxx.xxx.xxx.xxx;initial Catalog=yyy;User Id=aaa;Password=bbb;"

End Function
Public Function ConnStringSysDllaspZ(Optional ConnName As String)
Dim RSysDllasp As Object

Set RSysDllasp = CreateObject("abc.Regdll")

If ConnName = "" Then
ConnStringSysDllasp = RSysDllasp.GetConnStringZ("Default")
Else
ConnStringSysDllasp = RSysDllasp.GetConnStringZ(ConnName)
End If
Set RSysDllasp = Nothing
End Function

.Net Framework 2.0(abc.dll):
Public Class Regdll
Public Function EnCode(ByVal OriStr As String) As String
Dim EnCodeString As String = ""
Dim AddString As String = ""
Dim tmpStr As String = ""
Dim Rd As New Random
Dim HeadText As String = ""

For i As Integer = 1 To Len(OriStr)
tmpStr = Mid(OriStr, i, 1)
Select Case i
Case 1
AddString = Asc("A")
Case 2
AddString = Asc("b")
Case 3
AddString = Asc("c")
Case 4
AddString = Asc("d")
Case 5
AddString = Asc("A")
Case 6
AddString = Asc("b")
Case 7
AddString = Asc("c")
Case 8
AddString = Asc("d")
Case Else
AddString = Asc("R")
End Select
EnCodeString = EnCodeString & Format("000", (Asc(tmpStr) + AddString))
Next
Return EnCodeString
End Function
Public Function GetConnStringZ(ByVal ConnName As String) As String
Dim Regkey As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\CyberBank\" & EnCode(ConnName), False)
Dim tmpStr As String = Regkey.GetValue("Conn", "")
Dim A() As String = Strings.Split(tmpStr, "-")
Dim ConnStr As String = ""

If UBound(A) > 0 Then
ConnStr = "Provider=sqloledb;Data Source=xxx.xxx.xxx.xxx;initial Catalog=yyy;User Id=aaa;Password=bbb;"
End If
Return ConnStr
End Function
End Class
本篇文章回覆於2013-07-23 16:21
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

老頑童
捐贈 VP 給 老頑童 檢舉此回應
喔..我以為是在CreateObject時出現問題
若是呼叫Function時才出錯,確實有可能是另一dll的問題

若2003Server沒問題,到2008才不行
猜測權限問題的可能性很大
或許在IIS堨把匿名登入帳號設為Administrator
使用最大權限測看看是否跟權限有關
本篇文章回覆於2013-07-23 17:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

小羊窒息
捐贈 VP 給 缺氧的羊:窒息 檢舉此回應
把dll copy到system32的目錄底下, 試試看

本篇文章回覆於2013-07-24 00:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
使用Late Binding的方式,記得要將dll註冊到GAC裡面唷
請參考以下這篇
http://www.dotblogs.com.tw/topcat/archive/2008/03/05/1187.aspx

^_^
本篇文章回覆於2013-07-26 08:42
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.