Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
ad72823e
Commit
ad72823e
authored
Jan 11, 2005
by
Bill Medland
Committed by
Alexandre Julliard
Jan 11, 2005
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Minor typo correction and term expansion changes.
parent
8a46494e
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
15 additions
and
11 deletions
+15
-11
ole.sgml
documentation/ole.sgml
+15
-11
No files found.
documentation/ole.sgml
View file @
ad72823e
...
...
@@ -395,7 +395,7 @@ static ICOM_VTABLE(IDirect3D) d3dvt = {
<para>
The answer is of course that COM doesn't assume that objects actually
are thread-safe. Most real-world objects aren't, in fact, for various
reasons. What these reasons are isn't too important here, though
,
it's
reasons. What these reasons are isn't too important here, though
;
it's
just important to realize that the problem of thread-unsafe objects is
what COM tries hard to solve with its apartment model. There are also
ways to tell COM that your object is truly thread-safe (namely the
...
...
@@ -439,7 +439,9 @@ static ICOM_VTABLE(IDirect3D) d3dvt = {
<para>
Very basic marshalling is easy enough to understand. You take a method
on a remote interface, copy each of its parameters into a buffer, and
on a remote interface (that is a COM interface that is
implemented on the remote computer), copy each of its
parameters into a buffer, and
send it to the remote computer. On the other end, the remote server
reads each parameter from the buffer, calls the method, writes the
result into another buffer and sends it back.
...
...
@@ -464,7 +466,8 @@ static ICOM_VTABLE(IDirect3D) d3dvt = {
<para>
RPC packets contain a buffer containing marshalled data in NDR format.
NDR is short for "Network Data Representation" and is similar the XDR
NDR is short for "Network Data Representation" and is similar
to the XDR
format used in SunRPC (the closest native equivalent on Linux to DCE
RPC). NDR/XDR are all based on the idea of graph serialization and were
worked out during the 80s, meaning they are very powerful and can do
...
...
@@ -473,12 +476,13 @@ static ICOM_VTABLE(IDirect3D) d3dvt = {
</para>
<para>
In Wine, our DCOM implementation is <emphasis>not</emphasis> based on the
In Wine, our DCOM implementation is <emphasis>not</emphasis>
currently based on the
RPC runtime, as while few programs use DCOM even fewer use
RPC directly so it was developed some time after
OLE32/OLEAUT32 were. Eventually this will have to be fixed,
otherwise our DCOM will never be compatible with
Microsofts. Bear this in mind as you read through the code
Microsoft
'
s. Bear this in mind as you read through the code
however.
</para>
</sect2>
...
...
@@ -512,8 +516,8 @@ static ICOM_VTABLE(IDirect3D) d3dvt = {
<para>
Of course, in the RPC server process at the other end, you need some way
to unmarshal the RPCs, so you have functions also generated by MIDL
which are the inverse of the proxies
:
they accept an NDR buffer, extract
the parameters, call the real function then marshal the result back.
which are the inverse of the proxies
;
they accept an NDR buffer, extract
the parameters, call the real function
and
then marshal the result back.
They are called stubs, and stand in for the real calling code in the
client process.
</para>
...
...
@@ -522,7 +526,7 @@ static ICOM_VTABLE(IDirect3D) d3dvt = {
The sort of marshalling/unmarshalling code that MIDL spits out can be
seen in dlls/oleaut32/oaidl_p.c - it's not exactly what it would look
like as that file contains DCOM proxies/stubs which are different, but
you get the idea. Proxy functions take the arguments and fee
l
them to
you get the idea. Proxy functions take the arguments and fee
d
them to
the NDR marshallers (or picklers), invoke an NdrProxySendReceive and
then convert the out parameters and return code. There's a ton of goop
in there for dealing with buffer allocation, exceptions and so on - it's
...
...
@@ -743,10 +747,10 @@ static ICOM_VTABLE(IDirect3D) d3dvt = {
<para>
In fact, the reason for the PSFactoryBuffer layer of indirection is
because
you
not all interfaces are marshalled using MIDL generated code.
because not all interfaces are marshalled using MIDL generated code.
Why not? Well, to understand <emphasis>that</emphasis>
you have to see that one of the
driving forces behind OLE and by extension DCOM was the development
driving forces behind OLE and by extension DCOM was the development
of
Visual Basic. Microsoft wanted VB developers to be first class citizens
in the COM world, but things like writing IDL and compiling them with a
C compiler into DLLs wasn't easy enough.
...
...
@@ -779,7 +783,7 @@ static ICOM_VTABLE(IDirect3D) d3dvt = {
In the case of InstallShield, it actually comes with typelibs for all
the interfaces it needs to marshal (fixme: is this right?), but they
actually use a mix of MIDL and typelib marshalling. In order to cover up
for the fact that we don't really use RPC they're all force to go via
for the fact that we don't really use RPC they're all force
d
to go via
the typelib marshaller - that's what the 1 || hack is for and what the
"Registering non-automation type library!" warning is about (I think).
</para>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment